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
