diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisNeighbor.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisNeighbor.java
index 3180c5d..7fac0cb 100755
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisNeighbor.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisNeighbor.java
@@ -45,7 +45,8 @@
     private String neighborSystemId;
     private Ip4Address interfaceIp;
     private MacAddress neighborMacAddress;
-    private int holdingTime;
+    private volatile int holdingTime;
+    private int neighborDownInterval;
     private IsisRouterType routerType;
     private String l1LanId;
     private String l2LanId;
@@ -54,6 +55,8 @@
     private IsisInterfaceState neighborState = IsisInterfaceState.INITIAL;
     private InternalInactivityTimeCheck inActivityTimeCheckTask;
     private ScheduledExecutorService exServiceInActivity;
+    private InternalHoldingTimeCheck holdingTimeCheckTask;
+    private ScheduledExecutorService exServiceHoldingTimeCheck;
     private boolean inActivityTimerScheduled = false;
     private IsisInterface isisInterface;
 
@@ -72,6 +75,7 @@
         this.interfaceIp = (helloMessage.interfaceIpAddresses() != null) ?
                 interfaceIpAddresses.get(0) : IsisConstants.DEFAULTIP;
         this.holdingTime = helloMessage.holdingTime();
+        neighborDownInterval = holdingTime;
         this.routerType = IsisRouterType.get(helloMessage.circuitType());
         if (helloMessage instanceof L1L2HelloPdu) {
             if (IsisPduType.L1HELLOPDU == helloMessage.isisPduType()) {
@@ -83,6 +87,7 @@
             this.localCircuitId = ((P2PHelloPdu) helloMessage).localCircuitId();
         }
         this.isisInterface = isisInterface;
+        startHoldingTimeCheck();
     }
 
     /**
@@ -244,7 +249,7 @@
      * @param l2LanId L2 lan ID
      */
     public void setL2LanId(String l2LanId) {
-        this.l1LanId = l1LanId;
+        this.l2LanId = l2LanId;
     }
 
     /**
@@ -293,6 +298,25 @@
     }
 
     /**
+     * Starts the holding time check timer.
+     */
+    public void startHoldingTimeCheck() {
+        log.debug("IsisNeighbor::startHoldingTimeCheck");
+        holdingTimeCheckTask = new InternalHoldingTimeCheck();
+        exServiceHoldingTimeCheck = Executors.newSingleThreadScheduledExecutor();
+        exServiceHoldingTimeCheck.scheduleAtFixedRate(holdingTimeCheckTask, 1,
+                                                      1, TimeUnit.SECONDS);
+    }
+
+    /**
+     * Stops the holding time check timer.
+     */
+    public void stopHoldingTimeCheck() {
+        log.debug("IsisNeighbor::stopHoldingTimeCheck ");
+        exServiceHoldingTimeCheck.shutdown();
+    }
+
+    /**
      * Starts the inactivity timer.
      */
     public void startInactivityTimeCheck() {
@@ -300,8 +324,8 @@
             log.debug("IsisNeighbor::startInactivityTimeCheck");
             inActivityTimeCheckTask = new InternalInactivityTimeCheck();
             exServiceInActivity = Executors.newSingleThreadScheduledExecutor();
-            exServiceInActivity.scheduleAtFixedRate(inActivityTimeCheckTask, holdingTime,
-                                                    holdingTime, TimeUnit.SECONDS);
+            exServiceInActivity.scheduleAtFixedRate(inActivityTimeCheckTask, neighborDownInterval,
+                                                    neighborDownInterval, TimeUnit.SECONDS);
             inActivityTimerScheduled = true;
         }
     }
@@ -328,6 +352,8 @@
         isisInterface.setL2LanId(IsisConstants.DEFAULTLANID);
 
         neighborState = IsisInterfaceState.DOWN;
+        stopInactivityTimeCheck();
+        stopHoldingTimeCheck();
         isisInterface.removeNeighbor(this);
     }
 
@@ -347,4 +373,20 @@
             neighborDown();
         }
     }
+
+    /**
+     * Represents a Task which will decrement holding time for this neighbor.
+     */
+    private class InternalHoldingTimeCheck implements Runnable {
+        /**
+         * Creates an instance.
+         */
+        InternalHoldingTimeCheck() {
+        }
+
+        @Override
+        public void run() {
+            holdingTime--;
+        }
+    }
 }
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdb.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdb.java
index 33a0a17..8a58269 100755
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdb.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdb.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.isis.controller.impl.lsdb;
 
+import org.jboss.netty.buffer.ChannelBuffers;
 import org.onosproject.isis.controller.IsisInterface;
 import org.onosproject.isis.controller.IsisLsdb;
 import org.onosproject.isis.controller.IsisLsdbAge;
@@ -24,6 +25,7 @@
 import org.onosproject.isis.controller.LspWrapper;
 import org.onosproject.isis.io.isispacket.pdu.LsPdu;
 import org.onosproject.isis.io.util.IsisConstants;
+import org.onosproject.isis.io.util.IsisUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,6 +43,9 @@
     private Map<String, LspWrapper> isisL1Db = new ConcurrentHashMap<>();
     private Map<String, LspWrapper> isisL2Db = new ConcurrentHashMap<>();
     private IsisLsdbAge lsdbAge = null;
+
+
+
     private int l1LspSeqNo = IsisConstants.STARTLSSEQUENCENUM;
     private int l2LspSeqNo = IsisConstants.STARTLSSEQUENCENUM;
 
@@ -59,6 +64,23 @@
     }
 
     /**
+     * Sets the level 1 link state sequence number.
+     *
+     * @param l1LspSeqNo link state sequence number
+     */
+    public void setL1LspSeqNo(int l1LspSeqNo) {
+        this.l1LspSeqNo = l1LspSeqNo;
+    }
+
+    /**
+     * Sets the level 2 link state sequence number.
+     *
+     * @param l2LspSeqNo link state sequence number
+     */
+    public void setL2LspSeqNo(int l2LspSeqNo) {
+        this.l2LspSeqNo = l2LspSeqNo;
+    }
+    /**
      * Returns the LSDB LSP key.
      *
      * @param systemId system ID
@@ -108,7 +130,7 @@
      * @return List of LSPs
      */
     public List<LspWrapper> allLspHeaders(boolean excludeMaxAgeLsp) {
-        List<LspWrapper> summaryList = new CopyOnWriteArrayList();
+        List<LspWrapper> summaryList = new CopyOnWriteArrayList<>();
         addLspToHeaderList(summaryList, excludeMaxAgeLsp, isisL1Db);
         addLspToHeaderList(summaryList, excludeMaxAgeLsp, isisL2Db);
 
@@ -187,9 +209,17 @@
      */
     public boolean addLsp(IsisMessage isisMessage, boolean isSelfOriginated, IsisInterface isisInterface) {
         LsPdu lspdu = (LsPdu) isisMessage;
+        if (isSelfOriginated) {
+            //Add length and checksum
+            byte[] lspBytes = lspdu.asBytes();
+            lspdu.setPduLength(lspBytes.length);
+            lspBytes = IsisUtil.addChecksum(lspBytes, IsisConstants.CHECKSUMPOSITION,
+                                            IsisConstants.CHECKSUMPOSITION + 1);
+            byte[] checkSum = {lspBytes[IsisConstants.CHECKSUMPOSITION], lspBytes[IsisConstants.CHECKSUMPOSITION + 1]};
+            lspdu.setCheckSum(ChannelBuffers.copiedBuffer(checkSum).readUnsignedShort());
+        }
         DefaultLspWrapper lspWrapper = new DefaultLspWrapper();
         lspWrapper.setLspAgeReceived(IsisConstants.LSPMAXAGE - lspdu.remainingLifeTime());
-        lspWrapper.setRemainingLifetime(IsisConstants.LSPMAXAGE - lsdbAge.ageCounter());
         lspWrapper.setLspType(IsisPduType.get(lspdu.pduType()));
         lspWrapper.setLsPdu(lspdu);
         lspWrapper.setAgeCounterWhenReceived(lsdbAge.ageCounter());
@@ -198,7 +228,6 @@
         lspWrapper.setIsisInterface(isisInterface);
         lspWrapper.setLsdbAge(lsdbAge);
         addLsp(lspWrapper, lspdu.lspId());
-
         log.debug("Added LSp In LSDB: {}", lspWrapper);
 
         return true;
@@ -217,9 +246,11 @@
 
         switch (lspWrapper.lsPdu().isisPduType()) {
             case L1LSPDU:
+                isisL1Db.remove(key);
                 isisL1Db.put(key, lspWrapper);
                 break;
             case L2LSPDU:
+                isisL2Db.remove(key);
                 isisL2Db.put(key, lspWrapper);
                 break;
             default:
@@ -228,7 +259,7 @@
         }
 
         //add it to bin
-        Integer binNumber = lsdbAge.age2Bin(IsisConstants.LSPMAXAGE - lspWrapper.remainingLifetime());
+        Integer binNumber = lsdbAge.age2Bin(IsisConstants.LSPMAXAGE - lspWrapper.lspAgeReceived());
         IsisLspBin lspBin = lsdbAge.getLspBin(binNumber);
         if (lspBin != null) {
             //remove from existing
@@ -264,7 +295,8 @@
     public String isNewerOrSameLsp(IsisMessage lsp1, IsisMessage lsp2) {
         LsPdu receivedLsp = (LsPdu) lsp1;
         LsPdu lspFromDb = (LsPdu) lsp2;
-        if (receivedLsp.sequenceNumber() > lspFromDb.sequenceNumber()) {
+        if (receivedLsp.sequenceNumber() > lspFromDb.sequenceNumber() ||
+                receivedLsp.checkSum() != lspFromDb.checkSum()) {
             return "latest";
         } else if (receivedLsp.sequenceNumber() < lspFromDb.sequenceNumber()) {
             return "old";
@@ -312,4 +344,4 @@
                 break;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/ControllerTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/ControllerTest.java
new file mode 100644
index 0000000..9a41bd3
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/ControllerTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.controller.impl;
+
+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 ControllerTest.
+ */
+public class ControllerTest {
+
+    private Controller controller;
+
+    @Before
+    public void setUp() throws Exception {
+        controller = new Controller();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        controller = null;
+    }
+
+    /**
+     * Tests isisDeactivate() method.
+     */
+    @Test(expected = Exception.class)
+    public void testIsisDeactivate() throws Exception {
+        controller.isisDeactivate();
+        assertThat(controller, is(notNullValue()));
+    }
+
+    /**
+     * Tests getAllConfiguredProcesses() method.
+     */
+    @Test
+    public void testGetAllConfiguredProcesses() throws Exception {
+        controller.getAllConfiguredProcesses();
+        assertThat(controller, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisControllerTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisControllerTest.java
new file mode 100644
index 0000000..915727d
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisControllerTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.impl;
+
+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 case for DefaultIsisController.
+ */
+public class DefaultIsisControllerTest {
+    private DefaultIsisController defaultIsisController;
+
+    @Before
+    public void setUp() throws Exception {
+        defaultIsisController = new DefaultIsisController();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        defaultIsisController = null;
+    }
+
+    /**
+     * Tests activate() method.
+     */
+    @Test
+    public void testActivate() throws Exception {
+        defaultIsisController.activate();
+        assertThat(defaultIsisController, is(notNullValue()));
+    }
+
+    /**
+     * Tests deactivate() method.
+     */
+    @Test(expected = Exception.class)
+    public void testDeactivate() throws Exception {
+        defaultIsisController.activate();
+        defaultIsisController.deactivate();
+        assertThat(defaultIsisController, is(notNullValue()));
+    }
+
+    /**
+     * Tests allConfiguredProcesses() method.
+     */
+    @Test
+    public void testAllConfiguredProcesses() throws Exception {
+        defaultIsisController.allConfiguredProcesses();
+        assertThat(defaultIsisController, is(notNullValue()));
+    }
+}
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisInterfaceTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisInterfaceTest.java
new file mode 100644
index 0000000..7e7749f
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisInterfaceTest.java
@@ -0,0 +1,486 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.impl;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.IsisInterfaceState;
+import org.onosproject.isis.controller.IsisLsdb;
+import org.onosproject.isis.controller.IsisNeighbor;
+import org.onosproject.isis.controller.IsisNetworkType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.pdu.HelloPdu;
+import org.onosproject.isis.io.isispacket.pdu.L1L2HelloPdu;
+
+import java.util.Set;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test case for DefaultIsisInterface.
+ */
+public class DefaultIsisInterfaceTest {
+    private final MacAddress macAddress = MacAddress.valueOf("AA:BB:CC:DD:EE:FF");
+    private final Ip4Address ip4Address = Ip4Address.valueOf("10.10.10.10");
+    private final byte[] mask = {
+            (byte) 255, (byte) 255, (byte) 255, (byte) 224
+    };
+    private final String intSysName = "ROUTER";
+    private final String sysId = "1111.1111.1111";
+    private final String areaAddr = "49.002";
+    private IsisInterfaceState resultIfState;
+    private DefaultIsisInterface defaultIsisInterface;
+    private HelloPdu helloPdu;
+    private IsisHeader isisHeader;
+    private IsisInterface isisInterface;
+    private Set<MacAddress> resultSet;
+    private int resultInt;
+    private IsisLsdb resultLsdb;
+    private IsisNeighbor resultNeighborList;
+    private Ip4Address resultIPv4Addr;
+    private MacAddress resultMacAddr;
+    private byte[] resultByteArr;
+    private String resultStr;
+    private IsisNetworkType resultNwType;
+
+
+    @Before
+    public void setUp() throws Exception {
+        defaultIsisInterface = new DefaultIsisInterface();
+        isisHeader = new IsisHeader();
+        isisHeader.setIrpDiscriminator((byte) 1);
+        helloPdu = new L1L2HelloPdu(isisHeader);
+        isisInterface = new DefaultIsisInterface();
+        resultNeighborList = new DefaultIsisNeighbor(helloPdu, isisInterface);
+
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        defaultIsisInterface = null;
+        helloPdu = null;
+        isisInterface = null;
+        resultNeighborList = null;
+    }
+
+    /**
+     * Tests interfaceIndex() getter method.
+     */
+    @Test
+    public void testInterfaceIndex() throws Exception {
+        defaultIsisInterface.setInterfaceIndex(2);
+        resultInt = defaultIsisInterface.interfaceIndex();
+        assertThat(resultInt, is(2));
+    }
+
+    /**
+     * Tests interfaceIndex() setter method.
+     */
+    @Test
+    public void testSetInterfaceIndex() throws Exception {
+        defaultIsisInterface.setInterfaceIndex(2);
+        resultInt = defaultIsisInterface.interfaceIndex();
+        assertThat(resultInt, is(2));
+
+    }
+
+    /**
+     * Tests interfaceIpAddress() getter method.
+     */
+    @Test
+    public void testInterfaceIpAddress() throws Exception {
+        defaultIsisInterface.setInterfaceIpAddress(ip4Address);
+        resultIPv4Addr = defaultIsisInterface.interfaceIpAddress();
+        assertThat(resultIPv4Addr, is(ip4Address));
+    }
+
+    /**
+     * Tests interfaceIpAddress() setter method.
+     */
+    @Test
+    public void testSetInterfaceIpAddress() throws Exception {
+        defaultIsisInterface.setInterfaceIpAddress(ip4Address);
+        resultIPv4Addr = defaultIsisInterface.interfaceIpAddress();
+        assertThat(resultIPv4Addr, is(ip4Address));
+    }
+
+    /**
+     * Tests networkMask() getter method.
+     */
+    @Test
+    public void testNetworkMask() throws Exception {
+        defaultIsisInterface.setNetworkMask(mask);
+        resultByteArr = defaultIsisInterface.networkMask();
+        assertThat(resultByteArr, is(mask));
+    }
+
+    /**
+     * Tests networkMask() setter method.
+     */
+    @Test
+    public void testSetNetworkMask() throws Exception {
+        defaultIsisInterface.setNetworkMask(mask);
+        resultByteArr = defaultIsisInterface.networkMask();
+        assertThat(resultByteArr, is(mask));
+    }
+
+    /**
+     * Tests getInterfaceMacAddress() getter method.
+     */
+    @Test
+    public void testGetInterfaceMacAddress() throws Exception {
+        defaultIsisInterface.setInterfaceMacAddress(macAddress);
+        resultMacAddr = defaultIsisInterface.getInterfaceMacAddress();
+        assertThat(resultMacAddr, is(macAddress));
+    }
+
+    /**
+     * Tests getInterfaceMacAddress() setter method.
+     */
+    @Test
+    public void testSetInterfaceMacAddress() throws Exception {
+        defaultIsisInterface.setInterfaceMacAddress(macAddress);
+        resultMacAddr = defaultIsisInterface.getInterfaceMacAddress();
+        assertThat(resultMacAddr, is(macAddress));
+    }
+
+    /**
+     * Tests intermediateSystemName() getter method.
+     */
+    @Test
+    public void testIntermediateSystemName() throws Exception {
+        defaultIsisInterface.setIntermediateSystemName(intSysName);
+        resultStr = defaultIsisInterface.intermediateSystemName();
+        assertThat(resultStr, is(intSysName));
+    }
+
+    /**
+     * Tests intermediateSystemName() setter method.
+     */
+    @Test
+    public void testSetIntermediateSystemName() throws Exception {
+        defaultIsisInterface.setIntermediateSystemName(intSysName);
+        resultStr = defaultIsisInterface.intermediateSystemName();
+        assertThat(resultStr, is(intSysName));
+    }
+
+    /**
+     * Tests systemId() getter method.
+     */
+    @Test
+    public void testSystemId() throws Exception {
+        defaultIsisInterface.setSystemId(sysId);
+        resultStr = defaultIsisInterface.systemId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests systemId() setter method.
+     */
+    @Test
+    public void testSetSystemId() throws Exception {
+        defaultIsisInterface.setSystemId(sysId);
+        resultStr = defaultIsisInterface.systemId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests l1LanId() getter method.
+     */
+    @Test
+    public void testL1LanId() throws Exception {
+        defaultIsisInterface.setL1LanId(sysId);
+        resultStr = defaultIsisInterface.l1LanId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests l1LanId() setter method.
+     */
+    @Test
+    public void testSetL1LanId() throws Exception {
+        defaultIsisInterface.setL1LanId(sysId);
+        resultStr = defaultIsisInterface.l1LanId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests l2LanId() getter method.
+     */
+    @Test
+    public void testL2LanId() throws Exception {
+        defaultIsisInterface.setL2LanId(sysId);
+        resultStr = defaultIsisInterface.l2LanId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests l2LanId() setter method.
+     */
+    @Test
+    public void testSetL2LanId() throws Exception {
+        defaultIsisInterface.setL2LanId(sysId);
+        resultStr = defaultIsisInterface.l2LanId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests getIdLength() getter method.
+     */
+    @Test
+    public void testGetIdLength() throws Exception {
+        defaultIsisInterface.setIdLength(8);
+        resultInt = defaultIsisInterface.getIdLength();
+        assertThat(resultInt, is(8));
+    }
+
+    /**
+     * Tests getIdLength() setter method.
+     */
+    @Test
+    public void testSetIdLength() throws Exception {
+        defaultIsisInterface.setIdLength(8);
+        resultInt = defaultIsisInterface.getIdLength();
+        assertThat(resultInt, is(8));
+    }
+
+    /**
+     * Tests getMaxAreaAddresses() getter method.
+     */
+    @Test
+    public void testGetMaxAreaAddresses() throws Exception {
+        defaultIsisInterface.setMaxAreaAddresses(3);
+        resultInt = defaultIsisInterface.getMaxAreaAddresses();
+        assertThat(resultInt, is(3));
+    }
+
+    /**
+     * Tests getMaxAreaAddresses() setter method.
+     */
+    @Test
+    public void testSetMaxAreaAddresses() throws Exception {
+        defaultIsisInterface.setMaxAreaAddresses(3);
+        resultInt = defaultIsisInterface.getMaxAreaAddresses();
+        assertThat(resultInt, is(3));
+    }
+
+    /**
+     * Tests setReservedPacketCircuitType() getter method.
+     */
+    @Test
+    public void testReservedPacketCircuitType() throws Exception {
+        defaultIsisInterface.setReservedPacketCircuitType(1);
+        resultInt = defaultIsisInterface.reservedPacketCircuitType();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests setReservedPacketCircuitType() setter method.
+     */
+    @Test
+    public void testSetReservedPacketCircuitType() throws Exception {
+        defaultIsisInterface.setReservedPacketCircuitType(1);
+        resultInt = defaultIsisInterface.reservedPacketCircuitType();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests networkType() getter method.
+     */
+    @Test
+    public void testNetworkType() throws Exception {
+        defaultIsisInterface.setNetworkType(IsisNetworkType.BROADCAST);
+        resultNwType = defaultIsisInterface.networkType();
+        assertThat(resultNwType, is(IsisNetworkType.BROADCAST));
+    }
+
+    /**
+     * Tests networkType() setter method.
+     */
+    @Test
+    public void testSetNetworkType() throws Exception {
+        defaultIsisInterface.setNetworkType(IsisNetworkType.BROADCAST);
+        resultNwType = defaultIsisInterface.networkType();
+        assertThat(resultNwType, is(IsisNetworkType.BROADCAST));
+    }
+
+    /**
+     * Tests areaAddress() getter method.
+     */
+    @Test
+    public void testAreaAddress() throws Exception {
+        defaultIsisInterface.setAreaAddress(areaAddr);
+        resultStr = defaultIsisInterface.areaAddress();
+        assertThat(resultStr, is(areaAddr));
+    }
+
+    /**
+     * Tests areaAddress() setter method.
+     */
+    @Test
+    public void testSetAreaAddress() throws Exception {
+        defaultIsisInterface.setAreaAddress(areaAddr);
+        resultStr = defaultIsisInterface.areaAddress();
+        assertThat(resultStr, is(areaAddr));
+    }
+
+    /**
+     * Tests getAreaLength() getter method.
+     */
+
+    @Test
+    public void testGetAreaLength() throws Exception {
+        defaultIsisInterface.setAreaLength(3);
+        resultInt = defaultIsisInterface.getAreaLength();
+        assertThat(resultInt, is(3));
+    }
+
+    /**
+     * Tests getAreaLength() setter method.
+     */
+    @Test
+    public void testSetAreaLength() throws Exception {
+        defaultIsisInterface.setAreaLength(3);
+        resultInt = defaultIsisInterface.getAreaLength();
+        assertThat(resultInt, is(3));
+    }
+
+    /**
+     * Tests getLspId() getter method.
+     */
+    @Test
+    public void testGetLspId() throws Exception {
+        defaultIsisInterface.setLspId(sysId);
+        resultStr = defaultIsisInterface.getLspId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests getLspId() setter method.
+     */
+    @Test
+    public void testSetLspId() throws Exception {
+        defaultIsisInterface.setLspId(sysId);
+        resultStr = defaultIsisInterface.getLspId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests holdingTime() getter method.
+     */
+    @Test
+    public void testHoldingTime() throws Exception {
+        defaultIsisInterface.setHoldingTime(10);
+        resultInt = defaultIsisInterface.holdingTime();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests holdingTime() setter method.
+     */
+    @Test
+    public void testSetHoldingTime() throws Exception {
+        defaultIsisInterface.setHoldingTime(10);
+        resultInt = defaultIsisInterface.holdingTime();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests priority() getter method.
+     */
+    @Test
+    public void testPriority() throws Exception {
+        defaultIsisInterface.setPriority(1);
+        resultInt = defaultIsisInterface.priority();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests priority() setter method.
+     */
+    @Test
+    public void testSetPriority() throws Exception {
+        defaultIsisInterface.setPriority(1);
+        resultInt = defaultIsisInterface.priority();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests helloInterval() getter method.
+     */
+    @Test
+    public void testHelloInterval() throws Exception {
+        defaultIsisInterface.setHelloInterval(10);
+        resultInt = defaultIsisInterface.helloInterval();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests helloInterval() setter method.
+     */
+    @Test
+    public void testSetHelloInterval() throws Exception {
+        defaultIsisInterface.setHelloInterval(10);
+        resultInt = defaultIsisInterface.helloInterval();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests interfaceState() getter method.
+     */
+    @Test
+    public void testInterfaceState() throws Exception {
+        defaultIsisInterface.setInterfaceState(IsisInterfaceState.UP);
+        resultIfState = defaultIsisInterface.interfaceState();
+        assertThat(resultIfState, is(IsisInterfaceState.UP));
+    }
+
+    /**
+     * Tests interfaceState() setter method.
+     */
+    @Test
+    public void testSetInterfaceState() throws Exception {
+        defaultIsisInterface.setInterfaceState(IsisInterfaceState.UP);
+        resultIfState = defaultIsisInterface.interfaceState();
+        assertThat(resultIfState, is(IsisInterfaceState.UP));
+    }
+
+    /**
+     * Tests setCircuitId() getter method.
+     */
+    @Test
+    public void testCircuitId() throws Exception {
+        defaultIsisInterface.setCircuitId(sysId);
+        resultStr = defaultIsisInterface.circuitId();
+        assertThat(resultStr, is(sysId));
+    }
+
+    /**
+     * Tests setCircuitId() setter method.
+     */
+    @Test
+    public void testSetCircuitId() throws Exception {
+        defaultIsisInterface.setCircuitId(sysId);
+        resultStr = defaultIsisInterface.circuitId();
+        assertThat(resultStr, is(sysId));
+    }
+}
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisNeighborTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisNeighborTest.java
new file mode 100644
index 0000000..fe9b867
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisNeighborTest.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.impl;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.IsisInterfaceState;
+import org.onosproject.isis.controller.IsisMessage;
+import org.onosproject.isis.controller.IsisRouterType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.pdu.HelloPdu;
+import org.onosproject.isis.io.isispacket.pdu.L1L2HelloPdu;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for DefaultIsisNeighbor.
+ */
+public class DefaultIsisNeighborTest {
+
+    private final String areaId = "490001";
+    private final String systemId = "2929.2929.2929";
+    private final String lanId = "0000.0000.0000.00";
+    private DefaultIsisNeighbor isisNeighbor;
+    private IsisInterface isisInterface;
+    private IsisMessage isisMessage;
+    private IsisHeader isisHeader;
+    private int result;
+    private String result1;
+    private Ip4Address interfaceIp = Ip4Address.valueOf("10.10.10.10");
+    private Ip4Address result2;
+    private MacAddress macAddress = MacAddress.valueOf("a4:23:05:00:00:00");
+    private MacAddress result3;
+    private IsisRouterType isisRouterType;
+    private IsisInterfaceState isisInterfaceState;
+    private byte result4;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        isisMessage = new L1L2HelloPdu(isisHeader);
+        isisInterface = new DefaultIsisInterface();
+        isisNeighbor = new DefaultIsisNeighbor((HelloPdu) isisMessage, isisInterface);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        isisMessage = null;
+        isisInterface = null;
+        isisNeighbor = null;
+    }
+
+    /**
+     * Tests localExtendedCircuitId() getter method.
+     */
+    @Test
+    public void testLocalExtendedCircuitId() throws Exception {
+        isisNeighbor.setLocalExtendedCircuitId(1);
+        result = isisNeighbor.localExtendedCircuitId();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests localExtendedCircuitId() setter method.
+     */
+    @Test
+    public void testSetLocalExtendedCircuitId() throws Exception {
+        isisNeighbor.setLocalExtendedCircuitId(1);
+        result = isisNeighbor.localExtendedCircuitId();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests neighborAreaId() getter method.
+     */
+    @Test
+    public void testNeighborAreaId() throws Exception {
+        isisNeighbor.setNeighborAreaId(areaId);
+        result1 = isisNeighbor.neighborAreaId();
+        assertThat(result1, is(areaId));
+    }
+
+    /**
+     * Tests neighborAreaId() setter method.
+     */
+    @Test
+    public void testSetNeighborAreaId() throws Exception {
+        isisNeighbor.setNeighborAreaId(areaId);
+        result1 = isisNeighbor.neighborAreaId();
+        assertThat(result1, is(areaId));
+    }
+
+    /**
+     * Tests neighborSystemId() getter method.
+     */
+    @Test
+    public void testNeighborSystemId() throws Exception {
+        isisNeighbor.setNeighborSystemId(systemId);
+        result1 = isisNeighbor.neighborSystemId();
+        assertThat(result1, is(systemId));
+    }
+
+    /**
+     * Tests neighborSystemId() setter method.
+     */
+    @Test
+    public void testSetNeighborSystemId() throws Exception {
+        isisNeighbor.setNeighborSystemId(systemId);
+        result1 = isisNeighbor.neighborSystemId();
+        assertThat(result1, is(systemId));
+    }
+
+    /**
+     * Tests interfaceIp() getter method.
+     */
+    @Test
+    public void testInterfaceIp() throws Exception {
+        isisNeighbor.setInterfaceIp(interfaceIp);
+        result2 = isisNeighbor.interfaceIp();
+        assertThat(result2, is(interfaceIp));
+    }
+
+    /**
+     * Tests interfaceIp() setter method.
+     */
+    @Test
+    public void testSetInterfaceIp() throws Exception {
+        isisNeighbor.setInterfaceIp(interfaceIp);
+        result2 = isisNeighbor.interfaceIp();
+        assertThat(result2, is(interfaceIp));
+    }
+
+    /**
+     * Tests neighborMacAddress() getter method.
+     */
+    @Test
+    public void testNeighborMacAddress() throws Exception {
+        isisNeighbor.setNeighborMacAddress(macAddress);
+        result3 = isisNeighbor.neighborMacAddress();
+        assertThat(result3, is(macAddress));
+    }
+
+    /**
+     * Tests neighborMacAddress() setter method.
+     */
+    @Test
+    public void testSetNeighborMacAddress() throws Exception {
+        isisNeighbor.setNeighborMacAddress(macAddress);
+        result3 = isisNeighbor.neighborMacAddress();
+        assertThat(result3, is(macAddress));
+    }
+
+    /**
+     * Tests holdingTime() getter method.
+     */
+    @Test
+    public void testHoldingTime() throws Exception {
+        isisNeighbor.setHoldingTime(1);
+        result = isisNeighbor.holdingTime();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests holdingTime() setter method.
+     */
+    @Test
+    public void testSetHoldingTime() throws Exception {
+        isisNeighbor.setHoldingTime(1);
+        result = isisNeighbor.holdingTime();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests routerType() getter method.
+     */
+    @Test
+    public void testRouterType() throws Exception {
+        isisNeighbor.setRouterType(IsisRouterType.L1);
+        isisRouterType = isisNeighbor.routerType();
+        assertThat(isisRouterType, is(IsisRouterType.L1));
+    }
+
+    /**
+     * Tests routerType() setter method.
+     */
+    @Test
+    public void testSetRouterType() throws Exception {
+        isisNeighbor.setRouterType(IsisRouterType.L1);
+        isisRouterType = isisNeighbor.routerType();
+        assertThat(isisRouterType, is(IsisRouterType.L1));
+    }
+
+    /**
+     * Tests l1LanId() getter method.
+     */
+    @Test
+    public void testL1LanId() throws Exception {
+        isisNeighbor.setL1LanId(systemId);
+        result1 = isisNeighbor.l1LanId();
+        assertThat(result1, is(systemId));
+    }
+
+    /**
+     * Tests l1LanId() setter method.
+     */
+    @Test
+    public void testSetL1LanId() throws Exception {
+        isisNeighbor.setL1LanId(lanId);
+        result1 = isisNeighbor.l1LanId();
+        assertThat(result1, is(lanId));
+    }
+
+    /**
+     * Tests l2LanId() getter method.
+     */
+    @Test
+    public void testL2LanId() throws Exception {
+        isisNeighbor.setL2LanId(lanId);
+        result1 = isisNeighbor.l2LanId();
+        assertThat(result1, is(lanId));
+    }
+
+    /**
+     * Tests l2LanId() setter method.
+     */
+    @Test
+    public void testSetL2LanId() throws Exception {
+        isisNeighbor.setL2LanId(lanId);
+        result1 = isisNeighbor.l2LanId();
+        assertThat(result1, is(lanId));
+    }
+
+    /**
+     * Tests neighborState() getter method.
+     */
+    @Test
+    public void testInterfaceState() throws Exception {
+        isisNeighbor.setNeighborState(IsisInterfaceState.DOWN);
+        isisInterfaceState = isisNeighbor.neighborState();
+        assertThat(isisInterfaceState, is(IsisInterfaceState.DOWN));
+    }
+
+    /**
+     * Tests neighborState() setter method.
+     */
+    @Test
+    public void testSetNeighborState() throws Exception {
+        isisNeighbor.setNeighborState(IsisInterfaceState.DOWN);
+        isisInterfaceState = isisNeighbor.neighborState();
+        assertThat(isisInterfaceState, is(IsisInterfaceState.DOWN));
+    }
+
+    /**
+     * Tests localCircuitId() getter method.
+     */
+    @Test
+    public void testLocalCircuitId() throws Exception {
+        isisNeighbor.setLocalCircuitId((byte) 1);
+        result4 = isisNeighbor.localCircuitId();
+        assertThat(result4, is((byte) 1));
+    }
+
+    /**
+     * Tests localCircuitId() setter method.
+     */
+    @Test
+    public void testSetLocalCircuitId() throws Exception {
+        isisNeighbor.setLocalCircuitId((byte) 1);
+        result4 = isisNeighbor.localCircuitId();
+        assertThat(result4, is((byte) 1));
+    }
+
+    /**
+     * Tests neighborState() getter method.
+     */
+    @Test
+    public void testNeighborState() throws Exception {
+        isisNeighbor.setNeighborState(IsisInterfaceState.DOWN);
+        isisInterfaceState = isisNeighbor.neighborState();
+        assertThat(isisInterfaceState, is(IsisInterfaceState.DOWN));
+    }
+
+    /**
+     * Tests startHoldingTimeCheck() method.
+     */
+    @Test
+    public void testStartHoldingTimeCheck() throws Exception {
+        isisNeighbor.startHoldingTimeCheck();
+        assertThat(isisNeighbor, is(notNullValue()));
+    }
+
+    /**
+     * Tests stopHoldingTimeCheck() method.
+     */
+    @Test
+    public void testStopHoldingTimeCheck() throws Exception {
+        isisNeighbor.stopHoldingTimeCheck();
+        assertThat(isisNeighbor, is(notNullValue()));
+    }
+
+    /**
+     * Tests startInactivityTimeCheck() method.
+     */
+    @Test(expected = Exception.class)
+    public void testStartInactivityTimeCheck() throws Exception {
+        isisNeighbor.startInactivityTimeCheck();
+        assertThat(isisNeighbor, is(notNullValue()));
+    }
+
+    /**
+     * Tests startInactivityTimeCheck() method.
+     */
+    @Test(expected = Exception.class)
+    public void testStopInactivityTimeCheck() throws Exception {
+        isisNeighbor.startInactivityTimeCheck();
+        assertThat(isisNeighbor, is(notNullValue()));
+    }
+
+    /**
+     * Tests neighborDown() method.
+     */
+    @Test(expected = Exception.class)
+    public void testNeighborDown() throws Exception {
+        isisNeighbor.neighborDown();
+        assertThat(isisNeighbor, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisProcessTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisProcessTest.java
new file mode 100644
index 0000000..3c16a14
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/DefaultIsisProcessTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.controller.impl;
+
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.IsisProcess;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for DefaultIsisProcess.
+ */
+public class DefaultIsisProcessTest {
+
+    private final String processId = "1";
+    private IsisProcess isisProcess;
+    private String result;
+    private IsisInterface isisInterface;
+    private List<IsisInterface> isisInterfaceList;
+    private List<IsisInterface> result1;
+
+    @Before
+    public void setUp() throws Exception {
+        isisProcess = new DefaultIsisProcess();
+        isisInterface = EasyMock.createNiceMock(DefaultIsisInterface.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisProcess = null;
+    }
+
+    /**
+     * Tests processId() setter method.
+     */
+    @Test
+    public void testProcessId() throws Exception {
+        isisProcess.setProcessId(processId);
+        result = isisProcess.processId();
+        assertThat(result, is(processId));
+    }
+
+    /**
+     * Tests processId() getter method.
+     */
+    @Test
+    public void testSetProcessId() throws Exception {
+        isisProcess.setProcessId(processId);
+        result = isisProcess.processId();
+        assertThat(result, is(processId));
+    }
+
+    /**
+     * Tests isisInterfaceList() setter method.
+     */
+    @Test
+    public void testIsisInterfaceList() throws Exception {
+        isisProcess.setIsisInterfaceList(isisInterfaceList);
+        result1 = isisProcess.isisInterfaceList();
+        assertThat(result1, is(nullValue()));
+    }
+
+    /**
+     * Tests isisInterfaceList() getter method.
+     */
+    @Test
+    public void testSetIsisInterfaceList() throws Exception {
+        isisProcess.setIsisInterfaceList(isisInterfaceList);
+        result1 = isisProcess.isisInterfaceList();
+        assertThat(result1, is(nullValue()));
+    }
+}
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisChannelHandlerTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisChannelHandlerTest.java
new file mode 100644
index 0000000..1644b6e
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisChannelHandlerTest.java
@@ -0,0 +1,169 @@
+/*
+ * 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.controller.impl;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelStateEvent;
+import org.jboss.netty.channel.ExceptionEvent;
+import org.jboss.netty.channel.MessageEvent;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisMessage;
+import org.onosproject.isis.controller.IsisProcess;
+import org.onosproject.isis.io.isispacket.pdu.L1L2HelloPdu;
+
+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 IsisChannelHandler.
+ */
+public class IsisChannelHandlerTest {
+
+    private final String processId = "1";
+    private final byte[] config = {0, 0, 0, 0, 0, 0, 0};
+    private IsisChannelHandler isisChannelHandler;
+    private Controller controller;
+    private IsisProcess isisProcess;
+    private List<IsisProcess> isisProcessList;
+    private ChannelHandlerContext channelHandlerContext;
+    private ChannelStateEvent channelStateEvent;
+    private ExceptionEvent exceptionEvent;
+    private MessageEvent messageEvent;
+    private IsisMessage isisMessage;
+
+    @Before
+    public void setUp() throws Exception {
+        controller = EasyMock.createNiceMock(Controller.class);
+        isisProcess = EasyMock.createNiceMock(IsisProcess.class);
+        channelHandlerContext = EasyMock.createNiceMock(ChannelHandlerContext.class);
+        channelStateEvent = EasyMock.createNiceMock(ChannelStateEvent.class);
+        exceptionEvent = EasyMock.createNiceMock(ExceptionEvent.class);
+        messageEvent = EasyMock.createNiceMock(MessageEvent.class);
+        isisMessage = EasyMock.createNiceMock(L1L2HelloPdu.class);
+        isisMessage.setInterfaceIndex(2);
+        isisChannelHandler = new IsisChannelHandler(controller, isisProcessList);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisChannelHandler = null;
+    }
+
+    /**
+     * Tests initializeInterfaceMap() method.
+     */
+    @Test(expected = Exception.class)
+    public void testInitializeInterfaceMap() throws Exception {
+        isisChannelHandler.initializeInterfaceMap();
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests updateInterfaceMap() method.
+     */
+    @Test(expected = Exception.class)
+    public void testUpdateInterfaceMap() throws Exception {
+        isisChannelHandler.updateInterfaceMap(isisProcessList);
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests initializeInterfaceIpList() method.
+     */
+    @Test(expected = Exception.class)
+    public void testInitializeInterfaceIpList() throws Exception {
+        isisChannelHandler.initializeInterfaceIpList();
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests channelConnected() method.
+     */
+    @Test(expected = Exception.class)
+    public void testChannelConnected() throws Exception {
+        isisChannelHandler.channelConnected(channelHandlerContext, channelStateEvent);
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests channelDisconnected() method.
+     */
+    @Test
+    public void testChannelDisconnected() throws Exception {
+        isisChannelHandler.channelDisconnected(channelHandlerContext, channelStateEvent);
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests exceptionCaught() method.
+     */
+    @Test(expected = Exception.class)
+    public void testExceptionCaught() throws Exception {
+        isisChannelHandler.exceptionCaught(channelHandlerContext, exceptionEvent);
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests messageReceived() method.
+     */
+    @Test
+    public void testMessageReceived() throws Exception {
+        isisChannelHandler.messageReceived(channelHandlerContext, messageEvent);
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests processIsisMessage() method.
+     */
+    @Test(expected = Exception.class)
+    public void testProcessIsisMessage() throws Exception {
+        isisChannelHandler.processIsisMessage(isisMessage, channelHandlerContext);
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests startHelloSender() method.
+     */
+    @Test
+    public void testStartHelloSender() throws Exception {
+        isisChannelHandler.startHelloSender();
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests stopHelloSender() method.
+     */
+    @Test
+    public void testStopHelloSender() throws Exception {
+        isisChannelHandler.stopHelloSender();
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+
+    /**
+     * Tests sentConfigPacket() method.
+     */
+    @Test
+    public void testSentConfigPacket() throws Exception {
+        isisChannelHandler.sentConfigPacket(config);
+        assertThat(isisChannelHandler, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisHelloPduSenderTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisHelloPduSenderTest.java
new file mode 100644
index 0000000..85228b2
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisHelloPduSenderTest.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.controller.impl;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.channel.Channel;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.isis.controller.IsisNetworkType;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IsisHelloPduSender.
+ */
+public class IsisHelloPduSenderTest {
+    private final String systemId = "1234.1234.1234";
+    private final String areaId = "490001";
+    private final String circuitId = "0";
+    private final String lanId = "0000.0000.0000.00";
+    private Channel channel;
+    private DefaultIsisInterface isisInterface;
+    private DefaultIsisInterface isisInterface1;
+    private IsisHelloPduSender isisHelloPduSender;
+    private IsisHelloPduSender isisHelloPduSender1;
+    private Ip4Address interfaceAddress = Ip4Address.valueOf("10.10.10.10");
+
+    @Before
+    public void setUp() throws Exception {
+        channel = EasyMock.createNiceMock(Channel.class);
+        isisInterface = new DefaultIsisInterface();
+        isisInterface1 = new DefaultIsisInterface();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        channel = null;
+        isisInterface = null;
+    }
+
+    /**
+     * Tests run() method.
+     */
+    @Test
+    public void testRun() throws Exception {
+        isisInterface.setNetworkType(IsisNetworkType.P2P);
+        isisInterface.setCircuitId(circuitId);
+        isisInterface.setSystemId(systemId);
+        isisInterface.setAreaAddress("490001");
+        isisInterface.setInterfaceIpAddress(interfaceAddress);
+        isisHelloPduSender = new IsisHelloPduSender(channel, isisInterface);
+        isisHelloPduSender.run();
+        assertThat(isisHelloPduSender, is(notNullValue()));
+
+        isisInterface1.setNetworkType(IsisNetworkType.BROADCAST);
+        isisInterface1.setCircuitId(circuitId);
+        isisInterface1.setSystemId(systemId);
+        isisInterface1.setAreaAddress(areaId);
+        isisInterface1.setInterfaceIpAddress(interfaceAddress);
+        isisInterface1.setReservedPacketCircuitType(1);
+        isisInterface1.setL1LanId(lanId);
+        isisHelloPduSender1 = new IsisHelloPduSender(channel, isisInterface1);
+        isisHelloPduSender1.run();
+        assertThat(isisHelloPduSender1, is(notNullValue()));
+
+        isisInterface1.setNetworkType(IsisNetworkType.BROADCAST);
+        isisInterface1.setCircuitId(circuitId);
+        isisInterface1.setSystemId(systemId);
+        isisInterface1.setAreaAddress(areaId);
+        isisInterface1.setInterfaceIpAddress(interfaceAddress);
+        isisInterface1.setReservedPacketCircuitType(2);
+        isisInterface1.setL2LanId(lanId);
+        isisHelloPduSender1 = new IsisHelloPduSender(channel, isisInterface1);
+        isisHelloPduSender1.run();
+        assertThat(isisHelloPduSender1, is(notNullValue()));
+
+        isisInterface1.setNetworkType(IsisNetworkType.BROADCAST);
+        isisInterface1.setCircuitId(circuitId);
+        isisInterface1.setSystemId(systemId);
+        isisInterface1.setAreaAddress(areaId);
+        isisInterface1.setInterfaceIpAddress(interfaceAddress);
+        isisInterface1.setReservedPacketCircuitType(3);
+        isisInterface1.setL1LanId(lanId);
+        isisInterface1.setL2LanId(lanId);
+        isisHelloPduSender1 = new IsisHelloPduSender(channel, isisInterface1);
+        isisHelloPduSender1.run();
+        assertThat(isisHelloPduSender1, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisMessageDecoderTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisMessageDecoderTest.java
new file mode 100644
index 0000000..a2c32b9
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisMessageDecoderTest.java
@@ -0,0 +1,56 @@
+package org.onosproject.isis.controller.impl;
+
+import com.google.common.primitives.Bytes;
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for IsisMessageDecoder.
+ */
+public class IsisMessageDecoderTest {
+
+    private final byte[] hello = {
+            -125, 20, 1, 0, 17, 1, 0, 0,
+            2, 51, 51, 51, 51, 51, 51, 0, 100, 5, -39, -126, 1, 4, 3,
+            73, 0, 0, -127, 1, -52, -124, 4, -64, -88, 56, 102
+    };
+    private final String id = "127.0.0.1";
+    private IsisMessageDecoder isisMessageDecoder;
+    private ChannelHandlerContext ctx;
+    private Channel channel;
+    private SocketAddress socketAddress;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        isisMessageDecoder = new IsisMessageDecoder();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisMessageDecoder = null;
+    }
+
+    @Test
+    public void testDecode() throws Exception {
+        channel = EasyMock.createMock(Channel.class);
+        socketAddress = InetSocketAddress.createUnresolved(id, 7000);
+        byte[] array = IsisUtil.getPaddingTlvs(hello.length);
+        channelBuffer = ChannelBuffers.copiedBuffer(Bytes.concat(hello, array));
+        assertThat(isisMessageDecoder.decode(ctx, channel, channelBuffer), is(nullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisMessageEncoderTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisMessageEncoderTest.java
new file mode 100644
index 0000000..7738d78
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisMessageEncoderTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.controller.impl;
+
+import com.google.common.primitives.Bytes;
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for IsisMessageEncoder.
+ */
+public class IsisMessageEncoderTest {
+
+    private final String id = "127.0.0.1";
+    private final byte[] hello = {
+            -125, 20, 1, 0, 17, 1, 0, 0,
+            2, 51, 51, 51, 51, 51, 51, 0, 100, 5, -39, -126, 1, 4, 3,
+            73, 0, 0, -127, 1, -52, -124, 4, -64, -88, 56, 102
+    };
+    private IsisMessageEncoder isisMessageEncoder;
+    private ChannelHandlerContext ctx;
+    private Channel channel;
+    private SocketAddress socketAddress;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        channel = EasyMock.createMock(Channel.class);
+        isisMessageEncoder = new IsisMessageEncoder();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        channel = null;
+        isisMessageEncoder = null;
+    }
+
+    /**
+     * Tests encode() method.
+     */
+    @Test
+    public void testEncode() throws Exception {
+        socketAddress = InetSocketAddress.createUnresolved(id, 7000);
+        byte[] array = IsisUtil.getPaddingTlvs(hello.length);
+        channelBuffer = ChannelBuffers.copiedBuffer(Bytes.concat(hello, array));
+        assertThat(isisMessageEncoder.encode(ctx, channel, channelBuffer.array()),
+                   is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisPipelineFactoryTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisPipelineFactoryTest.java
new file mode 100644
index 0000000..77ced07
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/IsisPipelineFactoryTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.impl;
+
+import org.jboss.netty.channel.ChannelPipeline;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.IsisProcess;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IsisPipelineFactory.
+ */
+public class IsisPipelineFactoryTest {
+
+    private IsisPipelineFactory isisPipelineFactory;
+    private IsisChannelHandler isisChannelHandler;
+    private List<IsisProcess> isisProcessList = new ArrayList<>();
+    private Controller controller;
+    private ChannelPipeline channelPipeline;
+    private DefaultIsisProcess isisProcess;
+    private String processId = "1";
+    private DefaultIsisInterface isisInterface;
+    private List<IsisInterface> isisInterfaces = new ArrayList<>();
+
+    @Before
+    public void setUp() throws Exception {
+        controller = new Controller();
+        isisProcess = new DefaultIsisProcess();
+        isisInterface = new DefaultIsisInterface();
+        isisInterfaces.add(isisInterface);
+        isisProcess.setIsisInterfaceList(isisInterfaces);
+        isisProcess.setProcessId(processId);
+        isisProcessList.add(isisProcess);
+        isisChannelHandler = new IsisChannelHandler(controller, isisProcessList);
+        isisPipelineFactory = new IsisPipelineFactory(isisChannelHandler);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        controller = null;
+        isisChannelHandler = null;
+        isisPipelineFactory = null;
+    }
+
+    /**
+     * Tests getPipeline() method.
+     */
+    @Test
+    public void testGetPipeline() throws Exception {
+        channelPipeline = isisPipelineFactory.getPipeline();
+        assertThat(channelPipeline, is(instanceOf(ChannelPipeline.class)));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdbAgeTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdbAgeTest.java
new file mode 100644
index 0000000..45adbd9
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdbAgeTest.java
@@ -0,0 +1,171 @@
+/*
+ * 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.controller.impl.lsdb;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisLspBin;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.pdu.LsPdu;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test case for DefaultIsisLsdbAge.
+ */
+public class DefaultIsisLsdbAgeTest {
+    private DefaultIsisLsdbAge defaultIsisLsdbAge;
+    private IsisLspBin isisLspBin;
+    private int resultInt;
+    private IsisLspBin resultLspBin;
+    private DefaultLspWrapper lspWrapper;
+    private LsPdu lsPdu;
+    private IsisHeader isisHeader;
+    private String lspId = "1234.1234.1234";
+
+    @Before
+    public void setUp() throws Exception {
+        defaultIsisLsdbAge = new DefaultIsisLsdbAge();
+        isisLspBin = new DefaultIsisLspBin(1);
+        lspWrapper = new DefaultLspWrapper();
+        lspWrapper.setBinNumber(1);
+        isisHeader = new IsisHeader();
+        lsPdu = new LsPdu(isisHeader);
+        lsPdu.setLspId(lspId);
+        lspWrapper.setLsPdu(lsPdu);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        defaultIsisLsdbAge = null;
+        isisLspBin = null;
+    }
+
+    /**
+     * Tests ageCounter() method.
+     */
+    @Test
+    public void testAgeCounter() throws Exception {
+        resultInt = defaultIsisLsdbAge.ageCounter();
+        assertThat(resultInt, is(0));
+    }
+
+    /**
+     * Tests ageCounterRollOver() method.
+     */
+    @Test
+    public void testAgeCounterRollOver() throws Exception {
+        resultInt = defaultIsisLsdbAge.ageCounterRollOver();
+        assertThat(resultInt, is(0));
+    }
+
+    /**
+     * Tests addLspBin() method.
+     */
+    @Test
+    public void testAddLspBin() throws Exception {
+        defaultIsisLsdbAge.addLspBin(1400, isisLspBin);
+        resultLspBin = defaultIsisLsdbAge.getLspBin(1);
+        assertThat(resultLspBin, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLspBin() method.
+     */
+    @Test
+    public void testGetLspBin() throws Exception {
+        defaultIsisLsdbAge.addLspBin(1, isisLspBin);
+        resultLspBin = defaultIsisLsdbAge.getLspBin(1);
+        assertThat(resultLspBin, is(notNullValue()));
+    }
+
+    /**
+     * Tests removeLspFromBin() method.
+     */
+    @Test
+    public void testRemoveLspFromBin() throws Exception {
+        defaultIsisLsdbAge.addLspBin(1400, isisLspBin);
+        defaultIsisLsdbAge.removeLspFromBin(lspWrapper);
+        assertThat(resultLspBin, is(nullValue()));
+    }
+
+    /**
+     * Tests age2Bin() method.
+     */
+    @Test
+    public void testAge2Bin() throws Exception {
+        defaultIsisLsdbAge.age2Bin(1);
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+
+        defaultIsisLsdbAge.age2Bin(-1);
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+    }
+
+    /**
+     * Tests startDbAging() method.
+     */
+    @Test
+    public void testStartDbAging() throws Exception {
+        defaultIsisLsdbAge.startDbAging();
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+    }
+
+    /**
+     * Tests ageLsp() method.
+     */
+    @Test
+    public void testAgeLsp() throws Exception {
+        defaultIsisLsdbAge.age2Bin(1);
+        defaultIsisLsdbAge.startDbAging();
+        defaultIsisLsdbAge.ageLsp();
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+    }
+
+    /**
+     * Tests maxAgeLsa() method.
+     */
+    @Test
+    public void testMaxAgeLsa() throws Exception {
+        defaultIsisLsdbAge.age2Bin(1);
+        defaultIsisLsdbAge.startDbAging();
+        defaultIsisLsdbAge.maxAgeLsa();
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+
+        defaultIsisLsdbAge.age2Bin(1400);
+        defaultIsisLsdbAge.startDbAging();
+        defaultIsisLsdbAge.maxAgeLsa();
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+    }
+
+    /**
+     * Tests refreshLsa() method.
+     */
+    @Test
+    public void testRefreshLsa() throws Exception {
+        defaultIsisLsdbAge.age2Bin(1);
+        defaultIsisLsdbAge.startDbAging();
+        defaultIsisLsdbAge.refreshLsa();
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+
+        defaultIsisLsdbAge.age2Bin(1400);
+        defaultIsisLsdbAge.startDbAging();
+        defaultIsisLsdbAge.refreshLsa();
+        assertThat(defaultIsisLsdbAge, is(notNullValue()));
+    }
+}
+
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdbTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdbTest.java
new file mode 100644
index 0000000..d1c04fe
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLsdbTest.java
@@ -0,0 +1,133 @@
+/*
+ * 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.controller.impl.lsdb;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisLsdb;
+import org.onosproject.isis.controller.IsisLsdbAge;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.controller.LspWrapper;
+import org.onosproject.isis.io.util.IsisConstants;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test case for DefaultIsisLsdb.
+ */
+public class DefaultIsisLsdbTest {
+    private final int l1LspSeqNo = IsisConstants.STARTLSSEQUENCENUM;
+    private final int l2LspSeqNo = IsisConstants.STARTLSSEQUENCENUM;
+    private final String srcId = "1111.1111.1111";
+
+    private DefaultIsisLsdb defaultIsisLsdb;
+    private IsisLsdbAge lsdbAge = null;
+
+
+    private int resultInt;
+    private Map<String, LspWrapper> resultMap = new ConcurrentHashMap<>();
+    private IsisLsdb resultLsdb;
+    private LspWrapper resultLspWrapper;
+
+
+    @Before
+    public void setUp() throws Exception {
+        defaultIsisLsdb = new DefaultIsisLsdb();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        defaultIsisLsdb = null;
+    }
+
+    /**
+     * Tests initializeDb() method.
+     */
+    @Test
+    public void testInitializeDb() throws Exception {
+        defaultIsisLsdb.initializeDb();
+        assertThat(lsdbAge, is(nullValue()));
+    }
+
+    /**
+     * Tests setL1LspSeqNo() method.
+     */
+    @Test
+    public void testSetL1LspSeqNo() throws Exception {
+        defaultIsisLsdb.setL1LspSeqNo(l1LspSeqNo);
+        assertThat(defaultIsisLsdb, is(notNullValue()));
+    }
+
+    /**
+     * Tests setL2LspSeqNo() method.
+     */
+    @Test
+    public void testSetL2LspSeqNo() throws Exception {
+        defaultIsisLsdb.setL2LspSeqNo(l2LspSeqNo);
+        assertThat(defaultIsisLsdb, is(notNullValue()));
+    }
+
+    /**
+     * Tests setL2LspSeqNo() method.
+     */
+    @Test
+    public void testLspKey() throws Exception {
+        defaultIsisLsdb.lspKey(srcId);
+        assertThat(defaultIsisLsdb, is(notNullValue()));
+    }
+
+    /**
+     * Tests setL2LspSeqNo() method.
+     */
+    @Test
+    public void testGetL1Db() throws Exception {
+        resultMap = defaultIsisLsdb.getL1Db();
+        assertThat(resultMap.isEmpty(), is(true));
+    }
+
+    /**
+     * Tests setL2LspSeqNo() method.
+     */
+    @Test
+    public void testGetL2Db() throws Exception {
+        resultMap = defaultIsisLsdb.getL2Db();
+        assertThat(resultMap.isEmpty(), is(true));
+    }
+
+    /**
+     * Tests setL2LspSeqNo() method.
+     */
+    @Test
+    public void testIsisLsdb() throws Exception {
+        resultLsdb = defaultIsisLsdb.isisLsdb();
+        assertThat(resultLsdb, is(notNullValue()));
+    }
+
+    /**
+     * Tests findLsp() method.
+     */
+    @Test
+    public void testFindLsp() throws Exception {
+        resultLspWrapper = defaultIsisLsdb.findLsp(IsisPduType.L1HELLOPDU, srcId);
+        assertThat(resultLspWrapper, is(nullValue()));
+    }
+}
+
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLspBinTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLspBinTest.java
new file mode 100644
index 0000000..7dd2abb
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultIsisLspBinTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.controller.impl.lsdb;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.LspWrapper;
+
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test case for DefaultIsisLspBin.
+ */
+public class DefaultIsisLspBinTest {
+
+    private DefaultIsisLspBin defaultIsisLspBin;
+    private int result;
+    private String key = "1";
+    private LspWrapper lspWrapper;
+    private LspWrapper result1;
+    private Map<String, LspWrapper> listOfLsp;
+
+    @Before
+    public void setUp() throws Exception {
+        defaultIsisLspBin = new DefaultIsisLspBin(1);
+        lspWrapper = new DefaultLspWrapper();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        defaultIsisLspBin = null;
+    }
+
+    /**
+     * Tests addIsisLsp() method.
+     */
+    @Test
+    public void testAddIsisLsp() throws Exception {
+        defaultIsisLspBin.addIsisLsp(key, lspWrapper);
+        assertThat(defaultIsisLspBin, is(notNullValue()));
+    }
+
+    /**
+     * Tests isisLsp() method.
+     */
+    @Test
+    public void testIsisLsp() throws Exception {
+        defaultIsisLspBin.addIsisLsp(key, lspWrapper);
+        result1 = defaultIsisLspBin.isisLsp(key);
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests removeIsisLsp() method.
+     */
+    @Test
+    public void testRemoveIsisLsp() throws Exception {
+        defaultIsisLspBin.addIsisLsp(key, lspWrapper);
+        defaultIsisLspBin.removeIsisLsp(key, lspWrapper);
+        assertThat(defaultIsisLspBin, is(notNullValue()));
+    }
+
+    /**
+     * Tests listOfLsp() method.
+     */
+    @Test
+    public void testListOfLsp() throws Exception {
+        defaultIsisLspBin.addIsisLsp(key, lspWrapper);
+        listOfLsp = defaultIsisLspBin.listOfLsp();
+        assertThat(listOfLsp.size(), is(1));
+    }
+
+    /**
+     * Tests binNumber() method.
+     */
+    @Test
+    public void testBinNumber() throws Exception {
+        result = defaultIsisLspBin.binNumber();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(defaultIsisLspBin.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultLspWrapperTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultLspWrapperTest.java
new file mode 100644
index 0000000..617dece
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/DefaultLspWrapperTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.impl.lsdb;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.impl.DefaultIsisInterface;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test case for DefaultLspWrapper.
+ */
+public class DefaultLspWrapperTest {
+
+    private DefaultLspWrapper defaultLspWrapper;
+    private String processing = "processing";
+    private String result;
+    private int result1;
+    private IsisInterface isisInterface;
+    private IsisInterface result2;
+
+    @Before
+    public void setUp() throws Exception {
+        defaultLspWrapper = new DefaultLspWrapper();
+        isisInterface = new DefaultIsisInterface();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        defaultLspWrapper = null;
+    }
+
+    /**
+     * Tests lspProcessing() getter method.
+     */
+    @Test
+    public void testLspProcessing() throws Exception {
+        defaultLspWrapper.setLspProcessing(processing);
+        result = defaultLspWrapper.lspProcessing();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests lspProcessing() setter method.
+     */
+    @Test
+    public void testSetLspProcessing() throws Exception {
+        defaultLspWrapper.setLspProcessing(processing);
+        result = defaultLspWrapper.lspProcessing();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests lspAgeReceived() getter method.
+     */
+    @Test
+    public void testLspAgeReceived() throws Exception {
+        defaultLspWrapper.setLspAgeReceived(1);
+        result1 = defaultLspWrapper.lspAgeReceived();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests lspAgeReceived() setter method.
+     */
+    @Test
+    public void testSetLspAgeReceived() throws Exception {
+        defaultLspWrapper.setLspAgeReceived(1);
+        result1 = defaultLspWrapper.lspAgeReceived();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests lspAgeReceived() getter method.
+     */
+    @Test
+    public void testIsisInterface() throws Exception {
+        defaultLspWrapper.setIsisInterface(isisInterface);
+        result2 = defaultLspWrapper.isisInterface();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests lspAgeReceived() getter method.
+     */
+    @Test
+    public void testSetIsisInterface() throws Exception {
+        defaultLspWrapper.setIsisInterface(isisInterface);
+        result2 = defaultLspWrapper.isisInterface();
+        assertThat(result2, is(notNullValue()));
+    }
+
+}
\ No newline at end of file
diff --git a/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/IsisLspQueueConsumerTest.java b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/IsisLspQueueConsumerTest.java
new file mode 100644
index 0000000..2e592af
--- /dev/null
+++ b/protocols/isis/ctl/src/test/java/org/onosproject/isis/controller/impl/lsdb/IsisLspQueueConsumerTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.controller.impl.lsdb;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.concurrent.BlockingQueue;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test case for IsisLspQueueConsumer.
+ */
+public class IsisLspQueueConsumerTest {
+
+    private IsisLspQueueConsumer isisLspQueueConsumer;
+    private BlockingQueue blockingQueue;
+
+    @Before
+    public void setUp() throws Exception {
+        isisLspQueueConsumer = new IsisLspQueueConsumer(blockingQueue);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisLspQueueConsumer = null;
+    }
+
+    /**
+     * Tests run() method.
+     */
+    @Test
+    public void testRun() throws Exception {
+        isisLspQueueConsumer.run();
+        assertThat(isisLspQueueConsumer, is(notNullValue()));
+    }
+}
\ No newline at end of file
