diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisController.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisController.java
index 447e0f2..7d5b111 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisController.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisController.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.isis.controller;
 
+import org.onosproject.isis.controller.topology.IsisRouterListener;
+
 import java.util.List;
 
 /**
@@ -25,14 +27,14 @@
     /**
      * Registers a listener for router meta events.
      *
-     * @param isisRouterListener isis router listener instance
+     * @param isisRouterListener ISIS router listener instance
      */
     void addRouterListener(IsisRouterListener isisRouterListener);
 
     /**
      * Unregisters a router listener.
      *
-     * @param isisRouterListener isis router listener instance
+     * @param isisRouterListener ISIS router listener instance
      */
     void removeRouterListener(IsisRouterListener isisRouterListener);
 
@@ -47,7 +49,8 @@
      * Deletes configuration parameters.
      *
      * @param processes list of process instance
-     * @param attribute attribute to delete
+     * @param attribute string key which deletes the particular node or element
+     * from the controller
      */
     void deleteConfig(List<IsisProcess> processes, String attribute);
 
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisInterface.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisInterface.java
index 2b9dab3..0b97c7d 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisInterface.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisInterface.java
@@ -15,12 +15,25 @@
  */
 package org.onosproject.isis.controller;
 
+import org.jboss.netty.channel.Channel;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+
+import java.util.Set;
+
 /**
  * Representation of an ISIS interface.
  */
 public interface IsisInterface {
 
     /**
+     * Returns interface index.
+     *
+     * @return interface index
+     */
+    int interfaceIndex();
+
+    /**
      * Sets interface index.
      *
      * @param interfaceIndex interface index
@@ -28,6 +41,48 @@
     void setInterfaceIndex(int interfaceIndex);
 
     /**
+     * Returns the interface IP address.
+     *
+     * @return interface IP address
+     */
+    Ip4Address interfaceIpAddress();
+
+    /**
+     * Sets the interface IP address.
+     *
+     * @param interfaceIpAddress interface IP address interface IP address
+     */
+    void setInterfaceIpAddress(Ip4Address interfaceIpAddress);
+
+    /**
+     * Returns the network mask.
+     *
+     * @return network mask
+     */
+    byte[] networkMask();
+
+    /**
+     * Sets the network mask.
+     *
+     * @param networkMask network mask
+     */
+    void setNetworkMask(byte[] networkMask);
+
+    /**
+     * Sets the interface MAC address.
+     *
+     * @param interfaceMacAddress interface MAC address
+     */
+    void setInterfaceMacAddress(MacAddress interfaceMacAddress);
+
+    /**
+     * Returns the neighbors list.
+     *
+     * @return neighbors list
+     */
+    Set<MacAddress> neighbors();
+
+    /**
      * Sets intermediate system name.
      *
      * @param intermediateSystemName intermediate system name
@@ -35,6 +90,13 @@
     void setIntermediateSystemName(String intermediateSystemName);
 
     /**
+     * Returns system ID.
+     *
+     * @return systemID system ID
+     */
+    String systemId();
+
+    /**
      * Sets system ID.
      *
      * @param systemId system ID
@@ -42,11 +104,32 @@
     void setSystemId(String systemId);
 
     /**
+     * Returns LAN ID.
+     *
+     * @return LAN ID
+     */
+    String l1LanId();
+
+    /**
      * Sets LAN ID.
      *
      * @param lanId LAN ID
      */
-    void setLanId(String lanId);
+    void setL1LanId(String lanId);
+
+    /**
+     * Returns LAN ID.
+     *
+     * @return LAN ID
+     */
+    String l2LanId();
+
+    /**
+     * Sets LAN ID.
+     *
+     * @param lanId LAN ID
+     */
+    void setL2LanId(String lanId);
 
     /**
      * Sets ID length.
@@ -63,6 +146,13 @@
     void setMaxAreaAddresses(int maxAreaAddresses);
 
     /**
+     * Returns reserved packet circuit type.
+     *
+     * @return reserved packet circuit type
+     */
+    int reservedPacketCircuitType();
+
+    /**
      * Sets reserved packet circuit type.
      *
      * @param reservedPacketCircuitType reserved packet circuit type
@@ -70,11 +160,25 @@
     void setReservedPacketCircuitType(int reservedPacketCircuitType);
 
     /**
+     * Returns point to point or broadcast.
+     *
+     * @return 1 if point to point, 2 broadcast
+     */
+    IsisNetworkType networkType();
+
+    /**
      * Sets point to point.
      *
-     * @param p2p point to point
+     * @param networkType point to point
      */
-    void setP2p(int p2p);
+    void setNetworkType(IsisNetworkType networkType);
+
+    /**
+     * Returns area address.
+     *
+     * @return area address
+     */
+    String areaAddress();
 
     /**
      * Sets area address.
@@ -98,6 +202,13 @@
     void setLspId(String lspId);
 
     /**
+     * Returns holding time.
+     *
+     * @return holding time
+     */
+    int holdingTime();
+
+    /**
      * Sets holding time.
      *
      * @param holdingTime holding time
@@ -105,6 +216,13 @@
     void setHoldingTime(int holdingTime);
 
     /**
+     * Returns priority.
+     *
+     * @return priority
+     */
+    int priority();
+
+    /**
      * Sets priority.
      *
      * @param priority priority
@@ -117,4 +235,70 @@
      * @param helloInterval hello interval
      */
     void setHelloInterval(int helloInterval);
-}
\ No newline at end of file
+
+    /**
+     * Starts the hello timer which sends hello packet every configured seconds.
+     *
+     * @param channel netty channel instance
+     */
+    void startHelloSender(Channel channel);
+
+    /**
+     * Processes an ISIS message which is received on this interface.
+     *
+     * @param isisMessage ISIS message instance
+     * @param isisLsdb    ISIS LSDB instance
+     * @param channel     channel instance
+     */
+    void processIsisMessage(IsisMessage isisMessage, IsisLsdb isisLsdb, Channel channel);
+
+    /**
+     * Returns the interface state.
+     *
+     * @return interface state
+     */
+    IsisInterfaceState interfaceState();
+
+    /**
+     * Sets the interface state.
+     *
+     * @param interfaceState the interface state
+     */
+    void setInterfaceState(IsisInterfaceState interfaceState);
+
+    /**
+     * Returns the LSDB instance.
+     *
+     * @return LSDB instance
+     */
+    IsisLsdb isisLsdb();
+
+    /**
+     * Returns intermediate system name.
+     *
+     * @return intermediate system name
+     */
+    String intermediateSystemName();
+
+    /**
+     * Returns the ISIS neighbor instance if exists.
+     *
+     * @param isisNeighborMac mac address of the neighbor router
+     * @return ISIS neighbor instance if exists else null
+     */
+    IsisNeighbor lookup(MacAddress isisNeighborMac);
+
+    /**
+     * Returns circuit ID.
+     *
+     * @return circuit ID
+     */
+    String circuitId();
+
+    /**
+     * Sets circuit ID.
+     *
+     * @param circuitId circuit ID
+     */
+    void setCircuitId(String circuitId);
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisInterfaceState.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisInterfaceState.java
new file mode 100644
index 0000000..500ff7c
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisInterfaceState.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Enum represents ISIS Interface state.
+ */
+public enum IsisInterfaceState {
+    /**
+     * Represents interface is in "up" state.
+     */
+    UP(0),
+    /**
+     * Represents interface is in "initial" state.
+     */
+    INITIAL(1),
+    /**
+     * Represents interface is in "down" state.
+     */
+    DOWN(2);
+
+    // Reverse lookup table
+    private static final Map<Integer, IsisInterfaceState> LOOKUP = new HashMap<>();
+
+    // Populate the lookup table on loading time
+    static {
+        for (IsisInterfaceState isisInterfaceState : EnumSet.allOf(IsisInterfaceState.class)) {
+            LOOKUP.put(isisInterfaceState.value(), isisInterfaceState);
+        }
+    }
+
+    private int value;
+
+    /**
+     * Creates an instance of ISIS interface type.
+     *
+     * @param value represents ISIS interface type
+     */
+    private IsisInterfaceState(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the enum instance from type value - reverse lookup purpose.
+     *
+     * @param interfaceStateTypeValue interface state type value
+     * @return ISIS interface state type instance
+     */
+    public static IsisInterfaceState get(int interfaceStateTypeValue) {
+        return LOOKUP.get(interfaceStateTypeValue);
+    }
+
+    /**
+     * Gets the value representing interface state type.
+     *
+     * @return value represents interface state type
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java
index 851ed17..7ceb9f1 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java
@@ -13,18 +13,84 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.onosproject.isis.controller;
 
+import java.util.List;
+
 /**
  * Representation of an ISIS link state database.
  */
 public interface IsisLsdb {
 
     /**
-     * Gets the ISIS LSDB.
+     * Returns the ISIS LSDB.
      *
      * @return ISIS LSDB
      */
     IsisLsdb isisLsdb();
-}
\ No newline at end of file
+
+    /**
+     * Initializes LSDB.
+     */
+    void initializeDb();
+
+    /**
+     * Returns the LSDB LSP key.
+     *
+     * @param systemId system ID
+     * @return LSP key
+     */
+    String lspKey(String systemId);
+
+    /**
+     * Returns the sequence number.
+     *
+     * @param lspType L1 or L2 LSP
+     * @return sequence number
+     */
+    int lsSequenceNumber(IsisPduType lspType);
+
+    /**
+     * Finds the LSP from LSDB.
+     *
+     * @param pduType L1 or L2 LSP
+     * @param lspId   LSP ID
+     * @return LSP wrapper object
+     */
+    LspWrapper findLsp(IsisPduType pduType, String lspId);
+
+    /**
+     * Installs a new self-originated LSA in LSDB.
+     * Return true if installing was successful else false.
+     *
+     * @param lsPdu            PDU instance
+     * @param isSelfOriginated true if self originated else false
+     * @param isisInterface    ISIS interface instance
+     * @return true if successfully added
+     */
+    boolean addLsp(IsisMessage lsPdu, boolean isSelfOriginated, IsisInterface isisInterface);
+
+    /**
+     * Checks received LSP is latest, same or old.
+     *
+     * @param receivedLsp received LSP
+     * @param lspFromDb   existing LSP
+     * @return "latest", "old" or "same"
+     */
+    String isNewerOrSameLsp(IsisMessage receivedLsp, IsisMessage lspFromDb);
+
+    /**
+     * Returns all LSPs (L1 and L2).
+     *
+     * @param excludeMaxAgeLsp exclude the max age LSPs
+     * @return List of LSPs
+     */
+    List<LspWrapper> allLspHeaders(boolean excludeMaxAgeLsp);
+
+    /**
+     * Deletes the given LSP.
+     *
+     * @param lsp LSP instance
+     */
+    void deleteLsp(IsisMessage lsp);
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdbAge.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdbAge.java
new file mode 100644
index 0000000..314f9f8
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdbAge.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller;
+
+/**
+ * Representation of an ISIS link state database aging.
+ */
+public interface IsisLsdbAge {
+
+    /**
+     * Starts the aging timer thread which gets invokes every second.
+     */
+    void startDbAging();
+
+    /**
+     * Returns the age counter.
+     *
+     * @return age counter
+     */
+    int ageCounter();
+
+    /**
+     * Returns the age counter rollover.
+     *
+     * @return age counter rollover
+     */
+    int ageCounterRollOver();
+
+    /**
+     * Returns the bin number.
+     *
+     * @param x can be either age or ageCounter
+     * @return bin number
+     */
+    int age2Bin(int x);
+
+    /**
+     * Returns the LSP bin instance.
+     *
+     * @param binKey key to search
+     * @return LSP bin instance
+     */
+    IsisLspBin getLspBin(int binKey);
+
+    /**
+     * Adds LSP to bin.
+     *
+     * @param binNumber key to store in bin
+     * @param lspBin    LSP bin instance
+     */
+    void addLspBin(int binNumber, IsisLspBin lspBin);
+
+    /**
+     * Removes LSP from bin.
+     *
+     * @param lspWrapper LSP wrapper instance
+     */
+    void removeLspFromBin(LspWrapper lspWrapper);
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLspBin.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLspBin.java
new file mode 100644
index 0000000..0964aae
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLspBin.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller;
+
+import java.util.Map;
+
+/**
+ * Representation of an ISIS LSP bin which is part of LSP aging process.
+ */
+public interface IsisLspBin {
+
+    /**
+     * Returns all the LSPs in the bin.
+     *
+     * @return all LSPs in the bin
+     */
+    Map<String, LspWrapper> listOfLsp();
+
+    /**
+     * Adds LSP to bin for aging.
+     *
+     * @param lspKey     key to add the LSP
+     * @param lspWrapper LSP wrapper instance
+     */
+    void addIsisLsp(String lspKey, LspWrapper lspWrapper);
+
+    /**
+     * Removes LSP from bin.
+     *
+     * @param lspKey     LSP key
+     * @param lspWrapper LSP wrapper instance
+     */
+    void removeIsisLsp(String lspKey, LspWrapper lspWrapper);
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisMessage.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisMessage.java
index 8772ec4..35c6f78 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisMessage.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisMessage.java
@@ -13,18 +13,76 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.onosproject.isis.controller;
 
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onlab.packet.MacAddress;
+
 /**
  * Representation of an ISIS Message.
  */
 public interface IsisMessage {
 
     /**
-     * Gets the type of ISIS PDU.
+     * Returns the interface index on which the message received.
+     *
+     * @return interface index on which the message received
+     */
+    int interfaceIndex();
+
+    /**
+     * Sets the interface index on which the message received.
+     *
+     * @param interfaceIndex interface index on which the message received
+     */
+    void setInterfaceIndex(int interfaceIndex);
+
+    /**
+     * Returns the interface mac address on which the message received.
+     *
+     * @return interface mac address on which the message received
+     */
+    MacAddress interfaceMac();
+
+    /**
+     * Sets the interface mac address on which the message received.
+     *
+     * @param interfaceMac mac address on which the message received
+     */
+    void setInterfaceMac(MacAddress interfaceMac);
+
+    /**
+     * Returns the mac address of the message sender.
+     *
+     * @return mac address of the message sender
+     */
+    MacAddress sourceMac();
+
+    /**
+     * Sets the mac address of the message sender.
+     *
+     * @param sourceMac mac address of the message sender
+     */
+    void setSourceMac(MacAddress sourceMac);
+
+    /**
+     * Returns the type of ISIS PDU.
      *
      * @return ISIS PDU type instance
      */
     IsisPduType isisPduType();
-}
\ No newline at end of file
+
+    /**
+     * Reads from channel buffer and initializes the type of PDU.
+     *
+     * @param channelBuffer channel buffer instance
+     */
+    void readFrom(ChannelBuffer channelBuffer);
+
+    /**
+     * Returns IsisMessage as byte array.
+     *
+     * @return ISIS message as bytes
+     */
+    byte[] asBytes();
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNeighbor.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNeighbor.java
new file mode 100644
index 0000000..f6a462b
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNeighbor.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller;
+
+import org.onlab.packet.MacAddress;
+
+/**
+ * Representation of an ISIS neighbor.
+ */
+public interface IsisNeighbor {
+
+    /**
+     * Returns the MAC address of neighbor.
+     *
+     * @return MAC address of neighbor
+     */
+    MacAddress neighborMacAddress();
+
+    /**
+     * Returns the neighbor interface state.
+     *
+     * @return neighbor interface state
+     */
+    IsisInterfaceState interfaceState();
+
+    /**
+     * Sets the neighbor interface state.
+     *
+     * @param interfaceState the neighbor interface state
+     */
+    void setNeighborState(IsisInterfaceState interfaceState);
+
+    /**
+     * Sets the LAN ID.
+     *
+     * @param l1LanId LAN ID
+     */
+    void setL1LanId(String l1LanId);
+
+    /**
+     * Sets the LAN ID.
+     *
+     * @param l2LanId LAN ID
+     */
+    void setL2LanId(String l2LanId);
+
+    /**
+     * Returns neighbor system ID.
+     *
+     * @return neighbor system ID
+     */
+    String neighborSystemId();
+
+    /**
+     * Returns neighbor circuit ID.
+     *
+     * @return neighbor circuit ID
+     */
+    byte localCircuitId();
+
+    /**
+     * Returns neighbor extended circuit ID.
+     *
+     * @return neighbor extended circuit ID
+     */
+    int localExtendedCircuitId();
+
+    /**
+     * Sets neighbor extended circuit ID.
+     *
+     * @param localExtendedCircuitId neighbor extended circuit ID
+     */
+    void setLocalExtendedCircuitId(int localExtendedCircuitId);
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNetworkType.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNetworkType.java
new file mode 100644
index 0000000..083e6d9
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNetworkType.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Represents ISIS network types.
+ */
+public enum IsisNetworkType {
+    /**
+     * Represents point-to-point network.
+     */
+    P2P(1),
+    /**
+     * Represents broadcast network.
+     */
+    BROADCAST(2);
+    // Reverse lookup table
+    private static final Map<Integer, IsisNetworkType> LOOKUP = new HashMap<>();
+
+    // Populate the lookup table on loading time
+    static {
+        for (IsisNetworkType isisNetworkType : EnumSet.allOf(IsisNetworkType.class)) {
+            LOOKUP.put(isisNetworkType.value(), isisNetworkType);
+        }
+    }
+
+    private int value;
+
+
+    /**
+     * Creates an instance of ISIS network type.
+     *
+     * @param value represents ISIS network type
+     */
+    private IsisNetworkType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the enum instance from type value - reverse lookup purpose.
+     *
+     * @param isisNetworkTypeValue interface network type value
+     * @return ISIS interface network type instance
+     */
+    public static IsisNetworkType get(int isisNetworkTypeValue) {
+        return LOOKUP.get(isisNetworkTypeValue);
+    }
+
+    /**
+     * Gets the value representing network type.
+     *
+     * @return value represents network type
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisPduType.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisPduType.java
index f919891..f3917a1 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisPduType.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisPduType.java
@@ -13,9 +13,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.onosproject.isis.controller;
 
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Representation of ISIS PDU types.
  */
@@ -58,8 +61,17 @@
      */
     L2PSNP(27);
 
-    private int value;
+    // Reverse lookup table
+    private static final Map<Integer, IsisPduType> LOOKUP = new HashMap<>();
 
+    // Populate the lookup table on loading time
+    static {
+        for (IsisPduType isisPduType : EnumSet.allOf(IsisPduType.class)) {
+            LOOKUP.put(isisPduType.value(), isisPduType);
+        }
+    }
+
+    private int value;
 
     /**
      * Creates an instance of ISIS PDU type.
@@ -71,6 +83,16 @@
     }
 
     /**
+     * Gets the enum instance from type value - reverse lookup purpose.
+     *
+     * @param pduTypeValue PDU type value
+     * @return ISIS PDU type instance
+     */
+    public static IsisPduType get(int pduTypeValue) {
+        return LOOKUP.get(pduTypeValue);
+    }
+
+    /**
      * Gets the value representing PDU type.
      *
      * @return value represents PDU type
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisProcess.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisProcess.java
index a64a26e..a5d1ae6 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisProcess.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisProcess.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.onosproject.isis.controller;
 
 import java.util.List;
@@ -36,4 +35,11 @@
      * @param isisInterfaceList list of ISIS interface details
      */
     void setIsisInterfaceList(List<IsisInterface> isisInterfaceList);
-}
\ No newline at end of file
+
+    /**
+     * Returns list of ISIS interface details.
+     *
+     * @return list of ISIS interface details
+     */
+    List<IsisInterface> isisInterfaceList();
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouterType.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouterType.java
new file mode 100644
index 0000000..8972540
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouterType.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Representation of ISIS router types.
+ */
+public enum IsisRouterType {
+    /**
+     * Represents ISIS L1 router.
+     */
+    L1(1),
+    /**
+     * Represents ISIS L2 router.
+     */
+    L2(2),
+    /**
+     * Represents ISIS L1/L2 router.
+     */
+    L1L2(3);
+    // Reverse lookup table
+    private static final Map<Integer, IsisRouterType> LOOKUP = new HashMap<>();
+
+    // Populate the lookup table on loading time
+    static {
+        for (IsisRouterType isisRouterType : EnumSet.allOf(IsisRouterType.class)) {
+            LOOKUP.put(isisRouterType.value(), isisRouterType);
+        }
+    }
+
+    private int value;
+
+    /**
+     * Creates an instance of ISIS router type.
+     *
+     * @param value represents ISIS router type
+     */
+    private IsisRouterType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the enum instance from type value - reverse lookup purpose.
+     *
+     * @param routerTypeValue router type value
+     * @return ISIS router type instance
+     */
+    public static IsisRouterType get(int routerTypeValue) {
+        return LOOKUP.get(routerTypeValue);
+    }
+
+    /**
+     * Gets the value representing router type.
+     *
+     * @return value represents router type
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/LspWrapper.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/LspWrapper.java
new file mode 100644
index 0000000..a4615f7
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/LspWrapper.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller;
+
+/**
+ * Representation of a LSP wrapper.
+ */
+public interface LspWrapper {
+
+    /**
+     * Returns bin number into which the LSP wrapper is put for aging process.
+     *
+     * @return bin number
+     */
+    int binNumber();
+
+    /**
+     * Sets bin number into which the LSP wrapper is put for aging process.
+     *
+     * @param binNumber bin number
+     */
+    void setBinNumber(int binNumber);
+
+    /**
+     * Checks the contained LSP is self originated or not.
+     *
+     * @return true if self originated else false
+     */
+    boolean isSelfOriginated();
+
+    /**
+     * Sets the contained LSP is self originated or not.
+     *
+     * @param selfOriginated true if self originated else false
+     */
+    void setSelfOriginated(boolean selfOriginated);
+
+    /**
+     * Returns the LSP type.
+     *
+     * @return LSP type
+     */
+    IsisPduType lspType();
+
+    /**
+     * Returns the LSPs remaining life time.
+     *
+     * @return LSPs remaining life time.
+     */
+    int remainingLifetime();
+
+    /**
+     * Returns the age counter value when LSP was received.
+     *
+     * @return age counter value when LSP was received
+     */
+    int ageCounterWhenReceived();
+
+    /**
+     * Returns the age counter roll over value when LSP was added to wrapper instance.
+     *
+     * @return age counter roll over value when LSP was added to wrapper instance
+     */
+    int ageCounterRollOverWhenAdded();
+
+    /**
+     * Returns the LSP instance stored in wrapper.
+     *
+     * @return LSP instance stored in wrapper
+     */
+    IsisMessage lsPdu();
+
+    /**
+     * Sets LSPs remaining life time.
+     *
+     * @param remainingLifetime LSPs remaining life time
+     */
+    void setRemainingLifetime(int remainingLifetime);
+
+    /**
+     * Returns the age of LSP when received.
+     *
+     * @return age of LSP when received
+     */
+    int lspAgeReceived();
+
+    /**
+     * Returns the LSP processing string.
+     *
+     * @return lsp processing value for switch case
+     */
+    String lspProcessing();
+
+    /**
+     * Returns ISIS interface instance.
+     *
+     * @return ISIS interface instance
+     */
+    IsisInterface isisInterface();
+
+    /**
+     * Returns the current LSP age.
+     *
+     * @return LSP age
+     */
+    int currentAge();
+
+    /**
+     * Sets the LSP processing string based on LSP to process.
+     *
+     * @param lspProcessing "refreshLsp" or "maxageLsp" based on LSP to process
+     */
+    void setLspProcessing(String lspProcessing);
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLink.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLink.java
new file mode 100644
index 0000000..1760106
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLink.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.topology;
+
+import org.onlab.packet.IpAddress;
+
+import java.util.List;
+
+/**
+ * Abstraction of an ISIS Link.
+ */
+public interface IsisLink {
+
+    /**
+     * Returns IP address of the Router.
+     *
+     * @return IP address of router
+     */
+    IpAddress remoteRouterId();
+
+    /**
+     * Returns the area ID for this device.
+     *
+     * @return the area ID
+     */
+    int areaIdOfInterface();
+
+    /**
+     * Returns IP address of the interface.
+     *
+     * @return IP address of the interface
+     */
+    IpAddress interfaceIp();
+
+    /**
+     * Returns the list of link TED details.
+     *
+     * @return linkTed list of link TED
+     */
+    List<IsisLinkTed> linkTed();
+
+    /**
+     * 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 the list of link TED.
+     *
+     * @param linkTed list of link TED
+     */
+    void setLinkTed(List<IsisLinkTed> linkTed);
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLinkListener.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLinkListener.java
new file mode 100644
index 0000000..b96d81c
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLinkListener.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.topology;
+
+/**
+ * Abstraction of an ISIS link listener.
+ */
+public interface IsisLinkListener {
+
+    /**
+     * Notifies that we got a link from network.
+     *
+     * @param isisRouter  router instance
+     * @param isisLinkTed link TED information of router
+     */
+    void addLink(IsisRouter isisRouter, IsisLinkTed isisLinkTed);
+
+    /**
+     * Notifies that a link got removed from network.
+     *
+     * @param isisRouter router instance
+     * @param isisLinkTed isis link ted infromation
+     */
+    void deleteLink(IsisRouter isisRouter, IsisLinkTed isisLinkTed);
+}
\ No newline at end of file
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLinkTed.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLinkTed.java
new file mode 100644
index 0000000..08014b8
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisLinkTed.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.controller.topology;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onlab.util.Bandwidth;
+
+import java.util.List;
+
+/**
+ * Representation of ISIS link traffic engineering parameters.
+ */
+public interface IsisLinkTed {
+
+    /**
+     * Provides maximum bandwidth can be used on the link.
+     *
+     * @return maximum bandwidth
+     */
+    Bandwidth maximumLink();
+
+    /**
+     * Sets maximum band width.
+     *
+     * @param bandwidth maximum bandwidth
+     */
+    void setMaximumLink(Bandwidth bandwidth);
+
+    /**
+     * Amount of bandwidth reservable on the link.
+     *
+     * @return unreserved bandwidth
+     */
+    List<Bandwidth> maxUnResBandwidth();
+
+    /**
+     * Sets max bandwidth that is not reserved on the link.
+     *
+     * @param bandwidth max bandwidth that is not reserved on the link
+     */
+    void setMaxUnResBandwidth(Bandwidth bandwidth);
+
+    /**
+     * Provides max bandwidth that can be reserved on the link.
+     *
+     * @return max bandwidth reserved
+     */
+    Bandwidth maxReserved();
+
+    /**
+     * Sets max bandwidth that can be reserved on the link.
+     *
+     * @param bandwidth max bandwidth that can be reserved on the link
+     */
+    void setMaxReserved(Bandwidth bandwidth);
+
+    /**
+     * Provides Traffic Engineering metric for the link.
+     *
+     * @return Traffic Engineering metric
+     */
+    int teMetric();
+
+    /**
+     * Sets Traffic Engineering metric for the link.
+     *
+     * @param teMetric Traffic Engineering metric for the link
+     */
+    void setTeMetric(int teMetric);
+
+    /**
+     * Provides IPv4 router-Id of local node.
+     *
+     * @return IPv4 router-Id of local node
+     */
+    List<Ip4Address> ipv4LocRouterId();
+
+    /**
+     * Sets IPv4 router-Id of local node.
+     *
+     * @param routerIds IPv4 router-Id of local node
+     */
+    void setIpv4LocRouterId(List<Ip4Address> routerIds);
+
+    /**
+     * Provides IPv6 router-Id of local node.
+     *
+     * @return IPv6 router-Id of local node
+     */
+    List<Ip6Address> ipv6LocRouterId();
+
+    /**
+     * Sets IPv6 router-Id of local node.
+     *
+     * @param routerIds IPv6 router-Id of local node
+     */
+    void setIpv6LocRouterId(List<Ip6Address> routerIds);
+
+    /**
+     * Provides IPv4 router-Id of remote node.
+     *
+     * @return IPv4 router-Id of remote node
+     */
+    List<Ip4Address> ipv4RemRouterId();
+
+    /**
+     * Sets IPv4 router-Id of remote node.
+     *
+     * @param routerIds IPv4 router-Id of remote node
+     */
+    void setIpv4RemRouterId(List<Ip4Address> routerIds);
+
+    /**
+     * Provides IPv6 router-Id of remote node.
+     *
+     * @return IPv6 router-Id of remote node
+     */
+    List<Ip6Address> ipv6RemRouterId();
+
+    /**
+     * Sets IPv6 router-Id of remote node.
+     *
+     * @param routerIds IPv6 router-Id of remote node
+     */
+    void setIpv6RemRouterId(List<Ip6Address> routerIds);
+}
\ No newline at end of file
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouter.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisRouter.java
similarity index 88%
rename from protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouter.java
rename to protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisRouter.java
index a7e41a2..56ad7da 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouter.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisRouter.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.isis.controller;
+package org.onosproject.isis.controller.topology;
 
 import org.onlab.packet.Ip4Address;
 
@@ -23,14 +23,14 @@
 public interface IsisRouter {
 
     /**
-     * Gets IP address of the router.
+     * Returns IP address of the router.
      *
      * @return IP address of the router
      */
     Ip4Address routerIp();
 
     /**
-     * Gets IP address of the interface.
+     * Returns IP address of the interface.
      *
      * @return IP address of the interface
      */
@@ -42,4 +42,4 @@
      * @param routerIp IP address of the router
      */
     void setRouterIp(Ip4Address routerIp);
-}
\ No newline at end of file
+}
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouterListener.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisRouterListener.java
similarity index 95%
rename from protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouterListener.java
rename to protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisRouterListener.java
index 712a4fc..82d6c61 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisRouterListener.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/IsisRouterListener.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.isis.controller;
+package org.onosproject.isis.controller.topology;
 
 /**
  * Abstraction of an ISIS Router Listener.
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/package-info.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/package-info.java
new file mode 100644
index 0000000..27df3df
--- /dev/null
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/topology/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Implementation of the ISIS topology provider.
+ */
+package org.onosproject.isis.controller.topology;
\ No newline at end of file
