diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsExtendedReachability.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsExtendedReachability.java
index c6cd9f0..b2eb6c9 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsExtendedReachability.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsExtendedReachability.java
@@ -1,27 +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.
- */
+* 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.SubTlvType;
-import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
 import org.onosproject.isis.io.util.IsisUtil;
 
 import java.util.ArrayList;
@@ -32,9 +28,7 @@
  */
 public class IsExtendedReachability extends TlvHeader implements IsisTlv {
 
-    private String neighborId;
-    private int metric;
-    private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
+    private List<NeighborForExtendedIs> neighbors = new ArrayList<>();
 
     /**
      * Creates an instance of IP external reachability TLV.
@@ -47,67 +41,20 @@
     }
 
     /**
-     * Returns neighbor ID.
+     * Adds the neighbor for extended IS instance to IS extended reachability TLV.
      *
-     * @return neighbor ID
+     * @param neighbor neighbor for extended IS instance
      */
-    public String neighborId() {
-        return neighborId;
-    }
-
-    /**
-     * Sets neighbor ID.
-     *
-     * @param neighborId neighbor ID
-     */
-    public void setNeighborId(String neighborId) {
-        this.neighborId = neighborId;
-    }
-
-    /**
-     * Returns metric.
-     *
-     * @return metric
-     */
-    public int metric() {
-        return metric;
-    }
-
-    /**
-     * Sets metric.
-     *
-     * @param metric metric
-     */
-    public void setMetric(int metric) {
-        this.metric = metric;
-    }
-
-    /**
-     * Adds the traffic engineering sub TLV to IS extended reachability TLV.
-     *
-     * @param trafEnginSubTlv traffic engineering sub TLV
-     */
-    public void addSubTlv(TrafficEngineeringSubTlv trafEnginSubTlv) {
-        this.trafEnginSubTlv.add(trafEnginSubTlv);
+    public void addNeighbor(NeighborForExtendedIs neighbor) {
+        this.neighbors.add(neighbor);
     }
 
     @Override
     public void readFrom(ChannelBuffer channelBuffer) {
-        byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES];
-        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES);
-        this.setNeighborId(IsisUtil.systemId(tempByteArray));
-        this.setMetric(channelBuffer.readUnsignedMedium());
-        while (channelBuffer.readableBytes() > 0) {
-            TlvHeader tlvHeader = new TlvHeader();
-            tlvHeader.setTlvType(channelBuffer.readByte());
-            tlvHeader.setTlvLength(channelBuffer.readByte());
-            SubTlvType tlvValue = SubTlvType.get(tlvHeader.tlvType());
-            if (tlvValue != null) {
-                this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
-                                                       channelBuffer.readBytes(tlvHeader.tlvLength())));
-            } else {
-                channelBuffer.readBytes(tlvHeader.tlvLength());
-            }
+        while (channelBuffer.readableBytes() >= IsisUtil.EIGHT_BYTES + IsisUtil.THREE_BYTES) {
+            NeighborForExtendedIs extendedIs = new NeighborForExtendedIs();
+            extendedIs.readFrom(channelBuffer);
+            this.addNeighbor(extendedIs);
         }
     }
 
@@ -128,12 +75,8 @@
      */
     private byte[] tlvBodyAsBytes() {
         List<Byte> byteList = new ArrayList<>();
-        byteList.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborId()));
-        byteList.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.metric())));
-        if (this.trafEnginSubTlv.size() > 0) {
-            for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
-                byteList.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
-            }
+        for (NeighborForExtendedIs neighbor : this.neighbors) {
+            byteList.addAll(Bytes.asList(neighbor.neighborBodyAsbytes()));
         }
         return Bytes.toArray(byteList);
     }
@@ -142,10 +85,7 @@
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .omitNullValues()
-                .add("neighborId", neighborId)
-                .add("metric", metric)
-                .add("trafEnginSubTlv", trafEnginSubTlv)
+                .add("neighbors", neighbors)
                 .toString();
     }
-
-}
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
new file mode 100644
index 0000000..88b8462
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
@@ -0,0 +1,142 @@
+/*
+ * 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.SubTlvType;
+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 IS extended reachability neighbors.
+ */
+public class NeighborForExtendedIs {
+
+    private String neighborId;
+    private int metric;
+    private List<TrafficEngineeringSubTlv> teSubTlv = new ArrayList<>();
+
+    /**
+     * Returns neighbor ID.
+     *
+     * @return neighbor ID
+     */
+    public String neighborId() {
+        return neighborId;
+    }
+
+    /**
+     * Sets neighbor ID.
+     *
+     * @param neighborId neighbor ID
+     */
+    public void setNeighborId(String neighborId) {
+        this.neighborId = neighborId;
+    }
+
+    /**
+     * Returns metric.
+     *
+     * @return metric
+     */
+    public int metric() {
+        return metric;
+    }
+
+    /**
+     * Sets metric.
+     *
+     * @param metric metric
+     */
+    public void setMetric(int metric) {
+        this.metric = metric;
+    }
+
+    /**
+     * Adds the TE for extended IS instance to IS extended reachability TLV.
+     *
+     * @param trafficEngineeringSubTlv TE for extended IS instance
+     */
+    public void addSubTlv(TrafficEngineeringSubTlv trafficEngineeringSubTlv) {
+        this.teSubTlv.add(trafficEngineeringSubTlv);
+    }
+
+    /**
+     * Reads from the channel buffer and populate this instance.
+     *
+     * @param channelBuffer channel buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+        this.setNeighborId(IsisUtil.systemIdPlus(tempByteArray));
+        this.setMetric(channelBuffer.readUnsignedMedium());
+        int nTlvPresent = channelBuffer.readByte();
+        if (nTlvPresent > 0) {
+            while (channelBuffer.readableBytes() > IsisUtil.TWO_BYTES) {
+                TlvHeader tlvHeader = new TlvHeader();
+                tlvHeader.setTlvType(channelBuffer.readByte());
+                tlvHeader.setTlvLength(channelBuffer.readByte());
+                SubTlvType tlvValue = SubTlvType.get(tlvHeader.tlvType());
+                int tlvLength = tlvHeader.tlvLength();
+                if (tlvValue != null) {
+                    if (channelBuffer.readableBytes() >= tlvLength) {
+                        this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
+                                                               channelBuffer.readBytes(tlvHeader.tlvLength())));
+                    }
+                } else {
+                    if (channelBuffer.readableBytes() >= tlvLength) {
+                        channelBuffer.readBytes(tlvLength);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns neighbor details of IS extended reachability TLV.
+     *
+     * @return neighbor details of IS extended reachability TLV.
+     */
+    public byte[] neighborBodyAsbytes() {
+        List<Byte> byteList = new ArrayList<>();
+        byteList.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborId()));
+        byteList.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.metric())));
+        if (this.teSubTlv.size() > 0) {
+            for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.teSubTlv) {
+                byteList.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
+            }
+        }
+        return Bytes.toArray(byteList);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("neighborId", neighborId)
+                .add("metric", metric)
+                .add("teSubTlv", teSubTlv)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/InterfaceIpAddress.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/InterfaceIpAddress.java
new file mode 100644
index 0000000..cc6174f
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/InterfaceIpAddress.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.onlab.packet.Ip4Address;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of interface ip address TE value.
+ */
+public class InterfaceIpAddress extends TlvHeader implements TrafficEngineeringSubTlv {
+    private static final Logger log =
+            LoggerFactory.getLogger(InterfaceIpAddress.class);
+    private List<Ip4Address> localInterfaceIPAddress = new ArrayList<>();
+
+    /**
+     * Creates an instance of local interface ip address.
+     *
+     * @param header tlv header instance
+     */
+    public InterfaceIpAddress(TlvHeader header) {
+        this.setTlvType(header.tlvType());
+        this.setTlvLength(header.tlvLength());
+    }
+
+    /**
+     * Adds local interface ip address.
+     *
+     * @param localAddress ip address
+     */
+    public void addLocalInterfaceIPAddress(Ip4Address localAddress) {
+        localInterfaceIPAddress.add(localAddress);
+    }
+
+    /**
+     * Returns local interface ip address.
+     *
+     * @return localAddress ip address
+     */
+    public List<Ip4Address> getLocalInterfaceIPAddress() {
+        return localInterfaceIPAddress;
+    }
+
+    /**
+     * Reads bytes from channel buffer.
+     *
+     * @param channelBuffer channel buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() >= IsisUtil.FOUR_BYTES) {
+            byte[] tempByteArray = new byte[IsisUtil.FOUR_BYTES];
+            channelBuffer.readBytes(tempByteArray, 0, IsisUtil.FOUR_BYTES);
+            this.addLocalInterfaceIPAddress(Ip4Address.valueOf(tempByteArray));
+        }
+    }
+
+    /**
+     * Returns local interface ip address as byte array.
+     *
+     * @return local interface ip address as byte array
+     */
+    public byte[] asBytes() {
+        byte[] linkSubType = null;
+        byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+        byte[] linkSubTlvBody = tlvBodyAsBytes();
+        linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+        return linkSubType;
+    }
+
+    /**
+     * Returns byte array of local interface ip address.
+     *
+     * @return byte array of local interface ip address
+     */
+    public byte[] tlvBodyAsBytes() {
+        List<Byte> linkSubTypeBody = new ArrayList<>();
+        for (Ip4Address remoteAddress : this.localInterfaceIPAddress) {
+            linkSubTypeBody.addAll(Bytes.asList(remoteAddress.toOctets()));
+        }
+
+        return Bytes.toArray(linkSubTypeBody);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("localInterfaceIPAddress", localInterfaceIPAddress)
+                .toString();
+    }
+}
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
index 7958f53..92ea143 100644
--- 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
@@ -66,6 +66,11 @@
                 unreservedBandwidth.readFrom(channelBuffer);
                 subTlv = unreservedBandwidth;
                 break;
+            case INTERFACEADDRESS:
+                InterfaceIpAddress ipInterfaceAddressTlv = new InterfaceIpAddress(tlvHeader);
+                ipInterfaceAddressTlv.readFrom(channelBuffer);
+                subTlv = ipInterfaceAddressTlv;
+                break;
             default:
                 //TODO
                 break;
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
index 8774c04..8b41c4b 100644
--- 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
@@ -60,6 +60,9 @@
         } else if (subTlv instanceof UnreservedBandwidth) {
             UnreservedBandwidth unreservedBandwidth = (UnreservedBandwidth) subTlv;
             subTlvBytes.addAll(Bytes.asList(unreservedBandwidth.asBytes()));
+        } else if (subTlv instanceof InterfaceIpAddress) {
+            InterfaceIpAddress interfaceIpAddress = (InterfaceIpAddress) subTlv;
+            subTlvBytes.addAll(Bytes.asList(interfaceIpAddress.asBytes()));
         } else {
             log.debug("TlvsToBytes::UNKNOWN TLV TYPE ::TlvsToBytes ");
         }
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
index 12c1127..5caecbf 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
@@ -23,11 +23,30 @@
  * Representation of sub tlv type.
  */
 public enum SubTlvType {
-    ADMINISTRATIVEGROUP(9),
-    MAXIMUMBANDWIDTH(6),
-    MAXIMUMRESERVABLEBANDWIDTH(7),
-    TRAFFICENGINEERINGMETRIC(5),
-    UNRESERVEDBANDWIDTH(8);
+    /**
+     * Represents traffic engineering administrative group TLV.
+     */
+    ADMINISTRATIVEGROUP(3),
+    /**
+     * Represents traffic engineering maximum bandwidth TLV.
+     */
+    MAXIMUMBANDWIDTH(9),
+    /**
+     * Represents traffic engineering maximum reservable bandwidth TLV.
+     */
+    MAXIMUMRESERVABLEBANDWIDTH(10),
+    /**
+     * Represents traffic engineering metric TLV.
+     */
+    TRAFFICENGINEERINGMETRIC(18),
+    /**
+     * Represents traffic engineering interface address TLV.
+     */
+    INTERFACEADDRESS(6),
+    /**
+     * Represents traffic engineering unreserved bandwidth TLV.
+     */
+    UNRESERVEDBANDWIDTH(11);
 
     // Reverse lookup table
     private static final Map<Integer, SubTlvType> LOOKUP = new HashMap<>();
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlvTest.java
new file mode 100644
index 0000000..8f71ece
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlvTest.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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for AdjacencyStateTlv.
+ */
+public class AdjacencyStateTlvTest {
+
+    private final String neighborSystemId = "2929.2929.2929";
+    private final byte[] tlv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private AdjacencyStateTlv adjacencyStateTlv;
+    private TlvHeader tlvHeader;
+    private int result;
+    private byte result2;
+    private String result1;
+    private ChannelBuffer channelBuffer;
+    private byte[] result3;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        adjacencyStateTlv = new AdjacencyStateTlv(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        adjacencyStateTlv = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests localCircuitId() getter method.
+     */
+    @Test
+    public void testLocalCircuitId() throws Exception {
+        adjacencyStateTlv.setLocalCircuitId(1);
+        result = adjacencyStateTlv.localCircuitId();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests localCircuitId() setter method.
+     */
+    @Test
+    public void testSetLocalCircuitId() throws Exception {
+        adjacencyStateTlv.setLocalCircuitId(1);
+        result = adjacencyStateTlv.localCircuitId();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests neighborSystemId() getter method.
+     */
+    @Test
+    public void testNeighborSystemId() throws Exception {
+        adjacencyStateTlv.setNeighborSystemId(neighborSystemId);
+        result1 = adjacencyStateTlv.neighborSystemId();
+        assertThat(result1, is(neighborSystemId));
+    }
+
+    /**
+     * Tests neighborSystemId() setter method.
+     */
+    @Test
+    public void testSetNeighborSystemId() throws Exception {
+        adjacencyStateTlv.setNeighborSystemId(neighborSystemId);
+        result1 = adjacencyStateTlv.neighborSystemId();
+        assertThat(result1, is(neighborSystemId));
+    }
+
+    /**
+     * Tests neighborLocalCircuitId() getter method.
+     */
+    @Test
+    public void testNeighborLocalCircuitId() throws Exception {
+        adjacencyStateTlv.setNeighborLocalCircuitId(1);
+        result = adjacencyStateTlv.neighborLocalCircuitId();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests neighborLocalCircuitId() setter method.
+     */
+    @Test
+    public void testSetNeighborLocalCircuitId() throws Exception {
+        adjacencyStateTlv.setNeighborLocalCircuitId(1);
+        result = adjacencyStateTlv.neighborLocalCircuitId();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests adjacencyType() getter method.
+     */
+    @Test
+    public void testAdjacencyType() throws Exception {
+        adjacencyStateTlv.setAdjacencyType((byte) 1);
+        result2 = adjacencyStateTlv.adjacencyType();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests adjacencyType() setter method.
+     */
+    @Test
+    public void testSetAdjacencyType() throws Exception {
+        adjacencyStateTlv.setAdjacencyType((byte) 1);
+        result2 = adjacencyStateTlv.adjacencyType();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        adjacencyStateTlv.readFrom(channelBuffer);
+        assertThat(adjacencyStateTlv.adjacencyType(), is((byte) 0));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        adjacencyStateTlv.readFrom(channelBuffer);
+        result3 = adjacencyStateTlv.asBytes();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(adjacencyStateTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlvTest.java
new file mode 100644
index 0000000..61a1f96
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlvTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for AreaAddressTlv.
+ */
+public class AreaAddressTlvTest {
+
+    private final String areaAddres = "490001";
+    private final byte[] tlv = {1, 49};
+    private AreaAddressTlv areaAddressTlv;
+    private TlvHeader tlvHeader;
+    private List<String> result;
+    private ChannelBuffer channelBuffer;
+    private byte[] result1;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        areaAddressTlv = new AreaAddressTlv(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        areaAddressTlv = null;
+    }
+
+    /**
+     * Tests addAddress() method.
+     */
+    @Test
+    public void testAddAddress() throws Exception {
+        areaAddressTlv.addAddress(areaAddres);
+        result = areaAddressTlv.areaAddress();
+        assertThat(result.size(), is(1));
+    }
+
+    /**
+     * Tests areaAddress() setter method.
+     */
+    @Test
+    public void testSetAreaAddress() throws Exception {
+        areaAddressTlv.addAddress(areaAddres);
+        result = areaAddressTlv.areaAddress();
+        assertThat(result.size(), is(1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        areaAddressTlv.readFrom(channelBuffer);
+        assertThat(areaAddressTlv.areaAddress().size(), is(1));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        areaAddressTlv.readFrom(channelBuffer);
+        result1 = areaAddressTlv.asBytes();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(areaAddressTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlvTest.java
new file mode 100644
index 0000000..d83ecef9e
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlvTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for HostNameTlv.
+ */
+public class HostNameTlvTest {
+    private final String hostName = "TEST";
+    private final byte[] tlv = hostName.getBytes();
+    private HostNameTlv hostNameTlv;
+    private TlvHeader tlvHeader;
+    private String result;
+    private ChannelBuffer channelBuffer;
+    private byte[] result1;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(tlv.length);
+        hostNameTlv = new HostNameTlv(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        hostNameTlv = null;
+    }
+
+    /**
+     * Tests hostName() getter method.
+     */
+    @Test
+    public void testHostName() throws Exception {
+        hostNameTlv.setHostName(hostName);
+        result = hostNameTlv.hostName();
+        assertThat(result, is(hostName));
+    }
+
+    /**
+     * Tests hostName() setter method.
+     */
+    @Test
+    public void testSetHostName() throws Exception {
+        hostNameTlv.setHostName(hostName);
+        result = hostNameTlv.hostName();
+        assertThat(result, is(hostName));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        hostNameTlv.readFrom(channelBuffer);
+        assertThat(hostNameTlv.hostName(), is(hostName));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        hostNameTlv.readFrom(channelBuffer);
+        result1 = hostNameTlv.asBytes();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(hostNameTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlvTest.java
new file mode 100644
index 0000000..eaebe87
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlvTest.java
@@ -0,0 +1,236 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.AdministrativeGroup;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IP ExtendedReachabilityTlv.
+ */
+public class IpExtendedReachabilityTlvTest {
+    private final String prefix = "00";
+    private final byte[] tlv = {0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0};
+    private final byte[] tlv1 = {0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0};
+    private final byte[] tlv2 = {0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0};
+    private final byte[] tlv3 = {0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0};
+    private TlvHeader tlvHeader;
+    private IpExtendedReachabilityTlv ipExtendedReachabilityTlv;
+    private String result;
+    private boolean result1;
+    private int result2;
+    private TrafficEngineeringSubTlv trafficEngineeringSubTlv;
+    private byte result4;
+    private ChannelBuffer channelBuffer;
+    private byte[] result3;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        ipExtendedReachabilityTlv = new IpExtendedReachabilityTlv(tlvHeader);
+        trafficEngineeringSubTlv = new AdministrativeGroup(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        ipExtendedReachabilityTlv = null;
+
+    }
+
+    /**
+     * Tests prefix() getter method.
+     */
+    @Test
+    public void testPrefix() throws Exception {
+        ipExtendedReachabilityTlv.setPrefix(prefix);
+        result = ipExtendedReachabilityTlv.prefix();
+        assertThat(result, is("00"));
+    }
+
+    /**
+     * Tests prefix() setter method.
+     */
+    @Test
+    public void testSetPrefix() throws Exception {
+        ipExtendedReachabilityTlv.setPrefix(prefix);
+        result = ipExtendedReachabilityTlv.prefix();
+        assertThat(result, is("00"));
+    }
+
+    /**
+     * Tests isDown() getter method.
+     */
+
+    @Test
+    public void testIsDown() throws Exception {
+        ipExtendedReachabilityTlv.setDown(true);
+        result1 = ipExtendedReachabilityTlv.isDown();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDown() setter method.
+     */
+    @Test
+    public void testSetDown() throws Exception {
+        ipExtendedReachabilityTlv.setDown(true);
+        result1 = ipExtendedReachabilityTlv.isDown();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isSubTlvPresence() getter method.
+     */
+    @Test
+    public void testIsSubTlvPresence() throws Exception {
+        ipExtendedReachabilityTlv.setSubTlvPresence(true);
+        result1 = ipExtendedReachabilityTlv.isSubTlvPresence();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isSubTlvPresence() setter method.
+     */
+    @Test
+    public void testSetSubTlvPresence() throws Exception {
+        ipExtendedReachabilityTlv.setSubTlvPresence(true);
+        result1 = ipExtendedReachabilityTlv.isSubTlvPresence();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests prefixLength() getter method.
+     */
+    @Test
+    public void testPrefixLength() throws Exception {
+        ipExtendedReachabilityTlv.setPrefixLength(10);
+        result2 = ipExtendedReachabilityTlv.prefixLength();
+        assertThat(result2, is(10));
+
+    }
+
+    /**
+     * Tests prefixLength() setter method.
+     */
+    @Test
+    public void testSetPrefixLength() throws Exception {
+        ipExtendedReachabilityTlv.setPrefixLength(10);
+        result2 = ipExtendedReachabilityTlv.prefixLength();
+        assertThat(result2, is(10));
+    }
+
+    /**
+     * Tests addNeighbor() method.
+     */
+    @Test
+    public void testAddSubTlv() throws Exception {
+        ipExtendedReachabilityTlv.addSubTlv(trafficEngineeringSubTlv);
+        assertThat(ipExtendedReachabilityTlv, is(notNullValue()));
+
+    }
+
+    /**
+     * Tests subTlvLength() getter method.
+     */
+    @Test
+    public void testSubTlvLength() throws Exception {
+        ipExtendedReachabilityTlv.setSubTlvLength((byte) 10);
+        result4 = ipExtendedReachabilityTlv.subTlvLength();
+        assertThat(result4, is((byte) 10));
+    }
+
+    /**
+     * Tests subTlvLength() setter method.
+     */
+    @Test
+    public void testSetSubTlvLength() throws Exception {
+        ipExtendedReachabilityTlv.setSubTlvLength((byte) 10);
+        result4 = ipExtendedReachabilityTlv.subTlvLength();
+        assertThat(result4, is((byte) 10));
+    }
+
+    /**
+     * Tests metric() getter method.
+     */
+    @Test
+    public void testMetric() throws Exception {
+        ipExtendedReachabilityTlv.setMetric(10);
+        result2 = ipExtendedReachabilityTlv.metric();
+        assertThat(result2, is(10));
+    }
+
+    /**
+     * Tests metric() setter method.
+     */
+    @Test
+    public void testSetMetric() throws Exception {
+        ipExtendedReachabilityTlv.setMetric(10);
+        result2 = ipExtendedReachabilityTlv.metric();
+        assertThat(result2, is(10));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipExtendedReachabilityTlv.readFrom(channelBuffer);
+        assertThat(ipExtendedReachabilityTlv.metric(), is(0));
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv1);
+        ipExtendedReachabilityTlv.readFrom(channelBuffer);
+        assertThat(ipExtendedReachabilityTlv.metric(), is(0));
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv2);
+        ipExtendedReachabilityTlv.readFrom(channelBuffer);
+        assertThat(ipExtendedReachabilityTlv.metric(), is(0));
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv3);
+        ipExtendedReachabilityTlv.readFrom(channelBuffer);
+        assertThat(ipExtendedReachabilityTlv.metric(), is(0));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipExtendedReachabilityTlv.readFrom(channelBuffer);
+        ipExtendedReachabilityTlv.setPrefix(prefix);
+        result3 = ipExtendedReachabilityTlv.asBytes();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(ipExtendedReachabilityTlv.toString(), is(notNullValue()));
+    }
+
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlvTest.java
new file mode 100644
index 0000000..1c086ab
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlvTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IP InterfaceAddressTlv.
+ */
+public class IpInterfaceAddressTlvTest {
+    private final Ip4Address ip4Address = Ip4Address.valueOf("10.10.10.10");
+    private final byte[] tlv = {0, 0, 0, 0};
+    private TlvHeader tlvHeader;
+    private IpInterfaceAddressTlv ipInterfaceAddressTlv;
+    private List<Ip4Address> resultList;
+    private byte[] result;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        ipInterfaceAddressTlv = new IpInterfaceAddressTlv(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        ipInterfaceAddressTlv = null;
+    }
+
+    /**
+     * Tests addInterfaceAddress() method.
+     */
+    @Test
+    public void testAddInterfaceAddres() throws Exception {
+        ipInterfaceAddressTlv.addInterfaceAddres(ip4Address);
+        resultList = ipInterfaceAddressTlv.interfaceAddress();
+        assertThat(resultList.size(), is(1));
+
+    }
+
+    /**
+     * Tests interfaceAddress() getter method.
+     */
+    @Test
+    public void testInterfaceAddress() throws Exception {
+        ipInterfaceAddressTlv.addInterfaceAddres(ip4Address);
+        resultList = ipInterfaceAddressTlv.interfaceAddress();
+        assertThat(resultList.size(), is(1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipInterfaceAddressTlv.readFrom(channelBuffer);
+        assertThat(ipInterfaceAddressTlv.interfaceAddress().size(), is(1));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipInterfaceAddressTlv.readFrom(channelBuffer);
+        result = ipInterfaceAddressTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(ipInterfaceAddressTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlvTest.java
new file mode 100644
index 0000000..c1b2117
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlvTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IP InternalReachabilityTlv.
+ */
+public class IpInternalReachabilityTlvTest {
+    private final byte[] tlv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private TlvHeader tlvHeader;
+    private IpInternalReachabilityTlv ipInternalReachabilityTlv;
+    private MetricOfInternalReachability metricOfInternalReachability;
+    private byte[] result;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        ipInternalReachabilityTlv = new IpInternalReachabilityTlv(tlvHeader);
+        metricOfInternalReachability = new MetricOfInternalReachability();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        ipInternalReachabilityTlv = null;
+    }
+
+    /**
+     * Tests addInternalReachabilityMetric() method.
+     */
+    @Test
+    public void testAddInternalReachabilityMetric() throws Exception {
+        ipInternalReachabilityTlv.addInternalReachabilityMetric(metricOfInternalReachability);
+        assertThat(ipInternalReachabilityTlv, is(notNullValue()));
+
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipInternalReachabilityTlv.readFrom(channelBuffer);
+        assertThat(ipInternalReachabilityTlv, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipInternalReachabilityTlv.readFrom(channelBuffer);
+        result = ipInternalReachabilityTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(ipInternalReachabilityTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlvTest.java
new file mode 100644
index 0000000..d52426e
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlvTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IS ReachabilityTlv.
+ */
+public class IsReachabilityTlvTest {
+    private final byte[] tlv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private TlvHeader tlvHeader;
+    private IsReachabilityTlv isReachabilityTlv;
+    private MetricsOfReachability metricsOfReachability;
+    private int resultInt;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        isReachabilityTlv = new IsReachabilityTlv(tlvHeader);
+        metricsOfReachability = new MetricsOfReachability();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        isReachabilityTlv = null;
+    }
+
+    /**
+     * Tests reserved() getter method.
+     */
+    @Test
+    public void testReserved() throws Exception {
+        isReachabilityTlv.setReserved(10);
+        resultInt = isReachabilityTlv.reserved();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests reserved() setter method.
+     */
+    @Test
+    public void testSetReserved() throws Exception {
+        isReachabilityTlv.setReserved(10);
+        resultInt = isReachabilityTlv.reserved();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests addMeticsOfReachability() getter method.
+     */
+    @Test
+    public void testAddMeticsOfReachability() throws Exception {
+        isReachabilityTlv.addMeticsOfReachability(metricsOfReachability);
+        assertThat(isReachabilityTlv, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        isReachabilityTlv.readFrom(channelBuffer);
+        assertThat(isReachabilityTlv, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        isReachabilityTlv.readFrom(channelBuffer);
+        result = isReachabilityTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(isReachabilityTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlvTest.java
new file mode 100644
index 0000000..676d1f2
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlvTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.MacAddress;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for ISIS NeighborTLV.
+ */
+public class IsisNeighborTlvTest {
+    private final MacAddress macAddress = MacAddress.valueOf("a4:23:05:00:00:00");
+    private final byte[] tlv = {0, 0, 0, 0, 0, 0};
+    private TlvHeader tlvHeader;
+    private IsisNeighborTlv isisNeighborTlv;
+    private List<MacAddress> resultList;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        isisNeighborTlv = null;
+    }
+
+    /**
+     * Tests addNeighbor() getter method.
+     */
+    @Test
+    public void testAddNeighbor() throws Exception {
+        isisNeighborTlv.addNeighbor(macAddress);
+        resultList = isisNeighborTlv.neighbor();
+        assertThat(resultList.size(), is(1));
+
+    }
+
+    /**
+     * Tests neighbor() setter method.
+     */
+    @Test
+    public void testNeighbor() throws Exception {
+        isisNeighborTlv.addNeighbor(macAddress);
+        resultList = isisNeighborTlv.neighbor();
+        assertThat(resultList.size(), is(1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        isisNeighborTlv.readFrom(channelBuffer);
+        assertThat(isisNeighborTlv.neighbor().size(), is(1));
+    }
+
+    /**
+     * Tests asBytes() getter method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        isisNeighborTlv.readFrom(channelBuffer);
+        result = isisNeighborTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(isisNeighborTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlvTest.java
new file mode 100644
index 0000000..d38a7c8
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlvTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for LspEntriesTlv.
+ */
+public class LspEntriesTlvTest {
+
+    private final byte[] entry = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private LspEntriesTlv lspEntriesTlv;
+    private TlvHeader tlvHeader;
+    private List<LspEntry> lspEntries = new ArrayList();
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        lspEntriesTlv = new LspEntriesTlv(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        lspEntriesTlv = null;
+        lspEntries.clear();
+    }
+
+    /**
+     * Tests lspEntry() getter method.
+     */
+    @Test
+    public void testLspEntry() throws Exception {
+        lspEntriesTlv.addLspEntry(new LspEntry());
+        assertThat(lspEntriesTlv.lspEntry().size(), is(1));
+    }
+
+    /**
+     * Tests lspEntry() add method.
+     */
+    @Test
+    public void testAddLspEntry() throws Exception {
+        lspEntriesTlv.addLspEntry(new LspEntry());
+        assertThat(lspEntriesTlv.lspEntry().size(), is(1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(entry);
+        lspEntriesTlv.readFrom(channelBuffer);
+        lspEntries = lspEntriesTlv.lspEntry();
+        assertThat(lspEntriesTlv.lspEntry().size(), is(1));
+    }
+
+    /**
+     * Tests asBytes()  method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(entry);
+        lspEntriesTlv.readFrom(channelBuffer);
+        lspEntriesTlv.asBytes();
+    }
+
+    /**
+     * Tests toString()  method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(lspEntriesTlv.toString(), is(notNullValue()));
+    }
+
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/LspEntryTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/LspEntryTest.java
new file mode 100644
index 0000000..2c8f0d1
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/LspEntryTest.java
@@ -0,0 +1,162 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for LspEntry.
+ */
+public class LspEntryTest {
+
+    private final String lspId = "10.10.10.10";
+    private final byte[] entry = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private LspEntry lspEntry;
+    private int result;
+    private String result2;
+    private ChannelBuffer channelBuffer;
+    private byte[] result3;
+
+    @Before
+    public void setUp() throws Exception {
+        lspEntry = new LspEntry();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        lspEntry = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests lspSequenceNumber() getter method.
+     */
+    @Test
+    public void testLspSequenceNumber() throws Exception {
+        lspEntry.setLspSequenceNumber(0);
+        result = lspEntry.lspSequenceNumber();
+        assertThat(result, is(0));
+    }
+
+    /**
+     * Tests lspSequenceNumber() setter method.
+     */
+    @Test
+    public void testSetLspSequenceNumber() throws Exception {
+        lspEntry.setLspSequenceNumber(0);
+        result = lspEntry.lspSequenceNumber();
+        assertThat(result, is(0));
+    }
+
+    /**
+     * Tests lspChecksum() getter method.
+     */
+    @Test
+    public void testLspChecksum() throws Exception {
+        lspEntry.setLspChecksum(0);
+        result = lspEntry.lspChecksum();
+        assertThat(result, is(0));
+    }
+
+    /**
+     * Tests lspChecksum() setter method.
+     */
+    @Test
+    public void testSetLspChecksum() throws Exception {
+        lspEntry.setLspChecksum(0);
+        result = lspEntry.lspChecksum();
+        assertThat(result, is(0));
+    }
+
+    /**
+     * Tests remainingTime() getter method.
+     */
+    @Test
+    public void testRemainingTime() throws Exception {
+        lspEntry.setRemainingTime(0);
+        result = lspEntry.remainingTime();
+        assertThat(result, is(0));
+    }
+
+    /**
+     * Tests remainingTime() setter method.
+     */
+    @Test
+    public void testSetRemainingTime() throws Exception {
+        lspEntry.setRemainingTime(0);
+        result = lspEntry.remainingTime();
+        assertThat(result, is(0));
+    }
+
+    /**
+     * Tests lspId() getter method.
+     */
+    @Test
+    public void testLspId() throws Exception {
+        lspEntry.setLspId(lspId);
+        result2 = lspEntry.lspId();
+        assertThat(result2, is("10.10.10.10"));
+    }
+
+    /**
+     * Tests lspId() getter method.
+     */
+    @Test
+    public void testSetLspId() throws Exception {
+        lspEntry.setLspId(lspId);
+        result2 = lspEntry.lspId();
+        assertThat(result2, is("10.10.10.10"));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(entry);
+        lspEntry.readFrom(channelBuffer);
+        assertThat(lspEntry, is(notNullValue()));
+    }
+
+    /**
+     * Tests lspEntryAsBytes() method.
+     */
+    @Test
+    public void testLspEntryAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(entry);
+        lspEntry.readFrom(channelBuffer);
+        result3 = lspEntry.lspEntryAsBytes();
+        assertThat(lspEntry, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(lspEntry.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachabilityTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachabilityTest.java
new file mode 100644
index 0000000..f96b1d2
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachabilityTest.java
@@ -0,0 +1,346 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for MetricOfInternalReachability.
+ */
+public class MetricOfInternalReachabilityTest {
+
+    private final Ip4Address ip4Address = Ip4Address.valueOf("10.10.10.10");
+    private final byte[] internalReachability = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private MetricOfInternalReachability reachability;
+    private Ip4Address result;
+    private boolean result1;
+    private byte result2;
+    private ChannelBuffer channelBuffer;
+    private byte[] result3;
+
+    @Before
+    public void setUp() throws Exception {
+        reachability = new MetricOfInternalReachability();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        reachability = null;
+        result = null;
+        result1 = false;
+    }
+
+    /**
+     * Tests getIpAddress() getter method.
+     */
+    @Test
+    public void testGetIpAddress() throws Exception {
+        reachability.setIpAddress(ip4Address);
+        result = reachability.getIpAddress();
+        assertThat(result, is(ip4Address));
+    }
+
+    /**
+     * Tests setIpAddress() setter method.
+     */
+    @Test
+    public void testSetIpAddress() throws Exception {
+        reachability.setIpAddress(ip4Address);
+        result = reachability.getIpAddress();
+        assertThat(result, is(ip4Address));
+    }
+
+    /**
+     * Tests getSubnetAddres() getter method.
+     */
+    @Test
+    public void testGetSubnetAddres() throws Exception {
+        reachability.setSubnetAddres(ip4Address);
+        result = reachability.getSubnetAddres();
+        assertThat(result, is(ip4Address));
+    }
+
+    /**
+     * Tests setSubnetAddres() setter method.
+     */
+    @Test
+    public void testSetSubnetAddres() throws Exception {
+        reachability.setSubnetAddres(ip4Address);
+        result = reachability.getSubnetAddres();
+        assertThat(result, is(ip4Address));
+    }
+
+    /**
+     * Tests isErrorIsInternal() getter method.
+     */
+    @Test
+    public void testIsErrorIsInternal() throws Exception {
+        reachability.setErrorIsInternal(true);
+        result1 = reachability.isErrorIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isErrorIsInternal() setter method.
+     */
+    @Test
+    public void testSetErrorIsInternal() throws Exception {
+        reachability.setErrorIsInternal(true);
+        result1 = reachability.isErrorIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseIsInternal() getter method.
+     */
+    @Test
+    public void testIsExpenseIsInternal() throws Exception {
+        reachability.setExpenseIsInternal(true);
+        result1 = reachability.isExpenseIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseIsInternal() setter method.
+     */
+    @Test
+    public void testSetExpenseIsInternal() throws Exception {
+        reachability.setExpenseIsInternal(true);
+        result1 = reachability.isExpenseIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDelayIsInternal() getter method.
+     */
+    @Test
+    public void testIsDelayIsInternal() throws Exception {
+        reachability.setDelayIsInternal(true);
+        result1 = reachability.isDelayIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDelayIsInternal() setter method.
+     */
+    @Test
+    public void testSetDelayIsInternal() throws Exception {
+        reachability.setDelayIsInternal(true);
+        result1 = reachability.isDelayIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDefaultDistributionDown() getter method.
+     */
+    @Test
+    public void testIsDefaultDistributionDown() throws Exception {
+        reachability.setDefaultDistributionDown(true);
+        result1 = reachability.isDefaultDistributionDown();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDefaultDistributionDown() setter method.
+     */
+    @Test
+    public void testSetDefaultDistributionDown() throws Exception {
+        reachability.setDefaultDistributionDown(true);
+        result1 = reachability.isDefaultDistributionDown();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDefaultIsInternal() getter method.
+     */
+    @Test
+    public void testIsDefaultIsInternal() throws Exception {
+        reachability.setDefaultIsInternal(true);
+        result1 = reachability.isDefaultIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDefaultIsInternal() setter method.
+     */
+    @Test
+    public void testSetDefaultIsInternal() throws Exception {
+        reachability.setDefaultIsInternal(true);
+        result1 = reachability.isDefaultIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isErrorMetricSupported() getter method.
+     */
+    @Test
+    public void testIsErrorMetricSupported() throws Exception {
+        reachability.setErrorMetricSupported(true);
+        result1 = reachability.isErrorMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isErrorMetricSupported() setter method.
+     */
+    @Test
+    public void testSetErrorMetricSupported() throws Exception {
+        reachability.setErrorMetricSupported(true);
+        result1 = reachability.isErrorMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseMetricSupported() setter method.
+     */
+    @Test
+    public void testIsExpenseMetricSupported() throws Exception {
+        reachability.setExpenseMetricSupported(true);
+        result1 = reachability.isExpenseMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseMetricSupported() setter method.
+     */
+    @Test
+    public void testSetExpenseMetricSupported() throws Exception {
+        reachability.setExpenseMetricSupported(true);
+        result1 = reachability.isExpenseMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDelayMetricSupported() getter method.
+     */
+    @Test
+    public void testIsDelayMetricSupported() throws Exception {
+        reachability.setDelayMetricSupported(true);
+        result1 = reachability.isDelayMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDelayMetricSupported() setter method.
+     */
+    @Test
+    public void testSetDelayMetricSupported() throws Exception {
+        reachability.setDelayMetricSupported(true);
+        result1 = reachability.isDelayMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests errorMetric() getter method.
+     */
+    @Test
+    public void testErrorMetric() throws Exception {
+        reachability.setErrorMetric((byte) 0);
+        result2 = reachability.errorMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests errorMetric() setter method.
+     */
+    @Test
+    public void testSetErrorMetric() throws Exception {
+        reachability.setErrorMetric((byte) 0);
+        result2 = reachability.errorMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests delayMetric() getter method.
+     */
+    @Test
+    public void testDelayMetric() throws Exception {
+        reachability.setDelayMetric((byte) 0);
+        result2 = reachability.delayMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests delayMetric() setter method.
+     */
+    @Test
+    public void testSetDelayMetric() throws Exception {
+        reachability.setDelayMetric((byte) 0);
+        result2 = reachability.delayMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests defaultMetric() getter method.
+     */
+    @Test
+    public void testDefaultMetric() throws Exception {
+        reachability.setDefaultMetric((byte) 0);
+        result2 = reachability.defaultMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests defaultMetric() setter method.
+     */
+    @Test
+    public void testSetDefaultMetric() throws Exception {
+        reachability.setDefaultMetric((byte) 0);
+        result2 = reachability.defaultMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(internalReachability);
+        reachability.readFrom(channelBuffer);
+        assertThat(reachability, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(internalReachability);
+        reachability.readFrom(channelBuffer);
+        result3 = reachability.asBytes();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(reachability.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachabilityTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachabilityTest.java
new file mode 100644
index 0000000..318eeea
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachabilityTest.java
@@ -0,0 +1,326 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for MetricsOfReachability.
+ */
+public class MetricsOfReachabilityTest {
+    private final Ip4Address ip4Address = Ip4Address.valueOf("10.10.10.10");
+    private final byte[] metricReachability = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private MetricsOfReachability reachability;
+    private String neighborId = "2929.2929.2929";
+    private Ip4Address result;
+    private boolean result1;
+    private byte result2;
+    private ChannelBuffer channelBuffer;
+    private byte[] result3;
+    private String result4;
+
+    @Before
+    public void setUp() throws Exception {
+        reachability = new MetricsOfReachability();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+        result1 = false;
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        reachability = null;
+        result1 = false;
+        result3 = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests isDelayIsInternal() getter method.
+     */
+    @Test
+    public void testIsDelayIsInternal() throws Exception {
+        reachability.setDelayIsInternal(true);
+        result1 = reachability.isDelayIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDelayIsInternal() setter method.
+     */
+    @Test
+    public void testSetDelayIsInternal() throws Exception {
+        reachability.setDelayIsInternal(true);
+        result1 = reachability.isDelayIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseIsInternal() getter method.
+     */
+    @Test
+    public void testIsExpenseIsInternal() throws Exception {
+        reachability.setExpenseIsInternal(true);
+        result1 = reachability.isExpenseIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseIsInternal() setter method.
+     */
+    @Test
+    public void testSetExpenseIsInternal() throws Exception {
+        reachability.setExpenseIsInternal(true);
+        result1 = reachability.isExpenseIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isErrorIsInternal() getter method.
+     */
+    @Test
+    public void testIsErrorIsInternal() throws Exception {
+        reachability.setErrorIsInternal(true);
+        result1 = reachability.isErrorIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isErrorIsInternal() setter method.
+     */
+    @Test
+    public void testSetErrorIsInternal() throws Exception {
+        reachability.setErrorIsInternal(true);
+        result1 = reachability.isErrorIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDefaultIsInternal() getter method.
+     */
+    @Test
+    public void testIsDefaultIsInternal() throws Exception {
+        reachability.setDefaultIsInternal(true);
+        result1 = reachability.isDefaultIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDefaultIsInternal() setter method.
+     */
+    @Test
+    public void testSetDefaultIsInternal() throws Exception {
+        reachability.setDefaultIsInternal(true);
+        result1 = reachability.isDefaultIsInternal();
+        assertThat(result1, is(true));
+    }
+
+    @Test
+    public void testIsDelayMetricSupported() throws Exception {
+        reachability.setDelayMetricSupported(true);
+        result1 = reachability.isDelayMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isDelayMetricSupported() setter method.
+     */
+    @Test
+    public void testSetDelayMetricSupported() throws Exception {
+        reachability.setDelayMetricSupported(true);
+        result1 = reachability.isDelayMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseMetricSupported() getter method.
+     */
+    @Test
+    public void testIsExpenseMetricSupported() throws Exception {
+        reachability.setExpenseMetricSupported(true);
+        result1 = reachability.isExpenseMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isExpenseMetricSupported() setter method.
+     */
+    @Test
+    public void testSetExpenseMetricSupported() throws Exception {
+        reachability.setExpenseMetricSupported(true);
+        result1 = reachability.isExpenseMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isErrorMetricSupported() getter method.
+     */
+    @Test
+    public void testIsErrorMetricSupported() throws Exception {
+        reachability.setErrorMetricSupported(true);
+        result1 = reachability.isErrorMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests isErrorMetricSupported() setter method.
+     */
+    @Test
+    public void testSetErrorMetricSupported() throws Exception {
+        reachability.setErrorMetricSupported(true);
+        result1 = reachability.isErrorMetricSupported();
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests neighborId() getter method.
+     */
+    @Test
+    public void testNeighborId() throws Exception {
+        reachability.setNeighborId(neighborId);
+        result4 = reachability.neighborId();
+        assertThat(result4, is(neighborId));
+    }
+
+    /**
+     * Tests neighborId() setter method.
+     */
+    @Test
+    public void testSetNeighborId() throws Exception {
+        reachability.setNeighborId(neighborId);
+        result4 = reachability.neighborId();
+        assertThat(result4, is(neighborId));
+    }
+
+    /**
+     * Tests defaultMetric() getter method.
+     */
+    @Test
+    public void testDefaultMetric() throws Exception {
+        reachability.setDefaultMetric((byte) 0);
+        result2 = reachability.defaultMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests defaultMetric() setter method.
+     */
+    @Test
+    public void testSetDefaultMetric() throws Exception {
+        reachability.setDefaultMetric((byte) 0);
+        result2 = reachability.defaultMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests delayMetric() getter method.
+     */
+    @Test
+    public void testDelayMetric() throws Exception {
+        reachability.setDelayMetric((byte) 0);
+        result2 = reachability.delayMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests delayMetric() setter method.
+     */
+    @Test
+    public void testSetDelayMetric() throws Exception {
+        reachability.setDelayMetric((byte) 0);
+        result2 = reachability.delayMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests expenseMetric() getter method.
+     */
+    @Test
+    public void testExpenseMetric() throws Exception {
+        reachability.setExpenseMetric((byte) 0);
+        result2 = reachability.expenseMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests expenseMetric() setter method.
+     */
+    @Test
+    public void testSetExpenseMetric() throws Exception {
+        reachability.setExpenseMetric((byte) 0);
+        result2 = reachability.expenseMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests errorMetric() getter method.
+     */
+    @Test
+    public void testErrorMetric() throws Exception {
+        reachability.setErrorMetric((byte) 0);
+        result2 = reachability.errorMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests errorMetric() setter method.
+     */
+    @Test
+    public void testSetErrorMetric() throws Exception {
+        reachability.setErrorMetric((byte) 0);
+        result2 = reachability.errorMetric();
+        assertThat(result2, is((byte) 0));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(metricReachability);
+        reachability.readFrom(channelBuffer);
+        assertThat(reachability, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(metricReachability);
+        reachability.readFrom(channelBuffer);
+        result3 = reachability.asBytes();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(reachability.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlvTest.java
new file mode 100644
index 0000000..f55205b
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlvTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for PaddingTlv.
+ */
+public class PaddingTlvTest {
+
+    private final byte[] tlv = {0, 0, 0, 0, 0, 0, 0};
+    private PaddingTlv paddingTlv;
+    private TlvHeader tlvHeader;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        paddingTlv = new PaddingTlv(tlvHeader);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        paddingTlv = null;
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        paddingTlv.readFrom(channelBuffer);
+        assertThat(paddingTlv, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        paddingTlv.readFrom(channelBuffer);
+        result = paddingTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() getter method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(paddingTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlvTest.java
new file mode 100644
index 0000000..b55718f
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlvTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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 org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for ProtocolSupportedTlv.
+ */
+public class ProtocolSupportedTlvTest {
+    private final byte[] tlv = {0};
+    private ProtocolSupportedTlv protocolSupportedTlv;
+    private TlvHeader tlvHeader;
+    private List<Byte> supported;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        protocolSupportedTlv = new ProtocolSupportedTlv(tlvHeader);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        protocolSupportedTlv = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests addProtocolSupported() method.
+     */
+    @Test
+    public void testAddProtocolSupported() throws Exception {
+        protocolSupportedTlv.addProtocolSupported((byte) 1);
+        supported = protocolSupportedTlv.protocolSupported();
+        assertThat(supported.size(), is(1));
+    }
+
+    /**
+     * Tests addProtocolSupported() getter method.
+     */
+    @Test
+    public void testProtocolSupported() throws Exception {
+        protocolSupportedTlv.addProtocolSupported((byte) 1);
+        supported = protocolSupportedTlv.protocolSupported();
+        assertThat(supported.size(), is(1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        protocolSupportedTlv.readFrom(channelBuffer);
+        supported = protocolSupportedTlv.protocolSupported();
+        assertThat(supported.size(), is(1));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        protocolSupportedTlv.readFrom(channelBuffer);
+        result = protocolSupportedTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(protocolSupportedTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvFinderTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvFinderTest.java
new file mode 100644
index 0000000..838d425
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvFinderTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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 org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.instanceOf;
+
+/**
+ * Unit test class for TlvFinder.
+ */
+public class TlvFinderTest {
+
+    private final byte[] tlv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private final byte[] tlv1 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private TlvFinder tlvFinder;
+    private TlvHeader tlvHeader;
+    private ChannelBuffer channelBuffer;
+    private IsisTlv isisTlv;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvFinder = new TlvFinder();
+        tlvHeader = new TlvHeader();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvFinder = null;
+        isisTlv = null;
+    }
+
+    /**
+     * Tests IsisTlv() getter method.
+     */
+    @Test
+    public void testIsisTlv() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+
+        tlvHeader.setTlvType(TlvType.AREAADDRESS.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(AreaAddressTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.HOSTNAME.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(HostNameTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.IDRPINFORMATION.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(IdrpInformationTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.IPEXTENDEDREACHABILITY.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(IpExtendedReachabilityTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.IPINTERFACEADDRESS.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(IpInterfaceAddressTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.IPINTERNALREACHABILITY.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(IpInternalReachabilityTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.PROTOCOLSUPPORTED.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(ProtocolSupportedTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.ISREACHABILITY.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(IsReachabilityTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.ISNEIGHBORS.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(IsisNeighborTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.LSPENTRY.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(LspEntriesTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        tlvHeader.setTlvType(TlvType.PADDING.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(PaddingTlv.class));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv1);
+        tlvHeader.setTlvType(TlvType.ADJACENCYSTATE.value());
+        isisTlv = tlvFinder.findTlv(tlvHeader, channelBuffer);
+        assertThat(isisTlv, instanceOf(AdjacencyStateTlv.class));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvHeaderTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvHeaderTest.java
new file mode 100644
index 0000000..22371d5
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvHeaderTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for TlvHeader.
+ */
+public class TlvHeaderTest {
+
+    private TlvHeader tlvHeader;
+    private int result;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests tlvLength() getter method.
+     */
+    @Test
+    public void testTlvLength() throws Exception {
+        tlvHeader.setTlvLength(1);
+        result = tlvHeader.tlvLength();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests tlvLength() setter method.
+     */
+    @Test
+    public void testSetTlvLength() throws Exception {
+        tlvHeader.setTlvLength(1);
+        result = tlvHeader.tlvLength();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests tlvType() getter method.
+     */
+    @Test
+    public void testTlvType() throws Exception {
+        tlvHeader.setTlvType(1);
+        result = tlvHeader.tlvType();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests tlvType() setter method.
+     */
+    @Test
+    public void testSetTlvType() throws Exception {
+        tlvHeader.setTlvType(1);
+        result = tlvHeader.tlvType();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        tlvHeader.readFrom(channelBuffer);
+        assertThat(tlvHeader, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() getter method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        assertThat(tlvHeader.asBytes(), is(nullValue()));
+    }
+
+    /**
+     * Tests tlvHeaderAsByteArray() method.
+     */
+    @Test
+    public void testTlvHeaderAsByteArray() throws Exception {
+        tlvHeader.setTlvLength(1);
+        tlvHeader.setTlvType(1);
+        assertThat(tlvHeader.tlvHeaderAsByteArray(), is(notNullValue()));
+        assertThat(tlvHeader.tlvType(), is(1));
+        assertThat(tlvHeader.tlvLength(), is(1));
+    }
+
+    /**
+     * Tests toString() getter method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(tlvHeader.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytesTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytesTest.java
new file mode 100644
index 0000000..bb280d2
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytesTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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 org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterfaceState;
+import org.onosproject.isis.io.util.IsisConstants;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for TlvsToBytes.
+ */
+public class TlvsToBytesTest {
+    private final String areaAddress = "49";
+    private final Ip4Address ip4Address = Ip4Address.valueOf("10.10.10.10");
+    private final String systemName = "ROUTER";
+    private final String neighborId = "2929.2929.2929";
+    private List<Byte> tlv;
+    private MacAddress macAddress = MacAddress.valueOf("a4:23:05:00:00:00");
+    private String prefix = "192.168.7";
+
+    /**
+     * Tests TlvToBytes() method.
+     */
+    @Test
+    public void testTlvToBytes() throws Exception {
+        TlvHeader tlvHeader = new TlvHeader();
+        tlvHeader.setTlvType(TlvType.AREAADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
+        areaAddressTlv.addAddress(areaAddress);
+        tlv = TlvsToBytes.tlvToBytes(areaAddressTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.PROTOCOLSUPPORTED.value());
+        tlvHeader.setTlvLength(0);
+        ProtocolSupportedTlv protocolSupportedTlv = new ProtocolSupportedTlv(tlvHeader);
+        protocolSupportedTlv.addProtocolSupported((byte) IsisConstants.PROTOCOLSUPPORTED);
+        tlv = TlvsToBytes.tlvToBytes(protocolSupportedTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.IPINTERFACEADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        IpInterfaceAddressTlv ipInterfaceAddressTlv = new IpInterfaceAddressTlv(tlvHeader);
+        ipInterfaceAddressTlv.addInterfaceAddres(ip4Address);
+        tlv = TlvsToBytes.tlvToBytes(ipInterfaceAddressTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.HOSTNAME.value());
+        tlvHeader.setTlvLength(0);
+        HostNameTlv hostNameTlv = new HostNameTlv(tlvHeader);
+        hostNameTlv.setHostName(systemName);
+        tlv = TlvsToBytes.tlvToBytes(hostNameTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.ISREACHABILITY.value());
+        tlvHeader.setTlvLength(0);
+        IsReachabilityTlv isReachabilityTlv = new IsReachabilityTlv(tlvHeader);
+        isReachabilityTlv.setReserved(0);
+        MetricsOfReachability metricsOfReachability = new MetricsOfReachability();
+        metricsOfReachability.setDefaultMetric((byte) 10);
+        metricsOfReachability.setDefaultIsInternal(true);
+        metricsOfReachability.setDelayMetric((byte) 10);
+        metricsOfReachability.setDelayIsInternal(true);
+        metricsOfReachability.setDelayMetricSupported(true);
+        metricsOfReachability.setExpenseMetric((byte) 10);
+        metricsOfReachability.setExpenseIsInternal(true);
+        metricsOfReachability.setExpenseMetricSupported(true);
+        metricsOfReachability.setErrorMetric((byte) 10);
+        metricsOfReachability.setErrorIsInternal(true);
+        metricsOfReachability.setErrorMetricSupported(true);
+        metricsOfReachability.setNeighborId(neighborId);
+        isReachabilityTlv.addMeticsOfReachability(metricsOfReachability);
+        tlv = TlvsToBytes.tlvToBytes(isReachabilityTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.IPINTERNALREACHABILITY.value());
+        tlvHeader.setTlvLength(0);
+        IpInternalReachabilityTlv ipInterReacTlv = new IpInternalReachabilityTlv(tlvHeader);
+        MetricOfInternalReachability metricOfIntRea = new MetricOfInternalReachability();
+        metricOfIntRea.setDefaultMetric((byte) 10);
+        metricOfIntRea.setDefaultIsInternal(true);
+        metricOfIntRea.setDefaultDistributionDown(true);
+        metricOfIntRea.setDelayMetric((byte) 0);
+        metricOfIntRea.setDelayMetricSupported(false);
+        metricOfIntRea.setDelayIsInternal(true);
+        metricOfIntRea.setExpenseMetric((byte) 0);
+        metricOfIntRea.setExpenseMetricSupported(false);
+        metricOfIntRea.setExpenseIsInternal(true);
+        metricOfIntRea.setErrorMetric((byte) 0);
+        metricOfIntRea.setErrorMetricSupported(false);
+        metricOfIntRea.setExpenseIsInternal(true);
+        metricOfIntRea.setIpAddress(ip4Address);
+        metricOfIntRea.setSubnetAddres(ip4Address);
+        ipInterReacTlv.addInternalReachabilityMetric(metricOfIntRea);
+        tlv = TlvsToBytes.tlvToBytes(ipInterReacTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.PADDING.value());
+        tlvHeader.setTlvLength(255);
+        PaddingTlv paddingTlv = new PaddingTlv(tlvHeader);
+        tlv = TlvsToBytes.tlvToBytes(paddingTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.IPEXTENDEDREACHABILITY.value());
+        tlvHeader.setTlvLength(0);
+        IpExtendedReachabilityTlv extendedTlv = new IpExtendedReachabilityTlv(tlvHeader);
+        extendedTlv.setDown(false);
+        extendedTlv.setMetric(10);
+        extendedTlv.setPrefix(prefix);
+        extendedTlv.setPrefixLength(24);
+        extendedTlv.setSubTlvLength((byte) 0);
+        extendedTlv.setSubTlvPresence(false);
+        tlv = TlvsToBytes.tlvToBytes(extendedTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.ADJACENCYSTATE.value());
+        tlvHeader.setTlvLength(0);
+        AdjacencyStateTlv adjacencyStateTlv = new AdjacencyStateTlv(tlvHeader);
+        adjacencyStateTlv.setAdjacencyType((byte) IsisInterfaceState.DOWN.value());
+        tlv = TlvsToBytes.tlvToBytes(adjacencyStateTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.ISNEIGHBORS.value());
+        tlvHeader.setTlvLength(0);
+        IsisNeighborTlv isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
+        isisNeighborTlv.addNeighbor(macAddress);
+        tlv = TlvsToBytes.tlvToBytes(isisNeighborTlv);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader.setTlvType(TlvType.EXTENDEDISREACHABILITY.value());
+        tlvHeader.setTlvLength(0);
+        IsExtendedReachability reachability = new IsExtendedReachability(tlvHeader);
+        NeighborForExtendedIs forExtendedIs = new NeighborForExtendedIs();
+        forExtendedIs.setMetric(10);
+        forExtendedIs.setNeighborId(neighborId);
+        reachability.addNeighbor(forExtendedIs);
+        tlv = TlvsToBytes.tlvToBytes(reachability);
+        assertThat(tlv, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroupTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroupTest.java
new file mode 100644
index 0000000..37179de
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroupTest.java
@@ -0,0 +1,109 @@
+/*
+ * 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.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for AdministrativeGroup.
+ */
+public class AdministrativeGroupTest {
+
+    private final byte[] packet = {0, 0, 0, 1};
+    private AdministrativeGroup administrativeGroup;
+    private ChannelBuffer channelBuffer;
+    private TlvHeader tlvHeader;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        administrativeGroup = new AdministrativeGroup(new TlvHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        administrativeGroup = null;
+        channelBuffer = null;
+        tlvHeader = null;
+    }
+
+    /**
+     * Tests administrativeGroup() getter method.
+     */
+    @Test
+    public void testGetAdministrativeGroup() throws Exception {
+        administrativeGroup.setAdministrativeGroup(1);
+        assertThat(administrativeGroup.administrativeGroup(), is(1));
+    }
+
+    /**
+     * Tests administrativeGroup() setter method.
+     */
+    @Test
+    public void testSetAdministrativeGroup() throws Exception {
+        administrativeGroup.setAdministrativeGroup(1);
+        assertThat(administrativeGroup.administrativeGroup(), is(1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvType(9);
+        tlvHeader.setTlvLength(4);
+        administrativeGroup = new AdministrativeGroup(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        administrativeGroup.readFrom(channelBuffer);
+        assertThat(administrativeGroup.administrativeGroup(), is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = administrativeGroup.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLinkSubTypeTlvBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLinkSubTypeTlvBodyAsByteArray() throws Exception {
+        result = administrativeGroup.tlvBodyAsBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(administrativeGroup.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/InterfaceIpAddressTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/InterfaceIpAddressTest.java
new file mode 100644
index 0000000..5acb728
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/InterfaceIpAddressTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for InterfaceIpAddress.
+ */
+public class InterfaceIpAddressTest {
+    private final byte[] packet = {1, 1, 1, 1};
+    private final byte[] packet1 = {};
+    private InterfaceIpAddress interfaceIpAddress;
+    private TlvHeader tlvHeader;
+    private Ip4Address ip4Address = Ip4Address.valueOf("1.1.1.1");
+    private byte[] result;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        interfaceIpAddress = new InterfaceIpAddress(new TlvHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        interfaceIpAddress = null;
+        tlvHeader = null;
+        result = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(interfaceIpAddress.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests addLocalInterfaceIPAddress() method.
+     */
+    @Test
+    public void testAddLocalInterfaceIPAddress() throws Exception {
+        interfaceIpAddress.addLocalInterfaceIPAddress(ip4Address);
+        assertThat(interfaceIpAddress, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() {
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvType(3);
+        tlvHeader.setTlvLength(4);
+        interfaceIpAddress = new InterfaceIpAddress(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        interfaceIpAddress.readFrom(channelBuffer);
+        assertThat(interfaceIpAddress, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom1() throws Exception {
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvType(3);
+        tlvHeader.setTlvLength(4);
+        interfaceIpAddress = new InterfaceIpAddress(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        interfaceIpAddress.readFrom(channelBuffer);
+        assertThat(interfaceIpAddress, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = interfaceIpAddress.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLinkSubTypeTlvBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLinkSubTypeTlvBodyAsByteArray() throws Exception {
+        result = interfaceIpAddress.tlvBodyAsBytes();
+        assertThat(result, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidthTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidthTest.java
new file mode 100644
index 0000000..32caade
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidthTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for MaximumBandwidth.
+ */
+public class MaximumBandwidthTest {
+
+    private final byte[] packet = {0, 0, 0, 0};
+    private MaximumBandwidth maximumBandwidth;
+    private TlvHeader header;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        maximumBandwidth = new MaximumBandwidth(new TlvHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        maximumBandwidth = null;
+        header = null;
+        channelBuffer = null;
+        result = null;
+    }
+
+    /**
+     * Tests maximumBandwidth() setter method.
+     */
+    @Test
+    public void testSetMaximumBandwidth() throws Exception {
+        maximumBandwidth.setMaximumBandwidth(123456.00f);
+        assertThat(maximumBandwidth, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        header = new TlvHeader();
+        header.setTlvType(6);
+        header.setTlvLength(4);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        maximumBandwidth = new MaximumBandwidth(header);
+        maximumBandwidth.readFrom(channelBuffer);
+        assertThat(maximumBandwidth, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = maximumBandwidth.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(maximumBandwidth.toString(), is(notNullValue()));
+    }
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidthTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidthTest.java
new file mode 100644
index 0000000..4fd2594
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidthTest.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 org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for MaximumReservableBandwidth.
+ */
+public class MaximumReservableBandwidthTest {
+
+    private final byte[] packet = {0, 0, 0, 0};
+    private MaximumReservableBandwidth maximumReservableBandwidth;
+    private TlvHeader header;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        maximumReservableBandwidth = new MaximumReservableBandwidth(new TlvHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        maximumReservableBandwidth = null;
+        header = null;
+        channelBuffer = null;
+        result = null;
+    }
+
+    /**
+     * Tests maximumBandwidth() setter method.
+     */
+    @Test
+    public void testSetMaximumBandwidth() throws Exception {
+        maximumReservableBandwidth.setMaximumBandwidth(123456.78f);
+        assertThat(maximumReservableBandwidth, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        header = new TlvHeader();
+        header.setTlvType(6);
+        header.setTlvLength(4);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        maximumReservableBandwidth = new MaximumReservableBandwidth(header);
+        maximumReservableBandwidth.readFrom(channelBuffer);
+        assertThat(maximumReservableBandwidth, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = maximumReservableBandwidth.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLinkSubTypeTlvBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLinkSubTypeTlvBodyAsByteArray() throws Exception {
+        result = maximumReservableBandwidth.tlvBodyAsBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(maximumReservableBandwidth.toString(), is(notNullValue()));
+    }
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinderTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinderTest.java
new file mode 100644
index 0000000..6ad0f46
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinderTest.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 org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for SubTlvFinder.
+ */
+public class SubTlvFinderTest {
+    private final byte[] packet1 = {0, 0, 0, 1};
+    private TlvHeader tlvHeader;
+    private ChannelBuffer channelBuffer;
+    private TrafficEngineeringSubTlv tlv;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        channelBuffer = null;
+    }
+
+    @Test
+    public void testFindSubTlv() throws Exception {
+
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(SubTlvType.ADMINISTRATIVEGROUP.value());
+        AdministrativeGroup administrativeGroup = new AdministrativeGroup(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        tlv = SubTlvFinder.findSubTlv(tlvHeader, channelBuffer);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(SubTlvType.TRAFFICENGINEERINGMETRIC.value());
+        TrafficEngineeringMetric trafficEngineeringMetric = new TrafficEngineeringMetric(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        tlv = SubTlvFinder.findSubTlv(tlvHeader, channelBuffer);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(SubTlvType.MAXIMUMBANDWIDTH.value());
+        MaximumBandwidth maximumBandwidth = new MaximumBandwidth(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        tlv = SubTlvFinder.findSubTlv(tlvHeader, channelBuffer);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(SubTlvType.MAXIMUMRESERVABLEBANDWIDTH.value());
+        MaximumReservableBandwidth maximumReservableBandwidth = new MaximumReservableBandwidth(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        tlv = SubTlvFinder.findSubTlv(tlvHeader, channelBuffer);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(SubTlvType.UNRESERVEDBANDWIDTH.value());
+        UnreservedBandwidth unreservedBandwidth = new UnreservedBandwidth(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        tlv = SubTlvFinder.findSubTlv(tlvHeader, channelBuffer);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(SubTlvType.INTERFACEADDRESS.value());
+        InterfaceIpAddress ipInterfaceAddressTlv = new InterfaceIpAddress(tlvHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        tlv = SubTlvFinder.findSubTlv(tlvHeader, channelBuffer);
+        assertThat(tlv, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytesTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytesTest.java
new file mode 100644
index 0000000..f6f2ac8
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytesTest.java
@@ -0,0 +1,72 @@
+package org.onosproject.isis.io.isispacket.tlv.subtlv;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for SubTlvToBytes.
+ */
+public class SubTlvToBytesTest {
+    private TlvHeader tlvHeader;
+    private ChannelBuffer channelBuffer;
+    private List<Byte> tlv;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        channelBuffer = null;
+    }
+
+    @Test
+    public void testTlvToBytes() throws Exception {
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(9);
+        AdministrativeGroup administrativeGroup = new AdministrativeGroup(tlvHeader);
+        tlv = SubTlvToBytes.tlvToBytes(administrativeGroup);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(5);
+        TrafficEngineeringMetric trafficEngineeringMetric = new TrafficEngineeringMetric(tlvHeader);
+        tlv = SubTlvToBytes.tlvToBytes(trafficEngineeringMetric);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(6);
+        MaximumBandwidth maximumBandwidth = new MaximumBandwidth(tlvHeader);
+        tlv = SubTlvToBytes.tlvToBytes(maximumBandwidth);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(7);
+        MaximumReservableBandwidth maximumReservableBandwidth = new MaximumReservableBandwidth(tlvHeader);
+        tlv = SubTlvToBytes.tlvToBytes(maximumReservableBandwidth);
+        assertThat(tlv, is(notNullValue()));
+
+        tlvHeader = new TlvHeader();
+        tlvHeader.setTlvLength(4);
+        tlvHeader.setTlvType(8);
+        UnreservedBandwidth unreservedBandwidth = new UnreservedBandwidth(tlvHeader);
+        tlv = SubTlvToBytes.tlvToBytes(unreservedBandwidth);
+        assertThat(tlv, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetricTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetricTest.java
new file mode 100644
index 0000000..0d7ff0c
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetricTest.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 org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+/**
+ * Unit test class for TrafficEngineeringMetric.
+ */
+public class TrafficEngineeringMetricTest {
+
+    private final byte[] packet = {0, 0, 1, 1};
+    private TrafficEngineeringMetric trafficEngineeringMetric;
+    private TlvHeader header;
+    private byte[] result;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        trafficEngineeringMetric = new TrafficEngineeringMetric(new TlvHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        trafficEngineeringMetric = null;
+        header = null;
+        result = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests trafficEngineeringMetric() setter method.
+     */
+    @Test
+    public void testSetTrafficEngineeringMetric() throws Exception {
+        trafficEngineeringMetric.setTrafficEngineeringMetric(123456789L);
+        assertThat(trafficEngineeringMetric, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        header = new TlvHeader();
+        header.setTlvLength(4);
+        header.setTlvType(5);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        trafficEngineeringMetric = new TrafficEngineeringMetric(header);
+        trafficEngineeringMetric.readFrom(channelBuffer);
+        assertThat(trafficEngineeringMetric, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = trafficEngineeringMetric.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLinkSubTypeTlvBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLinkSubTypeTlvBodyAsByteArray() throws Exception {
+        result = trafficEngineeringMetric.tlvBodyAsBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(trafficEngineeringMetric.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidthTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidthTest.java
new file mode 100644
index 0000000..50c4c46
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidthTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.io.isispacket.tlv.subtlv;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for UnreservedBandwidth.
+ */
+public class UnreservedBandwidthTest {
+
+    private final byte[] packet = {0, 0, 0, 1};
+    private UnreservedBandwidth unreservedBandwidth;
+    private TlvHeader header;
+    private byte[] result;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        unreservedBandwidth = new UnreservedBandwidth(new TlvHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        unreservedBandwidth = null;
+        header = null;
+        result = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(unreservedBandwidth.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests addUnReservedBandwidth() method.
+     */
+    @Test
+    public void testAddUnReservedBandwidth() throws Exception {
+        unreservedBandwidth.addUnReservedBandwidth(123456.78f);
+        assertThat(unreservedBandwidth, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        header = new TlvHeader();
+        header.setTlvLength(4);
+        header.setTlvType(8);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        unreservedBandwidth = new UnreservedBandwidth(header);
+        unreservedBandwidth.readFrom(channelBuffer);
+        unreservedBandwidth.readFrom(channelBuffer);
+        assertThat(unreservedBandwidth, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = unreservedBandwidth.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLinkSubTypeTlvBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLinkSubTypeTlvBodyAsByteArray() throws Exception {
+        result = unreservedBandwidth.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+}
\ No newline at end of file
