OSPF-API refactored based on review comments, ONOS-2738,
Change-Id: I05d39f7f0d6b3a2d0cc51a256feec220f1d0e06a
diff --git a/protocols/ospf/api/pom.xml b/protocols/ospf/api/pom.xml
new file mode 100755
index 0000000..a2a6d32
--- /dev/null
+++ b/protocols/ospf/api/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2014 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.
+  -->
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-ospf</artifactId>
+        <version>1.4.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-ospf-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ONOS Ospf controller subsystem API</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+        </dependency>
+
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.onosproject.ospf.*
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/DeviceInformation.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/DeviceInformation.java
new file mode 100755
index 0000000..70e4519
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/DeviceInformation.java
@@ -0,0 +1,124 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+
+import java.util.List;
+
+/**
+ * Representation of an OSPF device information.
+ */
+public interface DeviceInformation {
+
+    /**
+     * Gets router id.
+     *
+     * @return router id
+     */
+    Ip4Address routerId();
+
+    /**
+     * Sets router id.
+     *
+     * @param routId router id
+     */
+    void setRouterId(Ip4Address routId);
+
+    /**
+     * Gets device id.
+     *
+     * @return device id
+     */
+    Ip4Address deviceId();
+
+    /**
+     * Sets device id.
+     *
+     * @param deviceId device id
+     */
+    void setDeviceId(Ip4Address deviceId);
+
+    /**
+     * Gets list of interface ids.
+     *
+     * @return list of interface ids
+     */
+    List<Ip4Address> interfaceId();
+
+    /**
+     * Adds interface id to list.
+     *
+     * @param interfaceId interface id
+     */
+    void addInterfaceId(Ip4Address interfaceId);
+
+    /**
+     * Gets area id.
+     *
+     * @return area id
+     */
+    Ip4Address areaId();
+
+    /**
+     * Sets area id.
+     *
+     * @param areaId area id
+     */
+    void setAreaId(Ip4Address areaId);
+
+    /**
+     * Gets device information is already created or not.
+     *
+     * @return true if device information is already created else false
+     */
+    boolean isAlreadyCreated();
+
+    /**
+     * Sets device information is already created or not.
+     *
+     * @param alreadyCreated true if device information is already created else false
+     */
+    void setAlreadyCreated(boolean alreadyCreated);
+
+    /**
+     * Gets device is dr or not.
+     *
+     * @return true if device is dr else false
+     */
+    boolean isDr();
+
+    /**
+     * Sets device is dr or not.
+     *
+     * @param dr true if device is dr else false
+     */
+    void setDr(boolean dr);
+
+    /**
+     * Gets neighbor id.
+     *
+     * @return neighbor id
+     */
+    Ip4Address neighborId();
+
+    /**
+     * Sets neighbor id.
+     *
+     * @param neighborId neighbor id
+     */
+    void setNeighborId(Ip4Address neighborId);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LinkInformation.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LinkInformation.java
new file mode 100755
index 0000000..fc1db54
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LinkInformation.java
@@ -0,0 +1,136 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+
+/**
+ * Representation of an OSPF link information.
+ */
+public interface LinkInformation {
+
+    /**
+     * Gets link id.
+     *
+     * @return link id
+     */
+    String linkId();
+
+    /**
+     * Sets link id.
+     *
+     * @param linkId link id
+     */
+    void setLinkId(String linkId);
+
+    /**
+     * Gets link information is already created or not.
+     *
+     * @return true if link information is already created else false
+     */
+    boolean isAlreadyCreated();
+
+    /**
+     * Sets link information is already created or not.
+     *
+     * @param alreadyCreated true if link information is already created else false
+     */
+    void setAlreadyCreated(boolean alreadyCreated);
+
+    /**
+     * Gets is link source id is same as router id or not.
+     *
+     * @return true if link source id is not same as router id else false
+     */
+    boolean isLinkSrcIdNotRouterId();
+
+    /**
+     * Sets is link source id is same as router id or not.
+     *
+     * @param linkSrcIdNotRouterId true if link source id is not same as router id else false
+     */
+    void setLinkSrcIdNotRouterId(boolean linkSrcIdNotRouterId);
+
+    /**
+     * Gets link destination id.
+     *
+     * @return link destination id
+     */
+    Ip4Address linkDestinationId();
+
+    /**
+     * Sets link destination id.
+     *
+     * @param linkDestinationId link destination id
+     */
+    void setLinkDestinationId(Ip4Address linkDestinationId);
+
+    /**
+     * Gets link source id.
+     *
+     * @return link source id
+     */
+    Ip4Address linkSourceId();
+
+    /**
+     * Sets link source id.
+     *
+     * @param linkSourceId link source id
+     */
+    void setLinkSourceId(Ip4Address linkSourceId);
+
+    /**
+     * Gets interface ip address.
+     *
+     * @return interface ip address
+     */
+    Ip4Address interfaceIp();
+
+    /**
+     * Sets interface ip address.
+     *
+     * @param interfaceIp interface ip address
+     */
+    void setInterfaceIp(Ip4Address interfaceIp);
+
+    /**
+     * Gets link source ip address.
+     *
+     * @return link source ip address
+     */
+    Ip4Address linkSourceIpAddress();
+
+    /**
+     * Sets link source ip address.
+     *
+     * @param linkSourceIpAddress link source ip address
+     */
+    void setLinkSourceIpAddress(Ip4Address linkSourceIpAddress);
+
+    /**
+     * Gets link destination ip address.
+     *
+     * @return link destination ip address
+     */
+    Ip4Address linkDestinationIpAddress();
+
+    /**
+     * Sets link destination ip address.
+     *
+     * @param linkDestinationIpAddress link destination ip address
+     */
+    void setLinkDestinationIpAddress(Ip4Address linkDestinationIpAddress);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsaBin.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsaBin.java
new file mode 100755
index 0000000..3ee33f6
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsaBin.java
@@ -0,0 +1,65 @@
+/*
+ * 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;
+
+import java.util.Map;
+
+/**
+ * Representation of a bin where an LSA is stored for aging.
+ * A bin is identified by a bin number and can have one or more LSAs
+ * stored in a particular bin location.
+ */
+public interface LsaBin {
+
+    /**
+     * Adds the given LSA to this bin with the given key.
+     *
+     * @param lsaKey     key of the stored LSA
+     * @param lsaWrapper wrapper instance to store
+     */
+    public void addOspfLsa(String lsaKey, LsaWrapper lsaWrapper);
+
+    /**
+     * Retrieves the LSA from the bin for verification of max age and ls refresh.
+     *
+     * @param lsaKey key to search the LSA
+     * @return LSA Wrapper instance
+     */
+    public LsaWrapper ospfLsa(String lsaKey);
+
+    /**
+     * Removes the given LSA from the bin. when ever it reaches max age or ls refresh time.
+     *
+     * @param lsaKey     key to search LSA
+     * @param lsaWrapper wrapper instance of the particular LSA
+     */
+    public void removeOspfLsa(String lsaKey, LsaWrapper lsaWrapper);
+
+    /**
+     * Gets the list of LSAs in this bin as key value pair.
+     * with key being the LSA key formed from the LSA header.
+     *
+     * @return list of LSAs in this bin as key value pair
+     */
+    public Map<String, LsaWrapper> listOfLsa();
+
+    /**
+     * Gets the bin number assigned during the initialization process of the bins .
+     *
+     * @return the bin number
+     */
+    public int binNumber();
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsaWrapper.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsaWrapper.java
new file mode 100755
index 0000000..1ef4bdd
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsaWrapper.java
@@ -0,0 +1,155 @@
+/*
+ * 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;
+
+/**
+ * Representation of a wrapper object to store LSA and associated metadata.
+ * Metadata consists about the origination of LSA, age of LSA when received etc.
+ */
+public interface LsaWrapper {
+    /**
+     * Gets the type of LSA, it can be a router,network,summary,external.
+     *
+     * @return lsa type
+     */
+    public OspfLsaType lsaType();
+
+    /**
+     * Sets the LSA type during the initialization of wrapper.
+     *
+     * @param lsaType lsa type
+     */
+    public void setLsaType(OspfLsaType lsaType);
+
+    /**
+     * Determines the origination of LSA , this is called during ls refresh interval.
+     *
+     * @return true if self originated else false
+     */
+    public boolean isSelfOriginated();
+
+    /**
+     * Sets is self originated or not.
+     *
+     * @param isSelfOriginated true if self originated else false
+     */
+    public void setIsSelfOriginated(boolean isSelfOriginated);
+
+
+    /**
+     * Age of LSA when received during the adjacency formation.
+     *
+     * @return Age of LSA when received
+     */
+    public int lsaAgeReceived();
+
+    /**
+     * Sets the Age of LSA when received during the adjacency formation.
+     *
+     * @param lsaAgeReceived Age of LSA when received
+     */
+    public void setLsaAgeReceived(int lsaAgeReceived);
+
+    /**
+     * Gets the LSA present in the wrapper instance.
+     *
+     * @return LSA instance
+     */
+    public OspfLsa ospfLsa();
+
+    /**
+     * Sets the LSA instance to the wrapper.
+     *
+     * @param ospfLsa LSA instance
+     */
+    public void setOspfLsa(OspfLsa ospfLsa);
+
+    /**
+     * Gets the current LSA Age, using this we calculate current age.
+     * It is done against the age counter which is incremented every second.
+     *
+     * @return lsa age
+     */
+    public int currentAge();
+
+    /**
+     * Gets the age counter when received.
+     *
+     * @return the age counter when received
+     */
+    public int ageCounterWhenReceived();
+
+    /**
+     * Sets the age counter when received.
+     *
+     * @param ageCounterWhenReceived the age counter when received
+     */
+    public void setAgeCounterWhenReceived(int ageCounterWhenReceived);
+
+    /**
+     * Gets the LSA process command, like max age, ls refresh, based on the command set.
+     * The queue consumer will pick the LSA and start performing the actions, like flooding
+     * out of the domain or generating a new LSA and flooding.
+     *
+     * @return lsa process command
+     */
+    public String lsaProcessing();
+
+    /**
+     * Sets the LSA process command, like max age , ls refresh , based on the command set.
+     * The queue consumer will pick the LSA and start performing the actions, like flooding
+     * out of the domain or generating a new LSA and flooding.
+     *
+     * @param lsaProcessing lsa process command
+     */
+    public void setLsaProcessing(String lsaProcessing);
+
+    /**
+     * Gets bin number into which the LSA wrapper is put for aging process.
+     *
+     * @return bin number
+     */
+    public int binNumber();
+
+    /**
+     * Sets bin number into which the LSA wrapper is put for aging process.
+     *
+     * @param binNumber bin number
+     */
+    public void setBinNumber(int binNumber);
+
+    /**
+     * Gets the interface on which the LSA was received.
+     *
+     * @return the interface instance
+     */
+    public OspfInterface ospfInterface();
+
+    /**
+     * Sets the interface on which the LSA was received, this is used later to flood the information.
+     *
+     * @param ospfInterface interface instance
+     */
+    public void setOspfInterface(OspfInterface ospfInterface);
+
+    /**
+     * Sets the LSDB age.
+     * Using LSDB age we are calculating age of a particular LSA.
+     *
+     * @param lsdbAge lsdbAge instance
+     */
+    public void setLsdbAge(LsdbAge lsdbAge);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsdbAge.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsdbAge.java
new file mode 100755
index 0000000..5ebd862
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/LsdbAge.java
@@ -0,0 +1,101 @@
+/*
+ * 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;
+
+/**
+ * Representation of LSDB aging process.
+ * The age of each LSA in the database must be incremented by 1 each second.
+ * We put all the LSAs of a given age into a single bin. The age of an LSA is the
+ * difference between its age bin and the bin representing LS age 0.
+ */
+public interface LsdbAge {
+
+    /**
+     * Adds LSA to bin for aging.
+     *
+     * @param binKey key to store the LSA in bin
+     * @param lsaBin LSA bin instance
+     */
+    public void addLsaBin(Integer binKey, LsaBin lsaBin);
+
+    /**
+     * Gets LSA from bin, this method is used while processing ls refresh and max age on LSA.
+     *
+     * @param binKey key to retreive the LSA from bin
+     * @return lsaBin bin instance
+     */
+    public LsaBin getLsaBin(Integer binKey);
+
+    /**
+     * Adds the lsa to maxAge bin if LSAs age is max age.
+     *
+     * @param key     key to store the LSA in bin.
+     * @param wrapper wrapper instance which contains LSA
+     */
+    public void addLsaToMaxAgeBin(String key, LsaWrapper wrapper);
+
+    /**
+     * Gets the bin number out of LSAs age, in which the LSA can be placed.
+     * so that age can be calculated.
+     *
+     * @param x Can be either age or ageCounter
+     * @return bin number.
+     */
+    public int age2Bin(int x);
+
+    /**
+     * Gets the max age bin, a special bin is created which holds only max age LSAs.
+     *
+     * @return lsa bin instance
+     */
+    public LsaBin getMaxAgeBin();
+
+    /**
+     * Gets the age counter.
+     *
+     * @return age counter
+     */
+    public int getAgeCounter();
+
+
+    /**
+     * Refresh the LSAs which are in the refresh bin.
+     */
+    public void refreshLsa();
+
+    /**
+     * If the LSAs have completed the MaxAge stop aging and flood it.
+     */
+    public void maxAgeLsa();
+
+    /**
+     * Invoked every 1 second as part of the aging process, and increments age counter.
+     * It also verifies if any LSA has reached ls refresh time or max age.
+     */
+    public void ageLsaAndFlood();
+
+    /**
+     * Starts the aging timer thread which gets invokes every second.
+     */
+    public void startDbAging();
+
+    /**
+     * Removes LSA from Bin, when ever it reaches a max age or ls refresh time.
+     *
+     * @param lsaWrapper wrapper instance
+     */
+    public void removeLsaFromBin(LsaWrapper lsaWrapper);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfAgent.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfAgent.java
new file mode 100755
index 0000000..265f60b
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfAgent.java
@@ -0,0 +1,54 @@
+/*
+ * 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;
+
+/**
+ * Representation of an OSPF agent.
+ * It is responsible for keeping track of the current set of routers
+ * connected to the system.
+ */
+public interface OspfAgent {
+
+    /**
+     * Adds a router that has just connected to the system.
+     *
+     * @param ospfRouter the router id to add
+     * @return true if added, false otherwise
+     */
+    boolean addConnectedRouter(OspfRouter ospfRouter);
+
+    /**
+     * Removes the router which got disconnected from the system.
+     *
+     * @param ospfRouter the router id to remove
+     */
+    void removeConnectedRouter(OspfRouter ospfRouter);
+
+    /**
+     * Notifies that got a packet of link from network and need do processing.
+     *
+     * @param ospfRouter  router instance
+     * @param ospfLinkTed link ted instance
+     */
+    void addLink(OspfRouter ospfRouter, OspfLinkTed ospfLinkTed);
+
+    /**
+     * Notifies that got a packet of link from network and need do processing.
+     *
+     * @param ospfRouter router instance
+     */
+    void deleteLink(OspfRouter ospfRouter);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfArea.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfArea.java
new file mode 100755
index 0000000..84aa76a
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfArea.java
@@ -0,0 +1,282 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+
+import java.util.List;
+
+/**
+ * Representation of an OSPF area. OSPF areas are collections of network segments.
+ * The configuration of OSPF area consists of assigning an area id to each network segment.
+ * Each area has its own link state database.
+ */
+public interface OspfArea {
+
+    /**
+     * Gets the router id associated with the area.
+     *
+     * @return router id
+     */
+    Ip4Address routerId();
+
+    /**
+     * Sets the router id for this area.
+     *
+     * @param routerId router's ip address
+     */
+    void setRouterId(Ip4Address routerId);
+
+    /**
+     * Gets the area id.
+     *
+     * @return area id
+     */
+    Ip4Address areaId();
+
+    /**
+     * Sets the area id.
+     *
+     * @param areaId area id as an IPv4 address
+     */
+    void setAreaId(Ip4Address areaId);
+
+    /**
+     * Gets the LSDB instance for this area.
+     *
+     * @return LSDB instance for this area
+     */
+    public OspfLsdb database();
+
+    /**
+     * Checks whether an instance of the given LSA exists in the database.
+     *
+     * @param lookupLsa LSA instance to lookup
+     * @return LSA wrapper instance which contains the LSA
+     */
+    public LsaWrapper lsaLookup(OspfLsa lookupLsa);
+
+    /**
+     * Initializes link state database, this acts as a place holder for storing the received LSA.
+     */
+    public void initializeDb();
+
+    /**
+     * Sets the stub cost.
+     *
+     * @param stubCost stub cost
+     */
+    void setStubCost(int stubCost);
+
+    /**
+     * Sets the options value.
+     *
+     * @param options integer value
+     */
+    void setOptions(int options);
+
+    /**
+     * Gets area address ranges to which this area belongs to.
+     *
+     * @return list of area address ranges
+     */
+    List<OspfAreaAddressRange> addressRanges();
+
+    /**
+     * Sets the area address ranges to which this area belongs to.
+     *
+     * @param addrRangeList list of area address ranges
+     */
+    void setAddressRanges(List<OspfAreaAddressRange> addrRangeList);
+
+    /**
+     * Gets whether the area is transit capable or not.
+     * This indicates whether the area can carry data traffic that neither originates
+     * nor terminates in the area itself.
+     *
+     * @return true if transit capable, else false
+     */
+    boolean isTransitCapability();
+
+    /**
+     * Sets whether the area is transit capable or not.
+     * This indicates whether the area can carry data traffic that neither originates
+     * nor terminates in the area itself.
+     *
+     * @param transitCapability true if transit capable, else false
+     */
+    void setTransitCapability(boolean transitCapability);
+
+    /**
+     * Gets external routing capability.
+     * This indicates Whether AS-external-LSAs will be flooded into/throughout the area.
+     *
+     * @return true if external routing capable, else false
+     */
+    boolean isExternalRoutingCapability();
+
+    /**
+     * Sets external routing capability.
+     * This indicates Whether AS-external-LSAs will be flooded into/throughout the area.
+     *
+     * @param externalRoutingCapability true if external routing capable, else false
+     */
+    void setExternalRoutingCapability(boolean externalRoutingCapability);
+
+    /**
+     * Gets the stub cost, which indicates if the area has been configured as a stub area.
+     *
+     * @return stub cost
+     */
+    int stubCost();
+
+    /**
+     * Gets if the router is opaque enabled or not.
+     * This indicates whether the router accepts opaque LSA.
+     *
+     * @return true if opaque enabled else false
+     */
+    boolean isOpaqueEnabled();
+
+    /**
+     * Gets the list of interfaces attached to this area.
+     *
+     * @return list of interfaces
+     */
+    List<OspfInterface> getInterfacesLst();
+
+    /**
+     * Sets the list of interfaces attached to this area.
+     *
+     * @param interfacesLst list of interface instances
+     */
+    void setInterfacesLst(List<OspfInterface> interfacesLst);
+
+    /**
+     * Gets the options value, which indicates the supported optional capabilities.
+     *
+     * @return options value
+     */
+    int options();
+
+    /**
+     * Gets the opaque enabled options value, which indicates support of opaque capabilities.
+     *
+     * @return opaque enabled options value
+     */
+    int opaqueEnabledOptions();
+
+    /**
+     * Sets opaque enabled to true or false, which indicates whether the router accepts opaque LSA.
+     *
+     * @param isOpaqueEnable true if opaque enabled else false
+     */
+    void setIsOpaqueEnabled(boolean isOpaqueEnable);
+
+    /**
+     * Refreshes areas, by sending a router LSA and network LSA (in case of DR).
+     * with a new sequence number.
+     *
+     * @param ospfInterface interface instance
+     * @throws Exception might throw exception
+     */
+    void refreshArea(OspfInterface ospfInterface) throws Exception;
+
+    /**
+     * Verifies no neighbor is in exchange process.
+     *
+     * @return boolean indicating that there is no Neighbor in Database Exchange
+     */
+    boolean noNeighborInLsaExchangeProcess();
+
+    /**
+     * Checks whether an instance of the given LSA exists in the database belonging to this area.
+     * If so return true else false.
+     *
+     * @param lsa1 LSA instance to compare
+     * @param lsa2 LSA instance to compare
+     * @return "same" if both instances are same, "latest" if lsa1 is latest, or "old" if lsa1 is old
+     */
+    String isNewerOrSameLsa(OspfLsa lsa1, OspfLsa lsa2);
+
+    /**
+     * Whenever we receive an LSA with max age - we put it in the max age bin.
+     * This is later used to flush LSAs out of the routing domain.
+     *
+     * @param key     key to add it to LSDB
+     * @param wrapper LSA wrapper instance
+     */
+    void addLsaToMaxAgeBin(String key, LsaWrapper wrapper);
+
+    /**
+     * Whenever an LSA is being flushed out or reaches max age, it must be stopped from aging.
+     * This achieved by removing it from bin.
+     *
+     * @param lsaWrapper the LSA wrapper instance to delete
+     */
+    void removeLsaFromBin(LsaWrapper lsaWrapper);
+
+    /**
+     * Adds the received LSA to LSDB, this method creates an LSA wrapper for the LSA.
+     * Also adds it to the LSDB of the area. This method is specifically called for
+     * the self originated LSAs.
+     *
+     * @param ospfLsa          LSA instance
+     * @param isSelfOriginated true if the LSA is self originated else false
+     * @param ospfInterface    interface instance
+     * @throws Exception might throws exception
+     */
+    void addLsa(OspfLsa ospfLsa, boolean isSelfOriginated, OspfInterface ospfInterface)
+            throws Exception;
+
+    /**
+     * Adds the received LSA to LSDB,this method creates an LSA wrapper for the LSA.
+     * Adds it to the LSDB of the area.
+     *
+     * @param ospfLsa       LSA instance
+     * @param ospfInterface interface instance
+     * @throws Exception might throws exception
+     */
+    void addLsa(OspfLsa ospfLsa, OspfInterface ospfInterface) throws Exception;
+
+    /**
+     * Sets router sequence number for router LSA.
+     *
+     * @param newSequenceNumber sequence number
+     */
+    void setDbRouterSequenceNumber(long newSequenceNumber);
+
+    /**
+     * Gets LSA header of all types of LSAs present in the link state database.
+     *
+     * @param excludeMaxAgeLsa need to include(true) or exclude(false) max age LSA
+     * @param isOpaqueCapable  need to include(true) or exclude(false) type 10 Opaque LSA
+     * @return list of LSA header in the LSDB
+     */
+    List getLsaHeaders(boolean excludeMaxAgeLsa, boolean isOpaqueCapable);
+
+    /**
+     * Gets the LSA wrapper from link state database based on the parameters passed.
+     *
+     * @param lsType            type of LSA to form the key
+     * @param linkStateID       link state id to form the key
+     * @param advertisingRouter advertising router to form the key
+     * @return LSA wrapper instance which contains the LSA
+     * @throws Exception might throws exception
+     */
+    LsaWrapper getLsa(int lsType, String linkStateID, String advertisingRouter) throws Exception;
+
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfAreaAddressRange.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfAreaAddressRange.java
new file mode 100755
index 0000000..7ade189
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfAreaAddressRange.java
@@ -0,0 +1,66 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+
+/**
+ * Represents the collection of IP addresses contained in the address range.
+ */
+public interface OspfAreaAddressRange {
+
+    /**
+     * Gets the IP address.
+     *
+     * @return IP address
+     */
+    public Ip4Address ipAddress();
+
+    /**
+     * Sets the IP address.
+     *
+     * @param ipAddress IPv4 address
+     */
+    public void setIpAddress(Ip4Address ipAddress);
+
+    /**
+     * Gets the network mask.
+     *
+     * @return network mask
+     */
+    public String mask();
+
+    /**
+     * Sets the network mask.
+     *
+     * @param mask network mask
+     */
+    public void setMask(String mask);
+
+    /**
+     * Gets the advertise value, which indicates routing information is condensed at area boundaries.
+     *
+     * @return advertise true if advertise flag is set else false
+     */
+    public boolean isAdvertise();
+
+    /**
+     * Sets the advertise value, which indicates routing information is condensed at area boundaries.
+     *
+     * @param advertise true if advertise flag to set else false
+     */
+    public void setAdvertise(boolean advertise);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfController.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfController.java
new file mode 100755
index 0000000..cd935b5
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfController.java
@@ -0,0 +1,109 @@
+/*
+ * 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;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Abstraction of an OSPF controller.
+ * Serves as a one stop shop for obtaining OSPF devices and (un)register listeners on OSPF events.
+ */
+public interface OspfController {
+
+    /**
+     * Registers a listener for router meta events.
+     *
+     * @param listener the listener to notify
+     */
+    void addRouterListener(OspfRouterListener listener);
+
+    /**
+     * Unregisters a router listener.
+     *
+     * @param listener the listener to unregister
+     */
+    void removeRouterListener(OspfRouterListener listener);
+
+    /**
+     * Registers a listener for OSPF message events.
+     *
+     * @param listener the listener to notify
+     */
+    void addLinkListener(OspfLinkListener listener);
+
+    /**
+     * Unregisters a link listener.
+     *
+     * @param listener the listener to unregister
+     */
+    void removeLinkListener(OspfLinkListener listener);
+
+    /**
+     * Updates configuration of processes.
+     *
+     * @param processes process info to update
+     */
+    public void updateConfig(List<OspfProcess> processes);
+
+    /**
+     * Deletes configuration parameters.
+     *
+     * @param processes list of process instance
+     * @param attribute attribute to delete
+     */
+    public void deleteConfig(List<OspfProcess> processes, String attribute);
+
+    /**
+     * Gets string representation of area configuration parameters to be displayed after CLI command.
+     *
+     * @param processId process Id
+     * @param areaId    area Id
+     * @return Area Information
+     */
+    public String showAreaParameters(String processId, String areaId);
+
+    /**
+     * Gets string representation of area configuration information for the given area/process.
+     * This method will be called for CLI command.
+     *
+     * @param processId process id to which area belongs
+     * @param areaId    area id
+     * @return string representation of area configuration for CLI display
+     */
+    List<String> showAreaConfigurations(String processId, String areaId);
+
+    /**
+     * Gets the list of listeners registered for router events.
+     *
+     * @return list of listeners
+     */
+    Set<OspfRouterListener> listener();
+
+    /**
+     * Gets the list of listeners registered for link events.
+     *
+     * @return list of listeners
+     */
+    public Set<OspfLinkListener> linkListener();
+
+    /**
+     * Gets the configured process.
+     *
+     * @return list of process instances
+     */
+    public List<OspfProcess> getAllConfiguredProcesses();
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfDeviceTed.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfDeviceTed.java
new file mode 100755
index 0000000..40158d8
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfDeviceTed.java
@@ -0,0 +1,97 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+
+import java.util.List;
+
+/**
+ * Represents Device Traffic Engineering parameters.
+ */
+public interface OspfDeviceTed {
+
+    /**
+     * Obtain list of IPv4 router ids.
+     *
+     * @return IPv4 router ids
+     */
+    public List<Ip4Address> ipv4RouterIds();
+
+    /**
+     * Sets list of IPv4 router ids.
+     *
+     * @param routerIds list of IPv4 router ids
+     */
+    public void setIpv4RouterIds(List<Ip4Address> routerIds);
+
+    /**
+     * Obtain list of IPv6 router id.
+     *
+     * @return IPv4 router ids
+     */
+    public List<Ip6Address> ipv6RouterIds();
+
+    /**
+     * Sets list of IPv4 router ids.
+     *
+     * @param routerIds list of IPv4 router ids
+     */
+    public void setIpv6RouterIds(List<Ip6Address> routerIds);
+
+    /**
+     * Obtain the list of topology ids.
+     *
+     * @return list of topology ids
+     */
+    public List<Short> topologyIds();
+
+    /**
+     * Sets the list of topology ids.
+     *
+     * @param topologyIds the list of topology ids
+     */
+    public void setTopologyIds(List<Short> topologyIds);
+
+    /**
+     * Obtains position of device in the network.
+     *
+     * @return position of device in the network
+     */
+    public Boolean asbr();
+
+    /**
+     * Sets position of device in the network.
+     *
+     * @param asbr position of device in the network
+     */
+    public void setAsbr(Boolean asbr);
+
+    /**
+     * Obtains position of device in the network.
+     *
+     * @return position of device in the network
+     */
+    public Boolean abr();
+
+    /**
+     * Sets position of device in the network.
+     *
+     * @param abr position of device in the network
+     */
+    public void setAbr(Boolean abr);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfInterface.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfInterface.java
new file mode 100755
index 0000000..c279383
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfInterface.java
@@ -0,0 +1,297 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+
+import java.util.HashMap;
+
+/**
+ * Represents an OSPF Interface.
+ */
+public interface OspfInterface {
+
+    /**
+     * Gets network mask of the interface.
+     *
+     * @return network mask
+     */
+    Ip4Address ipNetworkMask();
+
+    /**
+     * Sets area id, to which the interface belongs.
+     *
+     * @param areaId area identifier
+     */
+    void setAreaId(int areaId);
+
+    /**
+     * Sets the authentication key.
+     * Interface uses this to authenticate while establishing communication with other routers.
+     *
+     * @param authKey represents authentication key
+     */
+    void setAuthKey(String authKey);
+
+    /**
+     * Sets the authentication type,
+     * Interface uses this to authenticate while establishing communication with other routers.
+     *
+     * @param authType authType represents authentication type
+     */
+    void setAuthType(String authType);
+
+    /**
+     * Sets the value of BDR.
+     * The BDR is calculated during adjacency formation.
+     *
+     * @param bdr backup designated router's IP address
+     */
+    void setBdr(Ip4Address bdr);
+
+    /**
+     * Sets the value of DR.
+     * The DR is calculated during adjacency formation.
+     *
+     * @param dr designated router's IP address
+     */
+    void setDr(Ip4Address dr);
+
+    /**
+     * Sets the hello interval time.
+     * It is the interval at which a hello packet is sent out via this interface.
+     *
+     * @param helloIntervalTime an integer interval time
+     */
+    void setHelloIntervalTime(int helloIntervalTime);
+
+    /**
+     * Sets router dead interval time.
+     * This is the interval after which this interface will trigger a process to kill neighbor.
+     *
+     * @param routerDeadIntervalTime an integer interval time
+     */
+    void setRouterDeadIntervalTime(int routerDeadIntervalTime);
+
+    /**
+     * Sets the interface cost which is the cost of sending a data packet onto the network.
+     *
+     * @param interfaceCost an integer represents interface cost
+     */
+    void setInterfaceCost(int interfaceCost);
+
+    /**
+     * Sets interface type.
+     * This indicates whether the interface is on point to point mode or broadcast mode.
+     *
+     * @param interfaceType an integer represents interface type
+     */
+    void setInterfaceType(int interfaceType);
+
+    /**
+     * Sets IP Address of this interface.
+     *
+     * @param ipAddress IP address
+     */
+    void setIpAddress(Ip4Address ipAddress);
+
+    /**
+     * Sets IP network mask.
+     *
+     * @param ipNetworkMask network mask
+     */
+    void setIpNetworkMask(Ip4Address ipNetworkMask);
+
+    /**
+     * Sets the polling interval.
+     * Polling interval indicates the interval until when the Hello Packets are
+     * sent to a dead neighbor.
+     *
+     * @param pollInterval an integer represents poll interval
+     */
+    void setPollInterval(int pollInterval);
+
+    /**
+     * Sets transmission delay.
+     *
+     * @param transmitDelay an integer represents delay
+     */
+    void setTransmitDelay(int transmitDelay);
+
+    /**
+     * Sets retransmit interval which indicates the number of seconds between LSA retransmissions.
+     *
+     * @param reTransmitInterval an integer represents interval
+     */
+    void setReTransmitInterval(int reTransmitInterval);
+
+    /**
+     * Sets MTU.
+     *
+     * @param mtu an integer represents max transfer unit
+     */
+    void setMtu(int mtu);
+
+    /**
+     * Sets router priority.
+     *
+     * @param routerPriority value
+     */
+    void setRouterPriority(int routerPriority);
+
+    /**
+     * Gets the area id to which router belongs.
+     *
+     * @return areaId an integer value
+     */
+    int areaId();
+
+    /**
+     * Gets the IP address.
+     *
+     * @return an string represents IP address
+     */
+    Ip4Address ipAddress();
+
+    /**
+     * Gets the interface type.
+     *
+     * @return an integer represents interface type
+     */
+    int interfaceType();
+
+    /**
+     * Gets the MTU.
+     *
+     * @return an integer representing max transfer unit
+     */
+    int mtu();
+
+    /**
+     * Gets interface cost.
+     *
+     * @return an integer representing interface cost
+     */
+    int interfaceCost();
+
+    /**
+     * Gets the list of neighbors associated with the interface.
+     *
+     * @return listOfNeighbors as key value pair
+     */
+    HashMap<String, OspfNbr> listOfNeighbors();
+
+    /**
+     * Gets poll interval.
+     *
+     * @return pollInterval an integer representing poll interval
+     */
+    int pollInterval();
+
+    /**
+     * Gets transmission delay.
+     *
+     * @return transmitDelay an integer representing delay
+     */
+    int transmitDelay();
+
+    /**
+     * Gets the IP address of the BDR.
+     *
+     * @return bdr BDR's IP address
+     */
+    Ip4Address bdr();
+
+    /**
+     * Gets the ip address of the DR..
+     *
+     * @return dr DR's IP address
+     */
+    Ip4Address dr();
+
+    /**
+     * Gets authentication key.
+     *
+     * @return authKey represents authentication key
+     */
+    String authKey();
+
+    /**
+     * Gets authentication type.
+     *
+     * @return authType represents authentication type
+     */
+    String authType();
+
+    /**
+     * Gets hello interval time in seconds, this defines how often we send the hello packet.
+     *
+     * @return hello interval time in seconds
+     */
+    int helloIntervalTime();
+
+    /**
+     * Gets retransmit interval.
+     *
+     * @return reTransmitInterval an integer represents interval
+     */
+    int reTransmitInterval();
+
+    /**
+     * Gets router dead interval time.
+     * This defines how long we should wait for hello packets before we declare the neighbor is dead.
+     *
+     * @return routerDeadIntervalTime an integer interval time
+     */
+    int routerDeadIntervalTime();
+
+    /**
+     * Gets router priority.
+     *
+     * @return routerPriority value
+     */
+    int routerPriority();
+
+    /**
+     * Adds the given neighboring router to the neighbor map.
+     *
+     * @param ospfNbr neighbor instance
+     */
+    void addNeighbouringRouter(OspfNbr ospfNbr);
+
+    /**
+     * Gets the neighbor instance from listOfNeighbors map for the given neighbor ID.
+     *
+     * @param neighborId neighbors id
+     * @return ospfNbr neighbor instance
+     */
+    OspfNbr neighbouringRouter(String neighborId);
+
+    /**
+     * Checks the given neighbor is in the neighbor list.
+     *
+     * @param neighborId neighbors id
+     * @return true if neighbor in list else false
+     */
+    boolean isNeighborInList(String neighborId);
+
+    /**
+     * Removes LSA headers from the map in which LSA headers are stored.
+     *
+     * @param lsaKey key used to store lsa in map
+     */
+    void removeLsaFromNeighborMap(String lsaKey);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLink.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLink.java
new file mode 100755
index 0000000..028bcc5
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLink.java
@@ -0,0 +1,82 @@
+/*
+ * 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;
+
+import org.onlab.packet.IpAddress;
+
+import java.util.List;
+
+/**
+ * Abstraction of an OSPF Link.
+ */
+public interface OspfLink {
+
+    /**
+     * Gets IP address of the Router.
+     *
+     * @return IP address of router
+     */
+    IpAddress remoteRouterId();
+
+    /**
+     * Gets the area id for this device.
+     *
+     * @return the area id
+     */
+    int areaIdOfInterface();
+
+    /**
+     * Gets IP address of the interface.
+     *
+     * @return IP address of the interface
+     */
+    IpAddress interfaceIp();
+
+    /**
+     * Gets list of the link TED.
+     *
+     * @return list of the link TED
+     */
+    List<OspfLinkTed> linkTedLists();
+
+    /**
+     * Sets IP address of the router.
+     *
+     * @param routerIp router's IP address
+     */
+    void setRouterIp(IpAddress routerIp);
+
+    /**
+     * Sets the area id for this device.
+     *
+     * @param areaIdOfInterface area id
+     */
+    void setAreaIdOfInterface(int areaIdOfInterface);
+
+    /**
+     * Sets IP address of the interface.
+     *
+     * @param interfaceIp IP address of the interface.
+     */
+    void setInterfaceIp(IpAddress interfaceIp);
+
+    /**
+     * Sets list of the link TED.
+     *
+     * @param linkTedLists list of the link TED
+     */
+    void setLinkTedLists(List<OspfLinkTed> linkTedLists);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLinkListener.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLinkListener.java
new file mode 100755
index 0000000..0fe7e66
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLinkListener.java
@@ -0,0 +1,37 @@
+/*
+ * 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;
+
+/**
+ * Abstraction of an OSPF link listener.
+ */
+public interface OspfLinkListener {
+
+    /**
+     * Notifies that we got a link from network.
+     *
+     * @param ospfRouter  router instance
+     * @param ospfLinkTed link TED information of router
+     */
+    void addLink(OspfRouter ospfRouter, OspfLinkTed ospfLinkTed);
+
+    /**
+     * Notifies that a link got removed from network.
+     *
+     * @param ospfRouter router instance
+     */
+    void deleteLink(OspfRouter ospfRouter);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLinkTed.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLinkTed.java
new file mode 100755
index 0000000..681c70c
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLinkTed.java
@@ -0,0 +1,140 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onlab.util.Bandwidth;
+
+import java.util.List;
+
+/**
+ * Represents OSPF Link Traffic Engineering parameters.
+ */
+public interface OspfLinkTed {
+
+    /**
+     * Provides maximum bandwidth can be used on the link.
+     *
+     * @return maximum bandwidth
+     */
+    public Bandwidth maximumLink();
+
+    /**
+     * Sets maximum band width.
+     *
+     * @param bandwidth maximum bandwidth
+     */
+    public void setMaximumLink(Bandwidth bandwidth);
+
+    /**
+     * Amount of bandwidth reservable on the link.
+     *
+     * @return unreserved bandwidth
+     */
+    public List<Bandwidth> maxUnResBandwidth();
+
+    /**
+     * Sets max bandwidth that is not reserved on the link.
+     *
+     * @param bandwidth max bandwidth that is not reserved on the link
+     */
+    public void setMaxUnResBandwidth(Bandwidth bandwidth);
+
+    /**
+     * Provides max bandwidth that can be reserved on the link.
+     *
+     * @return max bandwidth reserved
+     */
+    public Bandwidth maxReserved();
+
+    /**
+     * Sets max bandwidth that can be reserved on the link.
+     *
+     * @param bandwidth max bandwidth that can be reserved on the link
+     */
+    public void setMaxReserved(Bandwidth bandwidth);
+
+    /**
+     * Provides Traffic Engineering metric for the link.
+     *
+     * @return Traffic Engineering metric
+     */
+    public Integer teMetric();
+
+    /**
+     * Sets Traffic Engineering metric for the link.
+     *
+     * @param teMetric Traffic Engineering metric for the link
+     */
+    public void setTeMetric(Integer teMetric);
+
+    /**
+     * Provides IPv4 router-Id of local node.
+     *
+     * @return IPv4 router-Id of local node
+     */
+    public List<Ip4Address> ipv4LocRouterId();
+
+    /**
+     * Sets IPv4 router-Id of local node.
+     *
+     * @param routerIds IPv4 router-Id of local node
+     */
+    public void setIpv4LocRouterId(List<Ip4Address> routerIds);
+
+    /**
+     * Provides IPv6 router-Id of local node.
+     *
+     * @return IPv6 router-Id of local node
+     */
+    public List<Ip6Address> ipv6LocRouterId();
+
+    /**
+     * Sets IPv6 router-Id of local node.
+     *
+     * @param routerIds IPv6 router-Id of local node
+     */
+    public void setIpv6LocRouterId(List<Ip6Address> routerIds);
+
+    /**
+     * Provides IPv4 router-Id of remote node.
+     *
+     * @return IPv4 router-Id of remote node
+     */
+    public List<Ip4Address> ipv4RemRouterId();
+
+    /**
+     * Sets IPv4 router-Id of remote node.
+     *
+     * @param routerIds IPv4 router-Id of remote node
+     */
+    public void setIpv4RemRouterId(List<Ip4Address> routerIds);
+
+    /**
+     * Provides IPv6 router-Id of remote node.
+     *
+     * @return IPv6 router-Id of remote node
+     */
+    public List<Ip6Address> ipv6RemRouterId();
+
+    /**
+     * Sets IPv6 router-Id of remote node.
+     *
+     * @param routerIds IPv6 router-Id of remote node
+     */
+    public void setIpv6RemRouterId(List<Ip6Address> routerIds);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsa.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsa.java
new file mode 100755
index 0000000..80aafa4
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsa.java
@@ -0,0 +1,43 @@
+/*
+ * 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;
+
+/**
+ * Represents an OSPF LSA.
+ */
+public interface OspfLsa {
+
+    /**
+     * Gets the type of OSPF LSA.
+     *
+     * @return OSPF LSA type instance
+     */
+    OspfLsaType getOspfLsaType();
+
+    /**
+     * Gets the age of LSA.
+     *
+     * @return age of LSA
+     */
+    int age();
+
+    /**
+     * Gets the LSA header instance.
+     *
+     * @return this instance
+     */
+    public OspfLsa lsaHeader();
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsaType.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsaType.java
new file mode 100755
index 0000000..bb18efb
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsaType.java
@@ -0,0 +1,52 @@
+/*
+ * 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;
+
+/**
+ * Represents OSPF LSA types.
+ */
+public enum OspfLsaType {
+
+    ROUTER(1),
+    NETWORK(2),
+    SUMMARY(3),
+    ASBR_SUMMARY(4),
+    EXTERNAL_LSA(5),
+    LINK_LOCAL_OPAQUE_LSA(9),
+    AREA_LOCAL_OPAQUE_LSA(10),
+    AS_OPAQUE_LSA(11),
+    UNDEFINED(20);
+
+    private int value;
+
+    /**
+     * Creates an instance of OSPF LSA type.
+     *
+     * @param value represents LSA type
+     */
+    OspfLsaType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value representing LSA type.
+     *
+     * @return value represents LSA type
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsdb.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsdb.java
new file mode 100755
index 0000000..6d398c4
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfLsdb.java
@@ -0,0 +1,62 @@
+/*
+ * 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;
+
+import java.util.List;
+
+/**
+ * Represents an OSPF link state database.
+ */
+public interface OspfLsdb {
+
+    /**
+     * Initializes the link state database.
+     */
+    public void initializeDb();
+
+    /**
+     * Gets all LSA headers.
+     *
+     * @param excludeMaxAgeLsa exclude the max age LSAs
+     * @param isOpaqueCapable  is opaque capable or not
+     * @return List of LSA headers
+     */
+    public List getAllLsaHeaders(boolean excludeMaxAgeLsa, boolean isOpaqueCapable);
+
+    /**
+     * Finds the LSA from appropriate LSA maps.
+     *
+     * @param lsType type of LSA
+     * @param lsaKey key
+     * @return LSA wrapper object
+     */
+    public LsaWrapper findLsa(int lsType, String lsaKey);
+
+    /**
+     * Adds the LSA to maxAge bin.
+     *
+     * @param key        key
+     * @param lsaWrapper LSA wrapper instance
+     */
+    public void addLsaToMaxAgeBin(String key, Object lsaWrapper);
+
+    /**
+     * Removes LSA from bin.
+     *
+     * @param lsaWrapper LSA wrapper instance
+     */
+    public void removeLsaFromBin(Object lsaWrapper);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfNbr.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfNbr.java
new file mode 100755
index 0000000..054bbde
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfNbr.java
@@ -0,0 +1,192 @@
+/*
+ * 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;
+
+import org.jboss.netty.channel.Channel;
+import org.onlab.packet.Ip4Address;
+
+import java.util.Map;
+
+/**
+ * Represents an OSPF neighbor.
+ */
+public interface OspfNbr {
+
+    /**
+     * Gets neighbor's id.
+     *
+     * @return neighbor's id
+     */
+    public Ip4Address neighborId();
+
+    /**
+     * Gets router priority.
+     *
+     * @return router priority
+     */
+    public int routerPriority();
+
+    /**
+     * Gets the IP address of this neighbor.
+     *
+     * @return the IP address of this neighbor
+     */
+    public Ip4Address neighborIpAddr();
+
+    /**
+     * Gets the neighbor's DR address.
+     *
+     * @return neighbor's DR address
+     */
+    public Ip4Address neighborDr();
+
+    /**
+     * Gets the neighbor's BDR address.
+     *
+     * @return neighbor's BDR address
+     */
+    Ip4Address neighborBdr();
+
+    /**
+     * Determines whether an adjacency should be established/maintained with the neighbor.
+     *
+     * @param ch netty channel instance
+     */
+    void adjOk(Channel ch);
+
+    /**
+     * Gets the pending re transmit list as a map.
+     *
+     * @return pending re transmit list as a map
+     */
+    Map<String, OspfLsa> getPendingReTxList();
+
+    /**
+     * Sets the neighbor's id.
+     *
+     * @param neighborId neighbor's id
+     */
+    void setNeighborId(Ip4Address neighborId);
+
+    /**
+     * Sets the neighbor's BDR address.
+     *
+     * @param neighborBdr neighbor's BDR address
+     */
+    void setNeighborBdr(Ip4Address neighborBdr);
+
+    /**
+     * Sets the neighbor's DR address.
+     *
+     * @param neighborDr neighbor's DR address
+     */
+    void setNeighborDr(Ip4Address neighborDr);
+
+    /**
+     * Sets router priority.
+     *
+     * @param routerPriority router priority
+     */
+    void setRouterPriority(int routerPriority);
+
+    /**
+     * Sets the neighbor is opaque enabled or not.
+     *
+     * @param isOpaqueCapable true if the neighbor is opaque enabled else false
+     */
+    void setIsOpaqueCapable(boolean isOpaqueCapable);
+
+    /**
+     * Sets neighbor is master or not.
+     *
+     * @param isMaster neighbor is master or not
+     */
+    void setIsMaster(int isMaster);
+
+    /**
+     * Gets the DD sequence number.
+     *
+     * @return DD sequence number
+     */
+    long ddSeqNum();
+
+    /**
+     * Sets the DD sequence number.
+     *
+     * @param ddSeqNum DD sequence number
+     */
+    void setDdSeqNum(long ddSeqNum);
+
+    /**
+     * Gets neighbor is master or not.
+     *
+     * @return true if neighbor is master else false
+     */
+    int isMaster();
+
+    /**
+     * Gets the options value.
+     *
+     * @return options value
+     */
+    int options();
+
+    /**
+     * Sets the options value.
+     *
+     * @param options options value
+     */
+    void setOptions(int options);
+
+    /**
+     * An invalid request for LSA has been received.
+     * This indicates an error in the Database Exchange process. Actions to be performed
+     * are the same as in seqNumMismatch. In addition, stop the possibly activated
+     * retransmission timer.
+     *
+     * @param ch netty channel instance
+     * @throws Exception might throw exception
+     */
+    void badLSReq(Channel ch) throws Exception;
+
+    /**
+     * Gets the LS request list.
+     *
+     * @return LS request list
+     */
+    Map getLsReqList();
+
+    /**
+     * Gets the reTxList instance.
+     *
+     * @return reTxList instance
+     */
+    Map getReTxList();
+
+    /**
+     * Gets if the neighbor is opaque enabled or not.
+     *
+     * @return true if the neighbor is opaque enabled else false.
+     */
+    public boolean isOpaqueCapable();
+
+    /**
+     * Gets the neighbor's state.
+     *
+     * @return neighbor's state
+     */
+    OspfNeighborState getState();
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfNeighborState.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfNeighborState.java
new file mode 100755
index 0000000..250287a
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfNeighborState.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+/**
+ * Enum representing OSPF neighbor state.
+ */
+public enum OspfNeighborState {
+
+    DOWN(1),
+    ATTEMPT(2),
+    INIT(3),
+    TWOWAY(4),
+    EXSTART(5),
+    EXCHANGE(6),
+    LOADING(7),
+    FULL(8);
+
+    private int value;
+
+    /**
+     * Creates an OSPF neighbor state.
+     *
+     * @param value represents neighbors state
+     */
+    OspfNeighborState(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets value of neighbor state.
+     *
+     * @return value represents neighbors state
+     */
+    public int getValue() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfProcess.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfProcess.java
new file mode 100755
index 0000000..c505842
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfProcess.java
@@ -0,0 +1,49 @@
+/*
+ * 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;
+
+import java.util.List;
+
+/**
+ * Represents an OSPF Process.
+ */
+public interface OspfProcess {
+
+    /**
+     * Gets the list of areas belonging to this process.
+     *
+     * @return list of areas belonging to this process
+     */
+    public List<OspfArea> areas();
+
+    /**
+     * Sets the list of areas belonging to this process.
+     *
+     * @param areas list of areas belonging to this process
+     */
+    public void setAreas(List<OspfArea> areas);
+
+    /**
+     * Gets the process id.
+     *
+     * @return process id
+     */
+    public String processId();
+
+    /**
+     * Sets the process id.
+     *
+     * @param processId the process id
+     */
+    public void setProcessId(String processId);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouter.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouter.java
new file mode 100755
index 0000000..1eebd87
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouter.java
@@ -0,0 +1,123 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+
+/**
+ * Abstraction of an OSPF Router.
+ */
+public interface OspfRouter {
+
+    /**
+     * Gets IP address of the router.
+     *
+     * @return IP address of the router
+     */
+    Ip4Address routerIp();
+
+    /**
+     * Gets the area id for this device.
+     *
+     * @return the area id for this device
+     */
+    Ip4Address areaIdOfInterface();
+
+    /**
+     * Gets IP address of the interface.
+     *
+     * @return IP address of the interface
+     */
+    Ip4Address interfaceId();
+
+    /**
+     * Gets list of device TED.
+     *
+     * @return list of device TED.
+     */
+    OspfDeviceTed deviceTed();
+
+    /**
+     * Sets IP address of the Router.
+     *
+     * @param routerIp IP address of the router
+     */
+    void setRouterIp(Ip4Address routerIp);
+
+    /**
+     * Sets area id in which this device belongs to.
+     *
+     * @param areaIdOfInterface area id in which this device belongs to
+     */
+    void setAreaIdOfInterface(Ip4Address areaIdOfInterface);
+
+    /**
+     * Sets IP address of the interface.
+     *
+     * @param interfaceId IP address of the interface
+     */
+    void setInterfaceId(Ip4Address interfaceId);
+
+    /**
+     * Sets the device TED information.
+     *
+     * @param deviceTed device TED instance
+     */
+    void setDeviceTed(OspfDeviceTed deviceTed);
+
+    /**
+     * Gets if router is opaque enabled.
+     *
+     * @return true if router is opaque enabled else false.
+     */
+    boolean isOpaque();
+
+    /**
+     * Sets true if device is opaque enable if not sets false.
+     *
+     * @param opaque true if device is opaque enable if not sets false
+     */
+    void setOpaque(boolean opaque);
+
+    /**
+     * Gets IP address of the advertising router.
+     *
+     * @return IP address of the advertising router
+     */
+    Ip4Address neighborRouterId();
+
+    /**
+     * Sets IP address of the advertising router.
+     *
+     * @param advertisingRouterId IP address of the advertising router
+     */
+    void setNeighborRouterId(Ip4Address advertisingRouterId);
+
+
+    /**
+     * Gets if the router id DR or not.
+     *
+     * @return true if the router is DR else false
+     */
+    boolean isDr();
+
+    /**
+     * Sets if the router id DR or not.
+     *
+     * @param dr true if the router is DR else false
+     */
+    void setDr(boolean dr);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouterId.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouterId.java
new file mode 100755
index 0000000..0079f49
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouterId.java
@@ -0,0 +1,118 @@
+/*
+ * 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;
+
+import org.onlab.packet.IpAddress;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Represents an OSPF router id.
+ */
+public class OspfRouterId {
+
+    private static final String SCHEME = "ospf";
+    private static final long UNKNOWN = 0;
+    private final IpAddress ipAddress;
+
+    /**
+     * Creates an instance of OSPF router id.
+     *
+     * @param ipAddress IP address of the router
+     */
+    public OspfRouterId(IpAddress ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    /**
+     * Creates an instance from ip address.
+     *
+     * @param ipAddress IP address
+     * @return OSPF router id instance
+     */
+    public static OspfRouterId ospfRouterId(IpAddress ipAddress) {
+        return new OspfRouterId(ipAddress);
+    }
+
+    /**
+     * Creates OSPF router id instance from the URI.
+     *
+     * @param uri device URI
+     * @return OSPF router id instance
+     */
+    public static OspfRouterId ospfRouterId(URI uri) {
+        checkArgument(uri.getScheme().equals(SCHEME), "Unsupported URI scheme");
+        return new OspfRouterId(IpAddress.valueOf(uri.getSchemeSpecificPart()));
+    }
+
+    /**
+     * Returns device URI from the given router id.
+     *
+     * @param ospfRouterId router id instance
+     * @return device URI
+     */
+    public static URI uri(OspfRouterId ospfRouterId) {
+        return uri(ospfRouterId.ipAddress());
+    }
+
+    /**
+     * Returns device URI from the given IP address.
+     *
+     * @param ipAddress device IP address
+     * @return device URI
+     */
+    public static URI uri(IpAddress ipAddress) {
+        try {
+            return new URI(SCHEME, ipAddress.toString(), null);
+        } catch (URISyntaxException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Returns the IP address.
+     *
+     * @return IP address
+     */
+    public IpAddress ipAddress() {
+        return ipAddress;
+    }
+
+    @Override
+    public String toString() {
+        return ipAddress.toString();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof OspfRouterId)) {
+            return false;
+        }
+
+        OspfRouterId otherOspfRouterId = (OspfRouterId) other;
+        return Objects.equals(ipAddress, otherOspfRouterId.ipAddress);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipAddress);
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouterListener.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouterListener.java
new file mode 100755
index 0000000..10329b8
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfRouterListener.java
@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+/**
+ * Abstraction of an OSPF Router Listener.
+ * Allows for providers interested in switch events to be notified.
+ */
+public interface OspfRouterListener {
+
+    /**
+     * Notifies that a router is added.
+     *
+     * @param ospfRouter OSPF router instance
+     */
+    void routerAdded(OspfRouter ospfRouter);
+
+    /**
+     * Notifies that a router is removed.
+     *
+     * @param ospfRouter OSPF router instance
+     */
+    void routerRemoved(OspfRouter ospfRouter);
+
+    /**
+     * Notifies that the router has changed in some way.
+     *
+     * @param ospfRouter OSPF router instance
+     */
+    void routerChanged(OspfRouter ospfRouter);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/TopologyForDeviceAndLink.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/TopologyForDeviceAndLink.java
new file mode 100755
index 0000000..6f68e17
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/TopologyForDeviceAndLink.java
@@ -0,0 +1,112 @@
+/*
+ * 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;
+
+import org.onlab.packet.Ip4Address;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Represents IP topology for OSPF device and link details.
+ */
+public interface TopologyForDeviceAndLink {
+
+    /**
+     * Gets the device information.
+     *
+     * @return device information
+     */
+    Map<String, DeviceInformation> deviceInformationMap();
+
+    /**
+     * Sets the device information.
+     *
+     * @param key                  key used to store in map
+     * @param deviceInformationMap device information instance
+     */
+    void setDeviceInformationMap(String key, DeviceInformation deviceInformationMap);
+
+    /**
+     * Gets the link information.
+     *
+     * @return link information
+     */
+    Map<String, LinkInformation> linkInformationMap();
+
+    /**
+     * Sets link information.
+     *
+     * @param key                key used to store in map
+     * @param linkInformationMap link information instance
+     */
+    void setLinkInformationMap(String key, LinkInformation linkInformationMap);
+
+    /**
+     * Removes link information.
+     *
+     * @param key key used to remove from map
+     */
+    void removeLinkInformationMap(String key);
+
+    /**
+     * Adds device information.
+     *
+     * @param ospfLsa       LSA instance
+     * @param ospfInterface interface instance
+     * @param ospfArea      area instance
+     */
+    void addLocalDevice(OspfLsa ospfLsa, OspfInterface ospfInterface, OspfArea ospfArea);
+
+    /**
+     * Removes device information.
+     *
+     * @param key key used to remove from map
+     */
+    void removeDeviceInformationMap(String key);
+
+    /**
+     * Removes links from linkInformationMap.
+     *
+     * @param routerId router's IP address
+     */
+    void removeLinks(Ip4Address routerId);
+
+    /**
+     * Gets OSPF link TED details.
+     *
+     * @param key key used to retrieve from map
+     * @return links TED information
+     */
+    OspfLinkTed getOspfLinkTedHashMap(String key);
+
+    /**
+     * Gets all the router information to be deleted.
+     *
+     * @param ospfLsa  LSA instance
+     * @param ospfArea area instance
+     * @return list of router information which needs to delete from device list
+     */
+    List<String> getDeleteRouterInformation(OspfLsa ospfLsa, OspfArea ospfArea);
+
+    /**
+     * Updates the device and link information.
+     *
+     * @param ospfLsa  LSA instance
+     * @param ospfArea area instance
+     */
+    void updateLinkInformation(OspfLsa ospfLsa, OspfArea ospfArea);
+}
\ No newline at end of file
diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/package-info.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/package-info.java
new file mode 100755
index 0000000..1f1301b
--- /dev/null
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Implementation of the ospf api interfaces.
+ */
+package org.onosproject.ospf.controller;
\ No newline at end of file
diff --git a/protocols/ospf/api/src/test/java/org/onosproject/ospf/controller/OspfRouterIdTest.java b/protocols/ospf/api/src/test/java/org/onosproject/ospf/controller/OspfRouterIdTest.java
new file mode 100755
index 0000000..5879734
--- /dev/null
+++ b/protocols/ospf/api/src/test/java/org/onosproject/ospf/controller/OspfRouterIdTest.java
@@ -0,0 +1,94 @@
+package org.onosproject.ospf.controller;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+
+import java.net.URI;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for OspfRouterId.
+ */
+public class OspfRouterIdTest {
+
+    private OspfRouterId ospfRouterId;
+
+    @Before
+    public void setUp() throws Exception {
+        ospfRouterId = new OspfRouterId(IpAddress.valueOf("2.2.2.2"));
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        ospfRouterId = null;
+    }
+
+    /**
+     * Tests constructor.
+     */
+    @Test
+    public void testOspfRouterId() throws Exception {
+        assertThat(OspfRouterId.ospfRouterId(IpAddress.valueOf("2.2.2.2")), instanceOf(OspfRouterId.class));
+
+    }
+
+    /**
+     * Tests ipAddress() getter method.
+     */
+    @Test
+    public void testIpAddress() throws Exception {
+        assertThat(ospfRouterId.ipAddress(), instanceOf(IpAddress.class));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(ospfRouterId.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(ospfRouterId.equals(new OspfRouterId(IpAddress.valueOf("3.3.3.3"))), is(false));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        assertThat(ospfRouterId.hashCode(), is(notNullValue()));
+    }
+
+    /**
+     * Tests constructor.
+     */
+    @Test
+    public void testOspfRouterId1() throws Exception {
+        assertThat(OspfRouterId.ospfRouterId(OspfRouterId.uri(ospfRouterId)), instanceOf(OspfRouterId.class));
+    }
+
+    /**
+     * Tests uri() method.
+     */
+    @Test
+    public void testUri() throws Exception {
+        assertThat(OspfRouterId.uri(IpAddress.valueOf("2.2.2.2")), instanceOf(URI.class));
+    }
+
+    /**
+     * Tests uri() method..
+     */
+    @Test
+    public void testUri1() throws Exception {
+        assertThat(OspfRouterId.uri(ospfRouterId), instanceOf(URI.class));
+    }
+}
\ No newline at end of file