diff --git a/protocols/ospf/ctl/src/test/java/org/onosproject/ospf/controller/impl/TopologyForDeviceAndLinkImplTest.java b/protocols/ospf/ctl/src/test/java/org/onosproject/ospf/controller/impl/TopologyForDeviceAndLinkImplTest.java
new file mode 100755
index 0000000..e924297
--- /dev/null
+++ b/protocols/ospf/ctl/src/test/java/org/onosproject/ospf/controller/impl/TopologyForDeviceAndLinkImplTest.java
@@ -0,0 +1,265 @@
+/*
+* Copyright 2016 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.ospf.controller.impl;
+
+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.ospf.controller.DeviceInformation;
+import org.onosproject.ospf.controller.OspfLinkTed;
+import org.onosproject.ospf.controller.OspfLsa;
+import org.onosproject.ospf.controller.area.OspfAreaImpl;
+import org.onosproject.ospf.controller.area.OspfInterfaceImpl;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.onosproject.ospf.protocol.lsa.TlvHeader;
+import org.onosproject.ospf.protocol.lsa.subtypes.OspfLsaLink;
+import org.onosproject.ospf.protocol.lsa.tlvtypes.LinkTlv;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
+import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for TopologyForDeviceAndLinkImpl.
+ */
+public class TopologyForDeviceAndLinkImplTest {
+    private final byte[] packet = {0, 9, 0, 4, 0, 0, 0, 1,
+            0, 9, 0, 4, 0, 0, 0, 1,
+            0, 1, 0, 4, 0, 0, 0, 1,
+            0, 2, 0, 4, 0, 0, 0, 1,
+            0, 3, 0, 4, 0, 0, 0, 1,
+            0, 4, 0, 4, 0, 0, 0, 1,
+            0, 6, 0, 4, 0, 0, 0, 1,
+            0, 7, 0, 4, 0, 0, 0, 1,
+            0, 8, 0, 4, 0, 0, 0, 1,
+    };
+    private TopologyForDeviceAndLinkImpl topologyForDeviceAndLink;
+    private Map result;
+    private LinkTlv linkTlv;
+    private TlvHeader header;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        topologyForDeviceAndLink = new TopologyForDeviceAndLinkImpl();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        topologyForDeviceAndLink = null;
+    }
+
+    /**
+     * Tests deviceInformationMap() method.
+     */
+    @Test
+    public void testDeviceInformationMap() throws Exception {
+        result = topologyForDeviceAndLink.deviceInformationMap();
+        assertThat(result.size(), is(0));
+    }
+
+    /**
+     * Tests setDeviceInformationMap() method.
+     */
+    @Test
+    public void testSetDeviceInformationMap() throws Exception {
+        topologyForDeviceAndLink.setDeviceInformationMap("1.1.1.1", new DeviceInformationImpl());
+        result = topologyForDeviceAndLink.deviceInformationMap();
+        assertThat(result.size(), is(1));
+    }
+
+    /**
+     * Tests deviceInformation() method.
+     */
+    @Test
+    public void testDeviceInformation() throws Exception {
+        topologyForDeviceAndLink.setDeviceInformationMap("1.1.1.1", new DeviceInformationImpl());
+        DeviceInformation deviceInformation = topologyForDeviceAndLink.deviceInformation("1.1.1.1");
+        assertThat(deviceInformation, is(notNullValue()));
+    }
+
+    /**
+     * Tests removeDeviceInformationMap() method.
+     */
+    @Test
+    public void testRemoveDeviceInformationMap() throws Exception {
+        topologyForDeviceAndLink.setDeviceInformationMap("1.1.1.1", new DeviceInformationImpl());
+        topologyForDeviceAndLink.deviceInformation("1.1.1.1");
+        result = topologyForDeviceAndLink.deviceInformationMap();
+        topologyForDeviceAndLink.removeDeviceInformationMap("1.1.1.1");
+        assertThat(result.size(), is(0));
+    }
+
+    /**
+     * Tests linkInformationMap() method.
+     */
+    @Test
+    public void testLinkInformationMap() throws Exception {
+        result = topologyForDeviceAndLink.linkInformationMap();
+        assertThat(result.size(), is(0));
+    }
+
+    /**
+     * Tests setLinkInformationMap() method.
+     */
+    @Test
+    public void testSetLinkInformationMap() throws Exception {
+        topologyForDeviceAndLink.setLinkInformationMap("1.1.1.1", new LinkInformationImpl());
+        result = topologyForDeviceAndLink.linkInformationMap();
+        assertThat(result.size(), is(1));
+    }
+
+    /**
+     * Tests removeLinkInformationMap() method.
+     */
+    @Test
+    public void testRemoveLinkInformationMap() throws Exception {
+        topologyForDeviceAndLink.setLinkInformationMap("1.1.1.1", new LinkInformationImpl());
+        topologyForDeviceAndLink.removeLinkInformationMap("1.1.1.1");
+        result = topologyForDeviceAndLink.linkInformationMap();
+        assertThat(result.size(), is(0));
+    }
+
+    /**
+     * Tests getOspfLinkTedHashMap() method.
+     */
+    @Test
+    public void testGetOspfLinkTedHashMap() throws Exception {
+        OspfLinkTed ospfLinkTed = topologyForDeviceAndLink.getOspfLinkTedHashMap("1.1.1.1");
+        assertThat(ospfLinkTed, is(nullValue()));
+    }
+
+    /**
+     * Tests addLocalDevice() method.
+     */
+    @Test
+    public void testAddLocalDevice() throws Exception {
+        OspfAreaImpl ospfArea = new OspfAreaImpl();
+        ospfArea.setRouterId(Ip4Address.valueOf("5.5.5.5"));
+        topologyForDeviceAndLink.addLocalDevice(createOspfLsa(), new OspfInterfaceImpl(), ospfArea);
+        topologyForDeviceAndLink.addLocalDevice(createOspfLsa1(), new OspfInterfaceImpl(), ospfArea);
+        assertThat(topologyForDeviceAndLink, is(notNullValue()));
+    }
+
+    /**
+     * Tests addLocalLink() method.
+     */
+    @Test
+    public void testAddLocalLink() throws Exception {
+        Ip4Address linkData = Ip4Address.valueOf("1.1.1.1");
+        Ip4Address linkSrc = Ip4Address.valueOf("2.2.2.2");
+        Ip4Address linkDest = Ip4Address.valueOf("3.3.3.3");
+        boolean opaqueEnabled = true;
+        boolean linkSrcIdNotRouterId = true;
+        topologyForDeviceAndLink.addLocalLink("10.10.10.10", linkData, linkSrc,
+                                              linkDest, opaqueEnabled, linkSrcIdNotRouterId);
+        assertThat(topologyForDeviceAndLink, is(notNullValue()));
+    }
+
+    /**
+     * Tests removeLinks() method.
+     */
+    @Test
+    public void testRemoveLinks() throws Exception {
+        Ip4Address linkData = Ip4Address.valueOf("1.1.1.1");
+        Ip4Address linkSrc = Ip4Address.valueOf("2.2.2.2");
+        Ip4Address linkDest = Ip4Address.valueOf("3.3.3.3");
+        boolean opaqueEnabled = true;
+        boolean linkSrcIdNotRouterId = true;
+        topologyForDeviceAndLink.addLocalLink("10.10.10.10", linkData, linkSrc,
+                                              linkDest, opaqueEnabled, linkSrcIdNotRouterId);
+        topologyForDeviceAndLink.removeLinks(Ip4Address.valueOf("10.10.10.10"));
+        assertThat(topologyForDeviceAndLink, is(notNullValue()));
+    }
+
+    /**
+     * Tests updateLinkInformation() method.
+     */
+    @Test
+    public void testUpdateLinkInformation() throws Exception {
+        OspfAreaImpl ospfArea = new OspfAreaImpl();
+        ospfArea.setRouterId(Ip4Address.valueOf("5.5.5.5"));
+        topologyForDeviceAndLink.updateLinkInformation(createOspfLsa(), ospfArea);
+        assertThat(topologyForDeviceAndLink, is(notNullValue()));
+    }
+
+    /**
+     * Tests getDeleteRouterInformation() method.
+     */
+    @Test
+    public void testGetDeleteRouterInformation() throws Exception {
+        OspfAreaImpl ospfArea = new OspfAreaImpl();
+        ospfArea.setRouterId(Ip4Address.valueOf("5.5.5.5"));
+        topologyForDeviceAndLink.updateLinkInformation(createOspfLsa(), ospfArea);
+        List list = topologyForDeviceAndLink.getDeleteRouterInformation(createOspfLsa(), ospfArea);
+        assertThat(list, is(notNullValue()));
+    }
+
+    /**
+     * Utility for test methods.
+     */
+    private OspfLsa createOspfLsa() {
+        RouterLsa routerLsa = new RouterLsa();
+        routerLsa.setLsType(1);
+        routerLsa.setAdvertisingRouter(Ip4Address.valueOf("6.6.6.6"));
+        OspfLsaLink ospfLsaLink = new OspfLsaLink();
+        ospfLsaLink.setLinkData("192.168.7.77");
+        ospfLsaLink.setLinkId("9.9.9.9");
+        ospfLsaLink.setLinkType(1);
+        OspfLsaLink ospfLsaLink0 = new OspfLsaLink();
+        ospfLsaLink0.setLinkData("7.7.7.7");
+        ospfLsaLink0.setLinkId("7.7.7.7");
+        ospfLsaLink0.setLinkType(2);
+        OspfLsaLink ospfLsaLink120 = new OspfLsaLink();
+        ospfLsaLink120.setLinkData("192.168.7.77");
+        ospfLsaLink120.setLinkId("1.1.1.1");
+        ospfLsaLink120.setLinkType(1);
+        OspfLsaLink lsaLink = new OspfLsaLink();
+        lsaLink.setLinkData("192.168.7.77");
+        lsaLink.setLinkId("14.14.14.14");
+        lsaLink.setLinkType(2);
+        routerLsa.addRouterLink(lsaLink);
+        routerLsa.addRouterLink(ospfLsaLink);
+        routerLsa.addRouterLink(ospfLsaLink0);
+        routerLsa.addRouterLink(ospfLsaLink120);
+        return routerLsa;
+    }
+
+    /**
+     * Utility for test methods.
+     */
+    private OspfLsa createOspfLsa1() throws Exception {
+        OpaqueLsa10 opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
+        opaqueLsa10.setLsType(10);
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(9);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        linkTlv.readFrom(channelBuffer);
+        opaqueLsa10.addValue(linkTlv);
+        return opaqueLsa10;
+    }
+}
