Application manages the IP layer topology information - Interfaces

Change-Id: Ie1dea035674ee98583e98a82cca7e33ab0858b92
diff --git a/apps/iptopology-api/pom.xml b/apps/iptopology-api/pom.xml
new file mode 100644
index 0000000..50cb4ad
--- /dev/null
+++ b/apps/iptopology-api/pom.xml
@@ -0,0 +1,29 @@
+<!--
+  ~ Copyright 2015 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="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-apps</artifactId>
+        <version>1.4.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>onos-app-iptopology-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>IP Layer Topology API</description>
+</project>
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/AreaId.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/AreaId.java
new file mode 100644
index 0000000..79a326d
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/AreaId.java
@@ -0,0 +1,70 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+import java.util.Objects;

+

+/**

+ * Area identifier class (32 Bit Area-ID).

+ */

+public class AreaId {

+    private final int areaId;

+

+    /**

+     * Constructor to set area identifier.

+     *

+     * @param areaId area id

+     */

+    public AreaId(int areaId) {

+        this.areaId = areaId;

+    }

+

+    /**

+     * obtain area identifier.

+     *

+     * @return area identifier

+     */

+    public int areaId() {

+        return areaId;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(areaId);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof AreaId) {

+            AreaId other = (AreaId) obj;

+            return Objects.equals(areaId, other.areaId);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .add("areaId", areaId)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/AsNumber.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/AsNumber.java
new file mode 100644
index 0000000..3159b20
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/AsNumber.java
@@ -0,0 +1,70 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+import java.util.Objects;

+

+/**

+ * Autonomous system Number class (32 Bit ASNumber).

+ */

+public class AsNumber {

+    private final int asNum;

+

+    /**

+     * Constructor to set As number.

+     *

+     * @param asNum As number

+     */

+    public AsNumber(int asNum) {

+        this.asNum = asNum;

+    }

+

+    /**

+     * Obtain autonomous system number.

+     *

+     * @return autonomous system number

+     */

+    public int asNum() {

+        return asNum;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(asNum);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof AsNumber) {

+            AsNumber other = (AsNumber) obj;

+            return Objects.equals(asNum, other.asNum);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .add("asNum", asNum)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Color.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Color.java
new file mode 100644
index 0000000..cb38fa6
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Color.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents administrative group color.
+ * bit mask - least significant bit is referred to as 'group 0',
+ * and the most significant bit is referred to as 'group 31'
+ */
+public class Color {
+    private final int color;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param color assigned by the network administrator
+     */
+    public Color(int color) {
+        this.color = color;
+    }
+
+    /**
+     * Obtains administrative group.
+     *
+     * @return administrative group
+     */
+    public int color() {
+        return color;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(color);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof Color) {
+            Color other = (Color) obj;
+            return Objects.equals(color, other.color);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("color", color)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultDeviceIntf.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultDeviceIntf.java
new file mode 100644
index 0000000..e40cbfc
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultDeviceIntf.java
@@ -0,0 +1,79 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+import java.util.Objects;

+

+import org.onosproject.net.Element;

+

+/**

+ * Default Device interface implementation.

+ */

+public class DefaultDeviceIntf implements DeviceIntf {

+

+    private final Element element;

+    private final DeviceInterface deviceInterface;

+

+    /**

+     * Constructor to initialize device interface parameters.

+     *

+     * @param element parent network element

+     * @param deviceInterface device interface

+     */

+    public DefaultDeviceIntf(Element element, DeviceInterface deviceInterface) {

+        this.element = element;

+        this.deviceInterface = deviceInterface;

+    }

+

+    @Override

+    public Element element() {

+        return element;

+    }

+

+    @Override

+    public DeviceInterface deviceInterface() {

+        return deviceInterface;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(element, deviceInterface);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof DefaultDeviceIntf) {

+            final DefaultDeviceIntf other = (DefaultDeviceIntf) obj;

+            return Objects.equals(this.element.id(), other.element.id())

+                    && Objects.equals(this.deviceInterface, other.deviceInterface);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .add("element", element.id())

+                .add("deviceInterface", deviceInterface)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultDevicePrefix.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultDevicePrefix.java
new file mode 100644
index 0000000..2b1dde6
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultDevicePrefix.java
@@ -0,0 +1,95 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import org.onosproject.net.AbstractAnnotated;

+import org.onosproject.net.Annotations;

+import org.onosproject.net.Element;

+

+import java.util.Objects;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+/**

+ * Default Device prefix implementation.

+ */

+public class DefaultDevicePrefix extends AbstractAnnotated implements DevicePrefix {

+

+    private final Element element;

+    private final PrefixIdentifier prefixIdentifier;

+    private final PrefixTed prefixTed;

+

+    /**

+     * Creates a network device prefix attributed to the specified element.

+     *

+     * @param element           parent network element

+     * @param prefixIdentifier  prefix identifier

+     * @param prefixTed         prefid traffic engineering parameters

+     * @param annotations       optional key/value annotations

+     */

+    public DefaultDevicePrefix(Element element, PrefixIdentifier prefixIdentifier,

+                               PrefixTed prefixTed, Annotations... annotations) {

+        super(annotations);

+        this.element = element;

+        this.prefixIdentifier = prefixIdentifier;

+        this.prefixTed = prefixTed;

+    }

+

+    @Override

+    public Element element() {

+        return element;

+    }

+

+    @Override

+    public PrefixIdentifier prefixIdentifier() {

+        return prefixIdentifier;

+    }

+

+    @Override

+    public PrefixTed prefixTed() {

+        return prefixTed;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(element, prefixIdentifier, prefixTed);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+        if (obj instanceof DefaultDevicePrefix) {

+            final DefaultDevicePrefix other = (DefaultDevicePrefix) obj;

+            return Objects.equals(this.element.id(), other.element.id()) &&

+                    Objects.equals(this.prefixIdentifier, other.prefixIdentifier) &&

+                    Objects.equals(this.prefixTed, other.prefixTed) &&

+                    Objects.equals(this.annotations(), other.annotations());

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .omitNullValues()

+                .add("element", element.id())

+                .add("prefixIdentifier", prefixIdentifier)

+                .add("prefixTed", prefixTed)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultIpDevice.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultIpDevice.java
new file mode 100644
index 0000000..a2d0165
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultIpDevice.java
@@ -0,0 +1,113 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import org.onosproject.net.AbstractElement;

+import org.onosproject.net.Annotations;

+import org.onosproject.net.DeviceId;

+import org.onosproject.net.provider.ProviderId;

+

+import java.util.Objects;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+/**

+ * Default ip device model implementation.

+ */

+public class DefaultIpDevice extends AbstractElement implements IpDevice {

+

+    private final Type type;

+    private final IpDeviceIdentifier deviceIdentifier;

+    private final DeviceTed deviceTed;

+

+

+    /**

+     * For Serialization.

+     */

+    private DefaultIpDevice() {

+        this.type = null;

+        this.deviceIdentifier = null;

+        this.deviceTed = null;

+    }

+

+    /**

+     * Creates a network element attributed to the specified provider.

+     *

+     * @param providerId   identity of the provider

+     * @param id           device identifier

+     * @param type         device type

+     * @param deviceIdentifier provides device identifier details

+     * @param deviceTed device traffic engineering parameters

+     * @param annotations  optional key/value annotations

+     */

+    public DefaultIpDevice(ProviderId providerId, DeviceId id, Type type,

+                         IpDeviceIdentifier deviceIdentifier, DeviceTed deviceTed,

+                         Annotations... annotations) {

+        super(providerId, id, annotations);

+        this.type = type;

+        this.deviceIdentifier = deviceIdentifier;

+        this.deviceTed = deviceTed;

+    }

+

+    @Override

+    public DeviceId id() {

+        return (DeviceId) id;

+    }

+

+    @Override

+    public Type type() {

+        return type;

+    }

+

+    @Override

+    public IpDeviceIdentifier deviceIdentifier() {

+        return deviceIdentifier;

+    }

+

+    @Override

+    public DeviceTed deviceTed() {

+        return deviceTed; }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(type, deviceIdentifier, deviceTed);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof DefaultIpDevice) {

+            final DefaultIpDevice other = (DefaultIpDevice) obj;

+            return Objects.equals(this.id, other.id) &&

+                    Objects.equals(this.type, other.type) &&

+                    Objects.equals(this.deviceIdentifier, other.deviceIdentifier) &&

+                    Objects.equals(this.deviceTed, other.deviceTed);

+        }

+        return false;

+    }

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .omitNullValues()

+                .add("id", id)

+                .add("deviceIdentifier", deviceIdentifier)

+                .add("deviceTed", deviceTed)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultIpLink.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultIpLink.java
new file mode 100644
index 0000000..41f0604
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DefaultIpLink.java
@@ -0,0 +1,105 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import org.onosproject.net.AbstractModel;

+import org.onosproject.net.Annotations;

+import org.onosproject.net.provider.ProviderId;

+

+import java.util.Objects;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+/**

+ * This class provides Link identifier and link ted details.

+ */

+public class DefaultIpLink extends AbstractModel implements IpLink {

+

+    private final TerminationPoint src;

+    private final TerminationPoint dst;

+    private final IpLinkIdentifier linkIdentifier;

+    private final LinkTed linkTed;

+

+    /**

+     * Constructor to initialize its parameters.

+     *

+     * @param src            link source termination point

+     * @param dst            link destination termination point

+     * @param linkIdentifier provides link identifier details

+     * @param linkTed        provides link traffic engineering details

+     * @param annotations    optional key/value annotations

+     */

+    public DefaultIpLink(ProviderId providerId, TerminationPoint src, TerminationPoint dst,

+                         IpLinkIdentifier linkIdentifier, LinkTed linkTed,

+                         Annotations... annotations) {

+        super(providerId, annotations);

+        this.src = src;

+        this.dst = dst;

+        this.linkIdentifier = linkIdentifier;

+        this.linkTed = linkTed;

+    }

+

+    @Override

+    public TerminationPoint src() {

+        return src;

+    }

+

+    @Override

+    public TerminationPoint dst() {

+        return dst;

+    }

+

+    @Override

+    public IpLinkIdentifier linkIdentifier() {

+        return linkIdentifier;

+    }

+

+    @Override

+    public LinkTed linkTed() {

+        return linkTed;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(src, dst, linkIdentifier, linkTed);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+        if (obj instanceof DefaultIpLink) {

+            final DefaultIpLink other = (DefaultIpLink) obj;

+            return Objects.equals(this.src, other.src) &&

+                    Objects.equals(this.dst, other.dst) &&

+                    Objects.equals(this.linkIdentifier, other.linkIdentifier) &&

+                    Objects.equals(this.linkTed, other.linkTed);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .omitNullValues()

+                .add("src", src)

+                .add("dst", dst)

+                .add("linkIdentifier", linkIdentifier)

+                .add("linkTed", linkTed)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceInterface.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceInterface.java
new file mode 100644
index 0000000..131aa62
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceInterface.java
@@ -0,0 +1,100 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import java.util.Objects;

+

+import org.onlab.packet.Ip4Address;

+import org.onlab.packet.Ip6Address;

+

+import com.google.common.base.MoreObjects;

+

+/**

+ * Representation of device interface.

+ */

+public class DeviceInterface {

+    private final Ip4Address ip4Address;

+    private final Ip6Address ip6Address;

+    private final InterfaceIdentifier interfaceId;

+

+    /**

+     * Constructor to initialize its parameter.

+     *

+     * @param ip4Address ipv4 interface address

+     * @param ip6Address ipv6 interface address

+     * @param interfaceId interface Identifier

+     */

+    public DeviceInterface(Ip4Address ip4Address, Ip6Address ip6Address, InterfaceIdentifier interfaceId) {

+        this.ip4Address = ip4Address;

+        this.ip6Address = ip6Address;

+        this.interfaceId = interfaceId;

+    }

+

+    /**

+     * obtains ipv4 address of an interface.

+     *

+     * @return ipv4 interface address

+     */

+    public Ip4Address ip4Address() {

+        return ip4Address;

+    }

+

+    /**

+     * obtains ipv6 interface address.

+     *

+     * @return ipv6 interface address

+     */

+    public Ip6Address ip6Address() {

+        return ip6Address;

+    }

+

+    /**

+     * obtains interface identifier.

+     *

+     * @return interface identifier

+     */

+    public InterfaceIdentifier interfaceId() {

+        return interfaceId;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(ip4Address, ip6Address, interfaceId);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+        if (obj instanceof DeviceInterface) {

+            final DeviceInterface other = (DeviceInterface) obj;

+            return Objects.equals(this.ip4Address, other.ip4Address)

+                    && Objects.equals(this.ip6Address, other.ip6Address)

+                    && Objects.equals(this.interfaceId, other.interfaceId);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return MoreObjects.toStringHelper(this)

+                .add("ip4Address", ip4Address)

+                .add("ip6Address", ip6Address)

+                .add("interfaceId", interfaceId)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceIntf.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceIntf.java
new file mode 100644
index 0000000..ff18d3a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceIntf.java
@@ -0,0 +1,37 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import org.onosproject.net.Element;

+

+/**

+ * Abstraction of Device interface.

+ */

+public interface DeviceIntf {

+    /**

+     * Returns the parent network element to which this interface belongs.

+     *

+     * @return parent network element

+     */

+    Element element();

+

+    /**

+     * Returns device interface details.

+     *

+     * @return device interface details

+     */

+    DeviceInterface deviceInterface();

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DevicePrefix.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DevicePrefix.java
new file mode 100644
index 0000000..89efccd
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DevicePrefix.java
@@ -0,0 +1,46 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import org.onosproject.net.Annotated;

+import org.onosproject.net.Element;

+

+/**

+ * Abstraction of Device Prefix.

+ */

+public interface DevicePrefix extends Annotated {

+

+    /**

+     * Returns the parent network element to which this port belongs.

+     *

+     * @return parent network element

+     */

+    Element element();

+

+    /**

+     * Returns prefix identifier details.

+     *

+     *  @return prefix identifier details

+     */

+    PrefixIdentifier prefixIdentifier();

+

+    /**

+     * Returns prefix Traffic engineering parameters.

+     *

+     * @return prefix Traffic engineering parameters

+     */

+    PrefixTed prefixTed();

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceTed.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceTed.java
new file mode 100644
index 0000000..4d9da55
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DeviceTed.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+
+/**
+ * Represents Device Traffic Engineering parameters.
+ */
+public class DeviceTed {
+    private final List<Ip4Address> ipv4RouterIds;
+    private final List<Ip6Address> ipv6RouterIds;
+    private final List<TopologyId> topologyIds;
+    private final Position position;
+
+    /**
+     * Constructor to initialize the parameter fields.
+     *
+     * @param ipv4RouterIds Router ids of Ipv4
+     * @param ipv6RouterIds Router ids of Ipv6
+     * @param topologyIds list of multi-topology IDs of the node
+     * @param position of router whether it is ABR or ASBR
+     */
+    public DeviceTed(List<Ip4Address> ipv4RouterIds, List<Ip6Address> ipv6RouterIds,
+                     List<TopologyId> topologyIds, Position position) {
+        this.ipv4RouterIds = ipv4RouterIds;
+        this.ipv6RouterIds = ipv6RouterIds;
+        this.topologyIds = topologyIds;
+        this.position = position;
+    }
+
+    /**
+     * Obtain list of Ipv4 Router id.
+     *
+     * @return Ipv4 Router ids
+     */
+    public List<Ip4Address> ipv4RouterIds() {
+        return ipv4RouterIds;
+    }
+
+    /**
+     * Obtain list of Ipv6 Router id.
+     *
+     * @return Ipv6 Router ids
+     */
+    public List<Ip6Address> ipv6RouterIds() {
+        return ipv6RouterIds;
+    }
+
+    /**
+     * Obtain the list of topology ID's.
+     *
+     * @return list of topology id's
+     */
+    public List<TopologyId> topologyIds() {
+        return topologyIds;
+    }
+
+
+    /**
+     * Obtain position of device in the network.
+     *
+     * @return position of device in the network
+     */
+    public Position position() {
+        return position;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipv4RouterIds, ipv6RouterIds, topologyIds, position);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof DeviceTed) {
+            int countObjSubTlv = 0;
+            int countOtherSubTlv = 0;
+            int countObjTopologyId = 0;
+            int countOtherTopologyId = 0;
+            boolean isCommonSubTlv = true;
+            boolean isCommonSubTlv6 = true;
+            boolean isCommonTopology = true;
+            DeviceTed other = (DeviceTed) obj;
+            Iterator<Ip4Address> objListIterator = other.ipv4RouterIds.iterator();
+            countOtherSubTlv = other.ipv4RouterIds.size();
+            countObjSubTlv = ipv4RouterIds.size();
+
+            Iterator<Ip6Address> objListIteratorIpv6 = other.ipv6RouterIds.iterator();
+            int countOtherSubTlv6 = other.ipv6RouterIds.size();
+            int countObjSubTlv6 = ipv6RouterIds.size();
+
+            Iterator<TopologyId> topologyId = other.topologyIds.iterator();
+            countOtherTopologyId = other.topologyIds.size();
+            countObjTopologyId = topologyIds.size();
+
+            if (countObjSubTlv != countOtherSubTlv || countOtherSubTlv6 != countObjSubTlv6
+                    || countObjTopologyId != countOtherTopologyId) {
+                return false;
+            } else {
+                while (objListIterator.hasNext() && isCommonSubTlv) {
+                    Ip4Address subTlv = objListIterator.next();
+                    //find index of that element and then get that from the list and then compare
+                    if (ipv4RouterIds.contains(subTlv) && other.ipv4RouterIds.contains(subTlv)) {
+                        isCommonSubTlv = Objects.equals(ipv4RouterIds.get(ipv4RouterIds.indexOf(subTlv)),
+                                other.ipv4RouterIds.get(other.ipv4RouterIds.indexOf(subTlv)));
+                    } else {
+                        isCommonSubTlv = false;
+                    }
+                }
+                while (objListIteratorIpv6.hasNext() && isCommonSubTlv6) {
+                    Ip6Address subTlv = objListIteratorIpv6.next();
+                    //find index of that element and then get that from the list and then compare
+                    if (ipv6RouterIds.contains(subTlv) && other.ipv6RouterIds.contains(subTlv)) {
+                        isCommonSubTlv6 = Objects.equals(ipv6RouterIds.get(ipv6RouterIds.indexOf(subTlv)),
+                                other.ipv6RouterIds.get(other.ipv6RouterIds.indexOf(subTlv)));
+                    } else {
+                        isCommonSubTlv6 = false;
+                    }
+                }
+                while (topologyId.hasNext() && isCommonTopology) {
+                    TopologyId subTlv = topologyId.next();
+                    //find index of that element and then get that from the list and then compare
+                    if (topologyIds.contains(subTlv) && other.topologyIds.contains(subTlv)) {
+                        isCommonTopology = Objects.equals(topologyIds.get(topologyIds.indexOf(subTlv)),
+                                other.topologyIds.get(other.topologyIds.indexOf(subTlv)));
+                    } else {
+                        isCommonTopology = false;
+                    }
+                }
+                return isCommonSubTlv && isCommonSubTlv6 && isCommonTopology
+                        && Objects.equals(position, other.position);
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .omitNullValues()
+                .add("ipv6RouterIds", ipv6RouterIds)
+                .add("ipv4RouterIds", ipv4RouterIds)
+                .add("topologyIds", topologyIds)
+                .add("position", position)
+                .toString();
+    }
+
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DomainId.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DomainId.java
new file mode 100644
index 0000000..4fb1070
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/DomainId.java
@@ -0,0 +1,71 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+import java.util.Objects;

+

+/**

+ * Domain Identifier(32 Bit).

+ */

+public class DomainId {

+    private final int domainIdentifier;

+

+    /**

+     * Constructor to initialize domain identifier.

+     *

+     * @param domainIdentifier domain identifier

+     */

+    public DomainId(int domainIdentifier) {

+        this.domainIdentifier = domainIdentifier;

+    }

+

+    /**

+     * Obtain domain identifier.

+     *

+     * @return domain identifier

+     */

+    public int domainIdentifier() {

+        return domainIdentifier;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(domainIdentifier);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof DomainId) {

+            DomainId other = (DomainId) obj;

+            return Objects.equals(domainIdentifier, other.domainIdentifier);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .add("domainIdentifier", domainIdentifier)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/ExtendedRouteTag.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/ExtendedRouteTag.java
new file mode 100644
index 0000000..9bd87c1
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/ExtendedRouteTag.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents the extended igp administrative tags of the prefix.
+ */
+public class ExtendedRouteTag {
+    private final long extRouteTag;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param extRouteTag extended ISIS route tag
+     */
+    public ExtendedRouteTag(long extRouteTag) {
+        this.extRouteTag = extRouteTag;
+    }
+
+    /**
+     * Obtains extended igp administrative tags.
+     *
+     * @return extended igp administrative tags
+     */
+    public long extRouteTag() {
+        return extRouteTag;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(extRouteTag);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof ExtendedRouteTag) {
+            ExtendedRouteTag other = (ExtendedRouteTag) obj;
+            return Objects.equals(extRouteTag, other.extRouteTag);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("extRouteTag", extRouteTag)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IgpFlags.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IgpFlags.java
new file mode 100644
index 0000000..59084c0
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IgpFlags.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * This class provides implementation IS-IS and OSPF flags assigned to the prefix.
+ */
+public class IgpFlags {
+    private final boolean isisUpDown;
+    private final boolean ospfNoUnicast;
+    private final boolean ospfLclAddr;
+    private final boolean ospfNssa;
+
+    /**
+     * Constructor to initialize its parameters.
+     *
+     * @param isisUpDown IS-IS Up/Down
+     * @param ospfNoUnicast OSPF no unicast
+     * @param ospfLclAddr OSPF local address
+     * @param ospfNssa OSPF propagate NSSA
+     */
+     public IgpFlags(boolean isisUpDown, boolean ospfNoUnicast, boolean ospfLclAddr,
+                     boolean ospfNssa) {
+         this.isisUpDown = isisUpDown;
+         this.ospfNoUnicast = ospfNoUnicast;
+         this.ospfLclAddr = ospfLclAddr;
+         this.ospfNssa = ospfNssa;
+     }
+
+    /**
+     * Provides information whether IS-IS is Up/Down.
+     *
+     * @return IS-IS Up/Down bit enabled or not
+     */
+    public boolean isisUpDown() {
+        return isisUpDown;
+    }
+
+    /**
+     * Provides information whether OSPF is unicast or not.
+     *
+     * @return OSPF no unicast Bit set or not
+     */
+    public boolean ospfNoUnicast() {
+        return ospfNoUnicast;
+    }
+
+    /**
+     * Provides information on OSPF local address.
+     *
+     * @return OSPF local address Bit set or not
+     */
+    public boolean ospfLclAddr() {
+        return ospfLclAddr;
+    }
+
+    /**
+     * Provides information on OSPF propagate NSSA.
+     *
+     * @return OSPF propagate NSSA Bit set or not
+     */
+    public boolean ospfNssa() {
+        return ospfNssa;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(isisUpDown, ospfNoUnicast, ospfLclAddr,
+                            ospfNssa);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof IgpFlags) {
+            IgpFlags other = (IgpFlags) obj;
+            return Objects.equals(isisUpDown, other.isisUpDown)
+                    && Objects.equals(ospfNoUnicast, other.ospfNoUnicast)
+                    && Objects.equals(ospfLclAddr, other.ospfLclAddr)
+                    && Objects.equals(ospfNssa, other.ospfNssa);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("isisUpDown", isisUpDown)
+                .add("ospfNoUnicast", ospfNoUnicast)
+                .add("ospfLclAddr", ospfLclAddr)
+                .add("ospfNssa", ospfNssa)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/InterfaceIdentifier.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/InterfaceIdentifier.java
new file mode 100644
index 0000000..405e141
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/InterfaceIdentifier.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * This class provides information on Local Interface Identifier and Remote
+ * Interface Identifier of the link.
+ */
+public class InterfaceIdentifier {
+    private final Integer identifier;
+
+    /**
+     * Constructor to initialize identifier.
+     *
+     * @param identifier local/remote interface identifier
+     */
+    public InterfaceIdentifier(Integer identifier) {
+        this.identifier = identifier;
+    }
+
+    /**
+     * Provides the local/remote interface identifier of the link.
+     *
+     * @return interface identifier
+     */
+    public Integer identifier() {
+        return identifier;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(identifier);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof InterfaceIdentifier) {
+            InterfaceIdentifier other = (InterfaceIdentifier) obj;
+            return Objects.equals(identifier, other.identifier);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("identifier", identifier)
+                .toString();
+    }
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpDevice.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpDevice.java
new file mode 100644
index 0000000..131b7ea
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpDevice.java
@@ -0,0 +1,68 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import org.onosproject.net.DeviceId;

+import org.onosproject.net.Element;

+

+/**

+ * Abstraction of Ip Device.

+ */

+public interface IpDevice extends Element {

+    /**

+     ** Enum type to store Device Type.

+     */

+    enum Type {

+        /**

+         * Signifies that the device is pseudo device.

+         */

+        PSEUDO,

+

+        /**

+         * Signifies that the device is non-pseudo device.

+         */

+        NONPSEUDO;

+    }

+

+    /**

+     * Obtains device id.

+     *

+     * @return device id

+     */

+    @Override

+    DeviceId id();

+

+    /**

+     * Obtains device type.

+     *

+     * @return device type

+     */

+    Type type();

+

+    /**

+     * Obtains Device identifier details.

+     *

+     * @return identifier of the device

+     */

+    IpDeviceIdentifier deviceIdentifier();

+

+    /**

+     * Obtains the traffic engineering parameters of the device.

+     *

+     * @return traffic engineering parameters of the device

+     */

+    DeviceTed deviceTed();

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpDeviceIdentifier.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpDeviceIdentifier.java
new file mode 100644
index 0000000..472fe00
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpDeviceIdentifier.java
@@ -0,0 +1,141 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+import java.util.Objects;

+

+/**

+ * Represents IP Device Identifiers.

+ */

+public class IpDeviceIdentifier {

+

+    private final RouteDistinguisher routeDish;

+    private final RouteInstance routeInstance;

+    private final AsNumber asNum;

+    private final DomainId domainIdentifier;

+    private final AreaId areaId;

+    private final RouteIdentifier routerIdentifier;

+

+    /**

+     * Constructor to initialize parameters.

+     *

+     * @param routeInstance routing protocol instance

+     * @param asNum AS number

+     * @param domainIdentifier BGP-LS domain

+     * @param areaId Area ID

+     * @param routerIdentifier IGP router ID

+     */

+    public IpDeviceIdentifier(RouteDistinguisher routeDish, RouteInstance routeInstance, AsNumber asNum,

+                           DomainId domainIdentifier, AreaId areaId, RouteIdentifier routerIdentifier) {

+        this.routeDish = routeDish;

+        this.areaId = areaId;

+        this.asNum = asNum;

+        this.domainIdentifier = domainIdentifier;

+        this.routeInstance = routeInstance;

+        this.routerIdentifier = routerIdentifier;

+    }

+

+    /**

+     * Obtains Route Distinguisher of Ip Device.

+     *

+     * @return Area ID

+     */

+    public RouteDistinguisher routeDish() {

+        return routeDish;

+    }

+

+    /**

+     * Obtains Area ID if Ip Device.

+     *

+     * @return Area ID

+     */

+    public AreaId areaId() {

+        return areaId;

+    }

+

+    /**

+     * Obtains AS number of Ip Device.

+     *

+     * @return AS number

+     */

+    public AsNumber asNum() {

+        return asNum;

+    }

+

+    /**

+     * Obtains domain identifier of Ip Device.

+     *

+     * @return domain identifier

+     */

+    public DomainId domainIdentifier() {

+        return domainIdentifier;

+    }

+

+    /**

+     * Obtains Router id of Ip Device.

+     *

+     * @return Router id

+     */

+    public RouteIdentifier routerIdentifier() {

+        return routerIdentifier;

+    }

+

+    /**

+     * Obtains routing protocol instance.

+     *

+     * @return routing protocol instance

+     */

+    public RouteInstance routeInstance() {

+        return routeInstance;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(routeDish, areaId, asNum, domainIdentifier, routerIdentifier, routeInstance);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof IpDeviceIdentifier) {

+            IpDeviceIdentifier other = (IpDeviceIdentifier) obj;

+            return Objects.equals(areaId, other.areaId) && Objects.equals(asNum, other.asNum)

+                    && Objects.equals(domainIdentifier, other.domainIdentifier)

+                    && Objects.equals(routerIdentifier, other.routerIdentifier)

+                    && Objects.equals(routeInstance, other.routeInstance)

+                    && Objects.equals(routeDish, other.routeDish);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .omitNullValues()

+                .add("areaId", areaId)

+                .add("asNum", asNum)

+                .add("domainIdentifier", domainIdentifier)

+                .add("routerIdentifier", routerIdentifier)

+                .add("routeInstance", routeInstance)

+                .add("routeDish", routeDish)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpLink.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpLink.java
new file mode 100644
index 0000000..d632d2d
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpLink.java
@@ -0,0 +1,54 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import org.onosproject.net.Annotated;

+import org.onosproject.net.NetworkResource;

+import org.onosproject.net.Provided;

+

+/**

+ * Abstraction of a network ip link.

+ */

+public interface IpLink extends Annotated, Provided, NetworkResource {

+

+    /**

+     * Returns source termination point of link.

+     *

+     * @return source termination point of link

+     */

+    TerminationPoint src();

+

+    /**

+     * Returns destination termination point of link.

+     *

+     * @return destination termination point of link

+     */

+    TerminationPoint dst();

+

+    /**

+     * Returns link identifier details.

+     *

+     * @return link identifier details

+     */

+    IpLinkIdentifier linkIdentifier();

+

+    /**

+     * Returns the link traffic engineering parameters.

+     *

+     * @return links traffic engineering parameters

+     */

+    LinkTed linkTed();

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpLinkIdentifier.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpLinkIdentifier.java
new file mode 100644
index 0000000..8522f94
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpLinkIdentifier.java
@@ -0,0 +1,161 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+import java.util.Objects;

+

+import org.onlab.packet.Ip4Address;

+import org.onlab.packet.Ip6Address;

+

+/**

+ * Represents Ip Link Identifier.

+ */

+public class IpLinkIdentifier {

+    private final InterfaceIdentifier localIndentifier;

+    private final InterfaceIdentifier remoteIndentifier;

+    private final Ip4Address localIpv4Addr;

+    private final Ip4Address remoteIpv4Addr;

+    private final Ip6Address localIpv6Addr;

+    private final Ip6Address remoteIpv6Addr;

+    private final TopologyId topologyId;

+

+    /**

+     * Constructor to initialize its parameters.

+     *

+     * @param localIndentifier  local interface identifier of the link

+     * @param remoteIndentifier remote interface identifier of the link

+     * @param localIpv4Addr     local IPv4 address of the link

+     * @param remoteIpv4Addr    remote IPv4 address of the link

+     * @param localIpv6Addr     local IPv6 address of the link

+     * @param remoteIpv6Addr    remote IPv6 address of the link

+     * @param topologyId        link topology identifier

+     */

+    public IpLinkIdentifier(InterfaceIdentifier localIndentifier, InterfaceIdentifier remoteIndentifier,

+                            Ip4Address localIpv4Addr, Ip4Address remoteIpv4Addr, Ip6Address localIpv6Addr,

+                            Ip6Address remoteIpv6Addr, TopologyId topologyId) {

+        this.localIndentifier = localIndentifier;

+        this.remoteIndentifier = remoteIndentifier;

+        this.localIpv4Addr = localIpv4Addr;

+        this.remoteIpv4Addr = remoteIpv4Addr;

+        this.localIpv6Addr = localIpv6Addr;

+        this.remoteIpv6Addr = remoteIpv6Addr;

+        this.topologyId = topologyId;

+    }

+

+    /**

+     * Obtains link local identifier.

+     *

+     * @return link local identifier

+     */

+    public InterfaceIdentifier localIndentifier() {

+        return localIndentifier;

+    }

+

+    /**

+     * Obtains link local identifier.

+     *

+     * @return link local identifier

+     */

+    public InterfaceIdentifier remoteIndentifier() {

+        return remoteIndentifier;

+    }

+

+    /**

+     * Obtains local IPv4 address of the link.

+     *

+     * @return local IPv4  address of the link

+     */

+    public Ip4Address localIpv4Addr() {

+        return localIpv4Addr;

+    }

+

+    /**

+     * Obtains remote IPv4 address of the link.

+     *

+     * @return remote IPv4  address of the link

+     */

+    public Ip4Address remoteIpv4Addr() {

+        return remoteIpv4Addr;

+    }

+

+    /**

+     * Obtains local IPv6 address of the link.

+     *

+     * @return local IPv6 address of the link

+     */

+    public Ip6Address localIpv6Addr() {

+        return localIpv6Addr;

+    }

+

+    /**

+     * Obtains remote IPv6 address of the link.

+     *

+     * @return remote IPv6 address of the link

+     */

+    public Ip6Address remoteIpv6Addr() {

+        return remoteIpv6Addr;

+    }

+

+    /**

+     * Obtains Topology ID of the link.

+     *

+     * @return Topology ID of the link

+     */

+    public TopologyId topologyId() {

+        return topologyId;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(localIndentifier, remoteIndentifier, localIpv4Addr, remoteIpv4Addr,

+                localIpv6Addr, remoteIpv6Addr, topologyId);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof IpLinkIdentifier) {

+            IpLinkIdentifier other = (IpLinkIdentifier) obj;

+            return Objects.equals(topologyId, other.topologyId)

+                    && Objects.equals(localIndentifier, other.localIndentifier)

+                    && Objects.equals(remoteIndentifier, other.remoteIndentifier)

+                    && Objects.equals(localIpv4Addr, other.localIpv4Addr)

+                    && Objects.equals(remoteIpv4Addr, other.remoteIpv4Addr)

+                    && Objects.equals(localIpv6Addr, other.localIpv6Addr)

+                    && Objects.equals(remoteIpv6Addr, other.remoteIpv6Addr);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .omitNullValues()

+                .add("localIndentifier", localIndentifier)

+                .add("remoteIndentifier", remoteIndentifier)

+                .add("localIpv4Addr", localIpv4Addr)

+                .add("remoteIpv4Addr", remoteIpv4Addr)

+                .add("localIpv6Addr", localIpv6Addr)

+                .add("remoteIpv6Addr", remoteIpv6Addr)

+                .add("topologyId", topologyId)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpReachability.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpReachability.java
new file mode 100644
index 0000000..8fdd4d3
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IpReachability.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+import org.onlab.packet.IpPrefix;
+
+/**
+ * Provides information of IP address prefix in the IGP topology and a router advertises
+ * this to each of its BGP nexthop.
+ */
+public class IpReachability {
+    private final IpPrefix ipPrefix;
+
+    /**
+     * Constructor to initialize IP prefix.
+     *
+     * @param ipPrefix IP address prefix
+     */
+    public IpReachability(IpPrefix ipPrefix) {
+        this.ipPrefix = ipPrefix;
+    }
+
+    /**
+     * Provides IP Address prefix reachability.
+     *
+     * @return IP Address prefix
+     */
+    public IpPrefix ipPrefix() {
+        return ipPrefix;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipPrefix);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof IpReachability) {
+            IpReachability other = (IpReachability) obj;
+            return Objects.equals(ipPrefix, other.ipPrefix);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("ipPrefix", ipPrefix)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IsIsPseudonode.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IsIsPseudonode.java
new file mode 100644
index 0000000..064d830
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IsIsPseudonode.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents the Pseudonode information of device in ISIS domain.
+ */
+public class IsIsPseudonode implements RouteIdentifier {
+    private final IsoNodeId isoNodeId;
+    private final byte psnIdentifier;
+    private final ProtocolType type;
+
+    /**
+     * Constructor to initialize the values.
+     *
+     * @param isoNodeId ISO system-ID
+     * @param psnIdentifier Pseudonode identifier
+     * @param type Protocol ID
+     */
+    public IsIsPseudonode(IsoNodeId isoNodeId, byte psnIdentifier, ProtocolType type) {
+        this.isoNodeId = isoNodeId;
+        this.psnIdentifier = psnIdentifier;
+        this.type = type;
+    }
+
+    /**
+     * Obtains iso system id of Pseudonode of device in ISIS domain.
+     *
+     * @return ISO system Id
+     */
+    public IsoNodeId isoNodeId() {
+        return isoNodeId;
+    }
+
+    /**
+     * Obtains Pseudonode identifier.
+     *
+     * @return Pseudonode identifier
+     */
+    public byte psnIdentifier() {
+        return psnIdentifier;
+    }
+
+    @Override
+    public ProtocolType type() {
+        return type;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(isoNodeId, psnIdentifier, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof IsIsPseudonode) {
+            IsIsPseudonode other = (IsIsPseudonode) obj;
+            return Objects.equals(isoNodeId, other.isoNodeId) && Objects.equals(psnIdentifier, other.psnIdentifier)
+                    && Objects.equals(type, other.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("isoNodeId", isoNodeId)
+                .add("psnIdentifier", psnIdentifier)
+                .add("type", type)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IsoNodeId.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IsoNodeId.java
new file mode 100644
index 0000000..8bb3d8b
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/IsoNodeId.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents ISO system id of the device.
+ */
+public class IsoNodeId implements RouteIdentifier {
+    private final byte[] isoNodeId;
+    private final ProtocolType type;
+
+    /**
+     * Constructor to initialize the values.
+     *
+     * @param isoNodeId ISO system-ID
+     * @param type Protocol type
+     */
+    public IsoNodeId(byte[] isoNodeId, ProtocolType type) {
+        this.isoNodeId = isoNodeId;
+        this.type = type;
+    }
+
+    /**
+     * Obtains ISO system id of the device.
+     *
+     * @return ISO system id
+     */
+    public byte[] isoNodeId() {
+        return isoNodeId;
+    }
+
+    @Override
+    public ProtocolType type() {
+        return type;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(isoNodeId, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof IsoNodeId) {
+            IsoNodeId other = (IsoNodeId) obj;
+            return Objects.equals(isoNodeId, other.isoNodeId) && Objects.equals(type, other.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("isoNodeId", isoNodeId)
+                .add("type", type)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java
new file mode 100644
index 0000000..3a68603
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onlab.util.Bandwidth;
+
+/**
+ * Represents Link Traffic engineering parameters.
+ */
+public class LinkTed {
+    private final Bandwidth maximumLink;
+    private final Bandwidth maxReserved;
+    private final List<Bandwidth> maxUnResBandwidth;
+    private final Metric teMetric;
+    private final Metric igpMetric;
+    private final List<Ip4Address> ipv4LocRouterId;
+    private final List<Ip6Address> ipv6LocRouterId;
+    private final List<Ip4Address> ipv4RemRouterId;
+    private final List<Ip6Address> ipv6RemRouterId;
+    private final Color color;
+    private final Signalling signalType;
+    private final List<Srlg> srlgGroup;
+    private final ProtectionType protectType;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param maximumLink maximum bandwidth can be used
+     * @param maxReserved max bandwidth that can be reserved
+     * @param maxUnResBandwidth amount of bandwidth reservable
+     * @param teMetric Traffic engineering metric
+     * @param igpMetric IGP metric
+     * @param color information on administrative group assigned to the interface
+     * @param signalType MPLS signaling protocols
+     * @param srlgGroup Shared Risk Link Group information
+     * @param protectType protection capabilities of the link
+     * @param ipv4LocRouterId IPv4 router-Id of local node
+     * @param ipv6LocRouterId IPv6 router-Id of local node
+     * @param ipv4RemRouterId IPv4 router-Id of remote node
+     * @param ipv6RemRouterId IPv6 router-Id of remote node
+     */
+    public LinkTed(Bandwidth maximumLink, Bandwidth maxReserved, List<Bandwidth> maxUnResBandwidth,
+                   Metric teMetric, Metric igpMetric, Color color, Signalling signalType, List<Srlg> srlgGroup,
+                   ProtectionType protectType, List<Ip4Address> ipv4LocRouterId, List<Ip6Address> ipv6LocRouterId,
+                   List<Ip4Address> ipv4RemRouterId, List<Ip6Address> ipv6RemRouterId) {
+        this.maximumLink = maximumLink;
+        this.maxReserved = maxReserved;
+        this.maxUnResBandwidth = maxUnResBandwidth;
+        this.teMetric = teMetric;
+        this.igpMetric = igpMetric;
+        this.color = color;
+        this.signalType = signalType;
+        this.srlgGroup = srlgGroup;
+        this.protectType = protectType;
+        this.ipv4LocRouterId = ipv4LocRouterId;
+        this.ipv6LocRouterId = ipv6LocRouterId;
+        this.ipv4RemRouterId = ipv4RemRouterId;
+        this.ipv6RemRouterId = ipv6RemRouterId;
+    }
+
+    /**
+     * Provides maximum bandwidth can be used on the link.
+     *
+     * @return maximum bandwidth
+     */
+    public Bandwidth maximumLink() {
+        return maximumLink;
+    }
+
+    /**
+     * Amount of bandwidth reservable on the link.
+     *
+     * @return unreserved bandwidth
+     */
+    public List<Bandwidth> maxUnResBandwidth() {
+        return maxUnResBandwidth;
+    }
+
+    /**
+     * Provides max bandwidth that can be reserved on the link.
+     *
+     * @return max bandwidth reserved
+     */
+    public Bandwidth maxReserved() {
+        return maxReserved;
+    }
+
+    /**
+     * Provides Traffic engineering metric for the link.
+     *
+     * @return Traffic engineering metric
+     */
+    public Metric teMetric() {
+        return teMetric;
+    }
+
+    /**
+     * Provides IGP metric for the link.
+     *
+     * @return IGP metric
+     */
+    public Metric igpMetric() {
+        return igpMetric;
+    }
+
+    /**
+     * Provides protection capabilities of the link.
+     *
+     * @return link protection type
+     */
+    public ProtectionType protectType() {
+        return protectType;
+    }
+
+    /**
+     * Provides Shared Risk Link Group information.
+     *
+     * @return Shared Risk Link Group value
+     */
+    public List<Srlg> srlgGroup() {
+        return srlgGroup;
+    }
+
+    /**
+     * Provides which MPLS signaling protocols are enabled.
+     *
+     * @return signal type
+     */
+    public Signalling signalType() {
+        return signalType;
+    }
+
+    /**
+     * Provides information on administrative group assigned to the interface.
+     *
+     * @return 4-octect bit mask assigned by network administrator
+     */
+    public Color color() {
+        return color;
+    }
+
+    /**
+     * Provides IPv4 router-Id of local node.
+     *
+     * @return IPv4 router-Id of local node
+     */
+    public List<Ip4Address> ipv4LocRouterId() {
+        return ipv4LocRouterId;
+    }
+
+    /**
+     * Provides IPv6 router-Id of local node.
+     *
+     * @return IPv6 router-Id of local node
+     */
+    public List<Ip6Address> ipv6LocRouterId() {
+        return ipv6LocRouterId;
+    }
+
+    /**
+     * Provides IPv4 router-Id of remote node.
+     *
+     * @return IPv4 router-Id of remote node
+     */
+    public List<Ip4Address> ipv4RemRouterId() {
+        return ipv4RemRouterId;
+    }
+
+    /**
+     * Provides IPv6 router-Id of remote node.
+     *
+     * @return IPv6 router-Id of remote node
+     */
+    public List<Ip6Address> ipv6RemRouterId() {
+        return ipv6RemRouterId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(maximumLink, maxReserved, maxUnResBandwidth, teMetric, igpMetric,
+                ipv4LocRouterId, ipv6LocRouterId, ipv4RemRouterId, ipv6RemRouterId,
+                color, signalType, srlgGroup, protectType);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof LinkTed) {
+            int countCommonBandwidth = 0;
+            int countOtherCommonBandwidth = 0;
+            int countOther4LocRouterId = 0;
+            int countCommon4LocRouterId = 0;
+            int countOther6RemRouterId = 0;
+            int countCommon6RemRouterId = 0;
+            int countOther4RemRouterId = 0;
+            int countCommon4RemRouterId = 0;
+            int countCommon6LocRouterId = 0;
+            int countOther6LocRouterId = 0;
+            int countCommonSrlg = 0;
+            int countOtherSrlg = 0;
+            boolean isCommonBandwidth = true;
+            boolean isCommonIp4Loc = true;
+            boolean isCommonIp4Rem = true;
+            boolean isCommonIp6Loc = true;
+            boolean isCommonIp6Rem = true;
+            boolean isCommonSrlg = true;
+            LinkTed other = (LinkTed) obj;
+            Iterator<Bandwidth> objListIterator = other.maxUnResBandwidth.iterator();
+            countOtherCommonBandwidth = other.maxUnResBandwidth.size();
+            countCommonBandwidth = maxUnResBandwidth.size();
+
+            Iterator<Ip4Address> ipv4local = other.ipv4LocRouterId.iterator();
+            countOther4LocRouterId = other.ipv4LocRouterId.size();
+            countCommon4LocRouterId = ipv4LocRouterId.size();
+
+            Iterator<Ip4Address> ipv4remote = other.ipv4RemRouterId.iterator();
+            countOther4RemRouterId = other.ipv4RemRouterId.size();
+            countCommon4RemRouterId = ipv4RemRouterId.size();
+
+            Iterator<Ip6Address> ipv6local = other.ipv6LocRouterId.iterator();
+            countOther6LocRouterId = other.ipv6LocRouterId.size();
+            countCommon6LocRouterId = ipv6LocRouterId.size();
+
+            Iterator<Ip6Address> ipv6remote = other.ipv6RemRouterId.iterator();
+            countOther6RemRouterId = other.ipv6RemRouterId.size();
+            countCommon6RemRouterId = ipv6RemRouterId.size();
+
+            Iterator<Srlg> srlg = other.srlgGroup.iterator();
+            countOtherSrlg = other.srlgGroup.size();
+            countCommonSrlg = srlgGroup.size();
+
+            if (countOtherCommonBandwidth != countCommonBandwidth
+                    || countOther4LocRouterId != countCommon4LocRouterId
+                    || countOther4RemRouterId != countCommon4RemRouterId
+                    || countOther6LocRouterId != countCommon6LocRouterId
+                    || countOther6RemRouterId != countCommon6RemRouterId
+                    || countOtherSrlg != countCommonSrlg) {
+                return false;
+            } else {
+                while (objListIterator.hasNext() && isCommonBandwidth) {
+                    Bandwidth subTlv = objListIterator.next();
+                    if (maxUnResBandwidth.contains(subTlv) && other.maxUnResBandwidth.contains(subTlv)) {
+                        isCommonBandwidth = Objects.equals(maxUnResBandwidth.get(maxUnResBandwidth.indexOf(subTlv)),
+                                other.maxUnResBandwidth.get(other.maxUnResBandwidth.indexOf(subTlv)));
+                    } else {
+                        isCommonBandwidth = false;
+                    }
+                }
+                while (ipv4local.hasNext() && isCommonIp4Loc) {
+                    Ip4Address subTlv = ipv4local.next();
+                    if (ipv4LocRouterId.contains(subTlv) && other.ipv4LocRouterId.contains(subTlv)) {
+                        isCommonIp4Loc = Objects.equals(ipv4LocRouterId.get(ipv4LocRouterId.indexOf(subTlv)),
+                                other.ipv4LocRouterId.get(other.ipv4LocRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp4Loc = false;
+                    }
+                }
+                while (ipv4remote.hasNext() && isCommonIp4Rem) {
+                    Ip4Address subTlv = ipv4remote.next();
+                    if (ipv4RemRouterId.contains(subTlv) && other.ipv4RemRouterId.contains(subTlv)) {
+                        isCommonIp4Rem = Objects.equals(ipv4RemRouterId.get(ipv4RemRouterId.indexOf(subTlv)),
+                                other.ipv4RemRouterId.get(other.ipv4RemRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp4Rem = false;
+                    }
+                }
+                while (ipv6remote.hasNext() && isCommonIp6Rem) {
+                    Ip6Address subTlv = ipv6remote.next();
+                    if (ipv6RemRouterId.contains(subTlv) && other.ipv6RemRouterId.contains(subTlv)) {
+                        isCommonIp6Rem = Objects.equals(ipv6RemRouterId.get(ipv6RemRouterId.indexOf(subTlv)),
+                                other.ipv6RemRouterId.get(other.ipv6RemRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp6Rem = false;
+                    }
+                }
+                while (ipv6local.hasNext() && isCommonIp6Loc) {
+                    Ip6Address subTlv = ipv6local.next();
+                    if (ipv6LocRouterId.contains(subTlv) && other.ipv6LocRouterId.contains(subTlv)) {
+                        isCommonIp6Loc = Objects.equals(ipv6LocRouterId.get(ipv6LocRouterId.indexOf(subTlv)),
+                                other.ipv6LocRouterId.get(other.ipv6LocRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp6Loc = false;
+                    }
+                }
+                while (srlg.hasNext() && isCommonIp6Loc) {
+                    Srlg subTlv = srlg.next();
+                    if (srlgGroup.contains(subTlv) && other.srlgGroup.contains(subTlv)) {
+                        isCommonSrlg = Objects.equals(srlgGroup.get(srlgGroup.indexOf(subTlv)),
+                                other.srlgGroup.get(other.srlgGroup.indexOf(subTlv)));
+                    } else {
+                        isCommonSrlg = false;
+                    }
+                }
+                return isCommonBandwidth && isCommonIp4Loc && isCommonIp4Rem && isCommonIp6Rem && isCommonIp6Loc
+                        && isCommonSrlg
+                        && Objects.equals(igpMetric, other.igpMetric)
+                        && Objects.equals(teMetric, other.teMetric)
+                        && Objects.equals(maximumLink, other.maximumLink)
+                        && Objects.equals(protectType, other.protectType)
+                        && Objects.equals(color, other.color)
+                        && Objects.equals(signalType, other.signalType);
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("igpMetric", igpMetric)
+                .add("teMetric", teMetric)
+                .add("maximumLink", maximumLink)
+                .add("maxReserved", maxReserved)
+                .add("maxUnResBandwidth", maxUnResBandwidth)
+                .add("ipv4LocRouterId", ipv4LocRouterId)
+                .add("ipv4RemRouterId", ipv4RemRouterId)
+                .add("ipv6LocRouterId", ipv6LocRouterId)
+                .add("ipv6RemRouterId", ipv6RemRouterId)
+                .add("protectType", protectType)
+                .add("color", color)
+                .add("srlgGroup", srlgGroup)
+                .add("signalType", signalType)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Metric.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Metric.java
new file mode 100644
index 0000000..0af95b0
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Metric.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents Traffic engineering metrics.
+  */
+public class Metric {
+    private final Integer metric;
+
+    /**
+     * Constructor to initialize its metric.
+     *
+     * @param metric can be TE metric or IGP metric or Prefix metric
+     */
+    public Metric(Integer metric) {
+        this.metric = metric;
+    }
+
+    /**
+     * Obtains traffic engineering metric.
+     *
+     * @return traffic engineering metric
+     */
+    public Integer metric() {
+        return metric;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(metric);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof Metric) {
+            Metric other = (Metric) obj;
+            return Objects.equals(metric, other.metric);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("metric", metric)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/OspfPseudonode.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/OspfPseudonode.java
new file mode 100644
index 0000000..86d96ac
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/OspfPseudonode.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+import org.onlab.packet.Ip4Address;
+
+/**
+ * Represents Pseudonode information of OSFP device.
+ */
+public class OspfPseudonode implements RouteIdentifier {
+    private final RouterId designatedRouter;
+    private final Ip4Address drInterface;
+    private final ProtocolType type;
+
+    /**
+     * Constructor to initialize the values.
+     *
+     * @param designatedRouter Router Id of designated router
+     * @param drInterface IP address of Designated Router interface
+     * @param type Protocol ID
+     */
+    public OspfPseudonode(RouterId designatedRouter, Ip4Address drInterface, ProtocolType type) {
+        this.designatedRouter = designatedRouter;
+        this.drInterface = drInterface;
+        this.type = type;
+    }
+
+    /**
+     * Obtains designated Router Id.
+     *
+     * @return designated Router Id
+     */
+    public RouterId designatedRouter() {
+        return designatedRouter;
+    }
+
+    /**
+     * Obtains IP address of Designated Router interface.
+     *
+     * @return IP address of Designated Router interface
+     */
+    public Ip4Address drInterface() {
+        return drInterface;
+    }
+
+    @Override
+    public ProtocolType type() {
+        return type;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(designatedRouter, drInterface, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof OspfPseudonode) {
+            OspfPseudonode other = (OspfPseudonode) obj;
+            return Objects.equals(designatedRouter, other.designatedRouter)
+                    && Objects.equals(drInterface, other.drInterface)
+                    && Objects.equals(type, other.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("designatedRouter", designatedRouter)
+                .add("drInterface", drInterface)
+                .add("type", type)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Position.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Position.java
new file mode 100644
index 0000000..f81f9fd
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Position.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents Position of device in the network.
+ */
+public class Position {
+    private final Boolean asbr;
+    private final Boolean abr;
+
+    /**
+     * Constructor to set position of device.
+     *
+     * @param asbr autonomous system boundary router
+     * @param abr area boundary router
+     */
+    public Position(Boolean asbr, Boolean abr) {
+        this.asbr = asbr;
+        this.abr = abr;
+    }
+
+    /**
+     * obtain whether the device is autonomous system boundary router or not.
+     *
+     * @return autonomous system boundary router or not
+     */
+    Boolean asbr() {
+        return asbr;
+    }
+
+    /**
+     * obtain whether the device is area boundary router or not.
+     *
+     * @return area boundary router or not
+     */
+    Boolean abr() {
+        return abr;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(abr, asbr);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof Position) {
+            Position other = (Position) obj;
+            return Objects.equals(abr, other.abr) && Objects.equals(asbr, other.asbr);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .omitNullValues()
+                .add("abrBit", abr)
+                .add("asbrBit", asbr)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/PrefixIdentifier.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/PrefixIdentifier.java
new file mode 100644
index 0000000..b41b5d7
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/PrefixIdentifier.java
@@ -0,0 +1,98 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+

+import java.util.Objects;

+

+/**

+ * This class provides Prefix Identifier details.

+ */

+public class PrefixIdentifier {

+    private final TopologyId topologyId;

+    private final RouteType routeType;

+    private final IpReachability ipReach;

+

+    /**

+     * Constructor to initialize its parameters.

+     *

+     * @param topologyId topology ID of prefix

+     * @param routeType OSPF Route type of the prefix

+     * @param ipReach IP address prefix reachability information

+     */

+    public PrefixIdentifier(TopologyId topologyId, RouteType routeType, IpReachability ipReach) {

+        this.topologyId = topologyId;

+        this.routeType = routeType;

+        this.ipReach = ipReach;

+    }

+

+    /**

+     * Provides topology ID of prefix.

+     *

+     * @return topology id

+     */

+    public TopologyId topologyId() {

+        return this.topologyId;

+    }

+

+    /**

+     * Provides IP address prefix reachability information.

+     *

+     * @return IP address prefix

+     */

+    public IpReachability ipReach() {

+        return this.ipReach;

+    }

+

+    /**

+     * Provides OSPF Route type of the prefix.

+     *

+     * @return Route type

+     */

+    public RouteType routeType() {

+        return this.routeType;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(topologyId, routeType, ipReach);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+

+        if (obj instanceof PrefixIdentifier) {

+            PrefixIdentifier other = (PrefixIdentifier) obj;

+            return Objects.equals(topologyId, other.topologyId) && Objects.equals(routeType, other.routeType)

+                   && Objects.equals(ipReach, other.ipReach);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .omitNullValues()

+                .add("routeType", routeType)

+                .add("ipReach", ipReach)

+                .add("topologyId", topologyId)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/PrefixTed.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/PrefixTed.java
new file mode 100644
index 0000000..9f1c40a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/PrefixTed.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * This class provides implementation of prefix traffic engineering data.
+ */
+public class PrefixTed {
+    private final IgpFlags igpFlags;
+    private final RouteTag routeTag;
+    private final ExtendedRouteTag extendedRouteTag;
+    private final Metric metric;
+    private final IpAddress fwdingAddress;
+
+    /**
+     * Constructor to initialize its parameters.
+     *
+     * @param igpFlags igp flags
+     * @param routeTag ospf route tag
+     * @param extendedRouteTag isis route tag
+     * @param metric prefix metric
+     * @param fwdingAddress forwarding address
+     */
+    /**
+     * Constructor to initialize its parameters.
+     *
+     * @param igpFlags IS-IS and OSPF flags assigned to the prefix
+     * @param routeTag IGP (ISIS or OSPF) tags of the prefix
+     * @param extendedRouteTag extended ISIS route tags of the prefix
+     * @param metric metric of the prefix
+     * @param fwdingAddress OSPF forwarding address
+     */
+    public PrefixTed(IgpFlags igpFlags, RouteTag routeTag, ExtendedRouteTag extendedRouteTag,
+            Metric metric, IpAddress fwdingAddress) {
+        this.igpFlags = igpFlags;
+        this.routeTag = routeTag;
+        this.extendedRouteTag = extendedRouteTag;
+        this.metric = metric;
+        this.fwdingAddress = fwdingAddress;
+    }
+
+    /**
+     * Provides IS-IS and OSPF flags assigned to the prefix.
+     *
+     * @return IGP flags
+     */
+    public IgpFlags igpFlags() {
+        return igpFlags;
+    }
+
+    /**
+     * Provides IGP (ISIS or OSPF) tags of the prefix.
+     *
+     * @return IGP route tag.
+     */
+    public RouteTag routeTag() {
+        return routeTag;
+    }
+
+    /**
+     * Provides extended ISIS route tags of the prefix.
+     *
+     * @return extended IS-IS route tag
+     */
+    public ExtendedRouteTag extendedRouteTag() {
+        return extendedRouteTag;
+    }
+
+    /**
+     * Provides metric of the prefix.
+     *
+     * @return prefix metric
+     */
+    public Metric metric() {
+        return metric;
+    }
+
+    /**
+     * Provides OSPF forwarding address.
+     *
+     * @return forwarding address
+     */
+    public IpAddress fwdingAddress() {
+        return fwdingAddress;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(igpFlags, routeTag, extendedRouteTag, metric, fwdingAddress);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof PrefixTed) {
+            PrefixTed other = (PrefixTed) obj;
+            return Objects.equals(igpFlags, other.igpFlags) && Objects.equals(extendedRouteTag, other.extendedRouteTag)
+                   && Objects.equals(routeTag, other.routeTag) && Objects.equals(metric, other.metric)
+                   && Objects.equals(fwdingAddress, other.fwdingAddress);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .omitNullValues()
+                .add("igpFlags", igpFlags)
+                .add("extendedRouteTag", extendedRouteTag)
+                .add("routeTag", routeTag)
+                .add("metric", metric)
+                .add("fwdingAddress", fwdingAddress)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/ProtectionType.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/ProtectionType.java
new file mode 100644
index 0000000..be7fb5a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/ProtectionType.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents protection capabilities of the link.
+ */
+public class ProtectionType {
+    private final LinkProtectionType protectionType;
+
+    /**
+     * Enum to provide Link Protection type.
+     */
+    public enum LinkProtectionType {
+        Extra_Traffic(1), Unprotected(2), Shared(4), Enhanced(0x20), Dedicated_OneIsToOne(8),
+        Dedicated_OnePlusOne(0x10), Reserved(0x40);
+        int value;
+
+        /**
+         * Constructor to assign value.
+         *
+         * @param val link protection type
+         */
+        LinkProtectionType(int val) {
+            value = val;
+        }
+
+        /**
+         * Provides Link protection type.
+         *
+         * @return protection type
+         */
+        public byte type() {
+            return (byte) value;
+        }
+    }
+
+    /**
+     * Constructor to initialize protection type.
+     *
+     * @param protectionType link protection type
+     */
+    public ProtectionType(LinkProtectionType protectionType) {
+        this.protectionType = protectionType;
+    }
+
+    /**
+     * Provides protection capabilities of the link.
+     *
+     * @return link protection type.
+     */
+    public LinkProtectionType protectionType() {
+        return protectionType;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(protectionType);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof ProtectionType) {
+            ProtectionType other = (ProtectionType) obj;
+            return Objects.equals(protectionType, other.protectionType);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("protectionType", protectionType)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteDistinguisher.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteDistinguisher.java
new file mode 100644
index 0000000..b6b8336
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteDistinguisher.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 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 RouteDistinguisher.
+ */
+package org.onosproject.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents Route Distinguisher of device in the network.
+ */
+public class RouteDistinguisher {
+    private final Long routeDistinguisher;
+
+    /**
+     * Constructor to initialize parameters.
+     *
+     * @param routeDistinguisher route distinguisher
+     */
+    public RouteDistinguisher(Long routeDistinguisher) {
+        this.routeDistinguisher = routeDistinguisher;
+    }
+
+    /**
+     * Obtain route distinguisher.
+     *
+     * @return route distinguisher
+     */
+    public Long routeDistinguisher() {
+        return routeDistinguisher;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(routeDistinguisher);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof RouteDistinguisher) {
+            RouteDistinguisher other = (RouteDistinguisher) obj;
+            return Objects.equals(routeDistinguisher, other.routeDistinguisher);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("routeDistinguisher", routeDistinguisher)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteIdentifier.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteIdentifier.java
new file mode 100644
index 0000000..73cda7a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteIdentifier.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+/**
+ * Abstraction of Router ID to identify the router with a distinct IP address.
+ */
+public interface RouteIdentifier {
+    /**
+     * Enum to provide Protocol type.
+     */
+    public enum ProtocolType {
+        ISIS_LevelOne(1), ISIS_LevelTwo(2), OSPFv2(3), Direct(4), Static_Configuration(5), OSPFv3(6);
+        int value;
+
+        /**
+         * Sets protocol ID.
+         *
+         * @param val protocol ID
+         */
+        ProtocolType(int val) {
+            value = val;
+        }
+
+        /**
+         * Provides Protocol ID.
+         *
+         * @return Protocol ID
+         */
+        public byte getType() {
+            return (byte) value;
+        }
+    }
+
+    /**
+     * Provides Protocol ID to identify which protocol routing instance is used.
+     *
+     * @return Protocol type
+     */
+    ProtocolType type();
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteInstance.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteInstance.java
new file mode 100644
index 0000000..fbca820
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteInstance.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents routing universe where the network element belongs.
+ */
+public class RouteInstance {
+    private final long routeInstance;
+
+    /**
+     * Constructor to initialize routeInstance.
+     *
+     * @param routeInstance routing protocol instance
+     */
+    public RouteInstance(long routeInstance) {
+        this.routeInstance = routeInstance;
+    }
+
+    /**
+     * Obtain route instance.
+     *
+     * @return route instance
+     */
+    public long routeInstance() {
+        return routeInstance;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(routeInstance);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof RouteInstance) {
+            RouteInstance other = (RouteInstance) obj;
+            return Objects.equals(routeInstance, other.routeInstance);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("routeInstance", routeInstance)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteTag.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteTag.java
new file mode 100644
index 0000000..f77cc5e
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteTag.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents the igp administrative tags of the prefix.
+ */
+public class RouteTag {
+    private final int routeTag;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param routeTag IGP route tag
+     */
+    public RouteTag(int routeTag) {
+        this.routeTag = routeTag;
+    }
+
+    /**
+     * Obtains igp administrative tags of the prefix.
+     *
+     * @return igp administrative tags of the prefix
+     */
+    public int routeTag() {
+        return routeTag;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(routeTag);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof RouteTag) {
+            RouteTag other = (RouteTag) obj;
+            return Objects.equals(routeTag, other.routeTag);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("routeTag", routeTag)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteType.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteType.java
new file mode 100644
index 0000000..11268f6
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouteType.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents Route type of the prefix in the OSPF domain.
+ */
+public class RouteType {
+    private final Type routeType;
+
+    /**
+     * Enum to provide Route type.
+     */
+    public enum Type {
+        Intra_Area(1), Inter_Area(2), External_1(3), External_2(4), NSSA_1(5), NSSA_2(6);
+        int value;
+
+        /**
+         * Constructor to assign value.
+         *
+         * @param val route type
+         */
+        Type(int val) {
+            value = val;
+        }
+
+        /**
+         * Provides route type.
+         *
+         * @return route type
+         */
+        public byte type() {
+            return (byte) value;
+        }
+    }
+
+    /**
+     * Constructor to initialize routeType.
+     *
+     * @param routeType  Route type
+     */
+    public RouteType(Type routeType) {
+        this.routeType = routeType;
+    }
+
+    /**
+     * Provides Route type of the prefix.
+     *
+     * @return  Route type
+     */
+    public Type routeType() {
+        return routeType;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(routeType);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof RouteType) {
+            RouteType other = (RouteType) obj;
+            return Objects.equals(routeType, other.routeType);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("routeType", routeType)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouterId.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouterId.java
new file mode 100644
index 0000000..85714cb
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/RouterId.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents Router ID of the device.
+ */
+public class RouterId implements RouteIdentifier {
+    private final int routerId;
+    private final ProtocolType type;
+
+    /**
+     * Constructor to initialize its parameters.
+     *
+     * @param routerId Router ID of designated router
+     */
+    public RouterId(int routerId, ProtocolType type) {
+        this.routerId = routerId;
+        this.type = type;
+    }
+
+    /**
+     * Obtains Router Id of the device.
+     *
+     * @return Router Id of the device
+     */
+    public int routerId() {
+        return routerId;
+    }
+
+    @Override
+    public ProtocolType type() {
+        return type;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(routerId, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof RouterId) {
+            RouterId other = (RouterId) obj;
+            return Objects.equals(routerId, other.routerId) && Objects.equals(type, other.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("routerId", routerId)
+                .add("type", type)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Signalling.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Signalling.java
new file mode 100644
index 0000000..4159397
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Signalling.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents signaling protocols that are enabled.
+ */
+public class Signalling {
+    private final Boolean ldp;
+    private final Boolean rsvpte;
+
+    /**
+     * Constructor to initialize the values.
+     *
+     * @param ldp Label Distribution Protocol whether enabled or not
+     * @param rsvpte RSVP TE whether enabled or not
+     */
+    public Signalling(Boolean ldp, Boolean rsvpte) {
+        this.ldp = ldp;
+        this.rsvpte = rsvpte;
+    }
+
+    /**
+     * Obtains whether LDP signalling protocol is enabled or not.
+     *
+     * @return LDP signalling protocol is enabled or not
+     */
+    public Boolean ldp() {
+        return ldp;
+    }
+
+    /**
+     * Obtains whether rsvp-te signalling protocol is enabled or not.
+     *
+     * @return rsvp-te signalling protocol is enabled or not
+     */
+    public Boolean rsvpte() {
+        return rsvpte;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ldp, rsvpte);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof Signalling) {
+            Signalling other = (Signalling) obj;
+            return Objects.equals(ldp, other.ldp) && Objects.equals(rsvpte, other.rsvpte);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("ldp", ldp)
+                .add("rsvpte", rsvpte)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Srlg.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Srlg.java
new file mode 100644
index 0000000..1f39bad
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/Srlg.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * Represents Shared Risk Link Group information.
+ */
+public class Srlg {
+    private final int srlgGroup;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param srlgGroup list of Shared Risk Link Group value
+     */
+    public Srlg(int srlgGroup) {
+        this.srlgGroup = srlgGroup;
+    }
+
+    /**
+     * Provides Shared Risk link group.
+     *
+     * @return Shared Risk link group value
+     */
+    public int srlgGroup() {
+        return srlgGroup;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(srlgGroup);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof Srlg) {
+            Srlg other = (Srlg) obj;
+            return Objects.equals(srlgGroup, other.srlgGroup);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("srlgGroup", srlgGroup)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/TerminationPoint.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/TerminationPoint.java
new file mode 100644
index 0000000..9c21cb4
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/TerminationPoint.java
@@ -0,0 +1,104 @@
+/*

+ * Copyright 2015 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.iptopology.api;

+

+import java.util.Objects;

+

+import org.onosproject.net.DeviceId;

+import org.onosproject.net.ElementId;

+

+import com.google.common.base.MoreObjects;

+

+/**

+ * Abstraction of a network termination point expressed as a pair of the network element identifier and device

+ * interface.

+ */

+public class TerminationPoint {

+    private final ElementId elementId;

+    private final DeviceInterface deviceInterface;

+

+    /**

+     * Constructor to initialize its parameters.

+     *

+     * @param elementId network element identifier

+     * @param deviceInterface device interface

+     */

+    public TerminationPoint(ElementId elementId, DeviceInterface deviceInterface) {

+        this.elementId = elementId;

+        this.deviceInterface = deviceInterface;

+    }

+

+    /**

+     * Returns the network element identifier.

+     *

+     * @return element identifier

+     */

+    public ElementId elementId() {

+        return elementId;

+    }

+

+    /**

+     * Returns the identifier of the infrastructure device if the termination

+     * point belongs to a network element which is indeed an ip

+     * device.

+     *

+     * @return network element identifier as a device identifier

+     * @throws java.lang.IllegalStateException if termination point is not

+     *                                         associated with a device

+     */

+    public DeviceId deviceId() {

+        if (elementId instanceof DeviceId) {

+            return (DeviceId) elementId;

+        }

+        throw new IllegalStateException("Termination point not associated " +

+                "with an ip device");

+    }

+

+    /**

+     * Returns Device interface details.

+     *

+     * @return device interface details

+     */

+    public DeviceInterface deviceInterface() {

+        return deviceInterface;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(elementId, deviceInterface);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+        if (obj instanceof TerminationPoint) {

+            final TerminationPoint other = (TerminationPoint) obj;

+            return Objects.equals(this.elementId, other.elementId)

+                    && Objects.equals(this.deviceInterface, other.deviceInterface);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return MoreObjects.toStringHelper(this)

+                .add("elementId", elementId)

+                .add("deviceInterface", deviceInterface)

+                .toString();

+    }

+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/TopologyId.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/TopologyId.java
new file mode 100644
index 0000000..9d414e3
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/TopologyId.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.iptopology.api;
+
+import java.util.Objects;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Represents Multi-Topology IDs for a network link, node or prefix.
+ */
+public class TopologyId {
+    private final short topologyId;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param topologyId topology id for node/link/prefix
+     */
+    public TopologyId(short topologyId) {
+        this.topologyId = topologyId;
+    }
+
+    /**
+     * Obtains the topology ID.
+     *
+     * @return  topology ID
+     */
+    public short topologyId() {
+        return topologyId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(topologyId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof TopologyId) {
+            TopologyId other = (TopologyId) obj;
+            return Objects.equals(topologyId, other.topologyId);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("topologyId", topologyId)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultInterfaceDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultInterfaceDescription.java
new file mode 100644
index 0000000..c7e413d
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultInterfaceDescription.java
@@ -0,0 +1,97 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.Ip6Address;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.iptopology.api.InterfaceIdentifier;
+import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.SparseAnnotations;
+
+/**
+ * Default implementation of immutable Interface description.
+ */
+public class DefaultInterfaceDescription extends AbstractDescription
+        implements InterfaceDescription {
+
+    private final InterfaceIdentifier intfId;
+    private final Ip4Address ipv4Address;
+    private final Ip6Address ipv6Address;
+
+
+
+    /**
+     * Creates an interface description using the supplied information.
+     *
+     * @param intfId        interface identifier
+     * @param ipv4Address   ipv4 address of an interface
+     * @param ipv6Address   ipv6 address of an interface
+     * @param annotations   optional key/value annotations map
+     */
+    public DefaultInterfaceDescription(InterfaceIdentifier intfId, Ip4Address ipv4Address,
+                                  Ip6Address ipv6Address, SparseAnnotations...annotations) {
+        super(annotations);
+        this.intfId = intfId;
+        this.ipv4Address = ipv4Address;
+        this.ipv6Address = ipv6Address;
+    }
+
+    /**
+     * Default constructor for serialization.
+     */
+    private DefaultInterfaceDescription() {
+        this.intfId = null;
+        this.ipv4Address = null;
+        this.ipv6Address = null;
+    }
+
+    /**
+     * Creates an interface description using the supplied information.
+     *
+     * @param base        InterfaceDescription to get basic information from
+     * @param annotations optional key/value annotations map
+     */
+    public DefaultInterfaceDescription(InterfaceDescription base,
+                                  SparseAnnotations annotations) {
+        this(base.intfId(), base.ipv4Address(), base.ipv6Address(), annotations);
+    }
+
+    @Override
+    public InterfaceIdentifier intfId() {
+        return intfId;
+    }
+
+    @Override
+    public Ip4Address ipv4Address() {
+        return ipv4Address;
+    }
+
+    @Override
+    public Ip6Address ipv6Address() {
+        return ipv6Address; }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("intfId", intfId)
+                .add("ipv4Address", ipv4Address)
+                .add("ipv6Address", ipv6Address)
+                .add("annotations", annotations())
+                .toString();
+    }
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultIpDeviceDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultIpDeviceDescription.java
new file mode 100644
index 0000000..889e48a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultIpDeviceDescription.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2014-2015 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.iptopology.api.device;
+
+import org.onosproject.iptopology.api.DeviceTed;
+import org.onosproject.iptopology.api.IpDeviceIdentifier;
+import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.SparseAnnotations;
+
+import java.net.URI;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.iptopology.api.IpDevice.Type;
+
+/**
+ * Default implementation of immutable device description entity.
+ */
+public class DefaultIpDeviceDescription extends AbstractDescription
+        implements IpDeviceDescription {
+    private final URI uri;
+    private final Type type;
+    private final IpDeviceIdentifier deviceIdentifier;
+    private final DeviceTed deviceTed;
+
+    /**
+     * Creates an ip device description using the supplied information.
+     *
+     * @param uri               device URI
+     * @param type              device type
+     * @param deviceIdentifier  device manufacturer
+     * @param deviceTed         device Traffic Engineering parameters
+     * @param annotations  optional key/value annotations map
+     */
+    public DefaultIpDeviceDescription(URI uri, Type type, IpDeviceIdentifier deviceIdentifier,
+                                    DeviceTed deviceTed, SparseAnnotations... annotations) {
+        super(annotations);
+        this.uri = checkNotNull(uri, "Device URI cannot be null");
+        this.type = checkNotNull(type, "Device type cannot be null");
+        this.deviceIdentifier = deviceIdentifier;
+        this.deviceTed = deviceTed;
+    }
+
+    /**
+     * Creates an ip device description using the supplied information.
+     * @param base IpDeviceDescription to basic information
+     * @param annotations Annotations to use.
+     */
+    public DefaultIpDeviceDescription(IpDeviceDescription base, SparseAnnotations... annotations) {
+        this(base.deviceURI(), base.type(), base.deviceIdentifier(),
+             base.deviceTed(), annotations);
+    }
+
+    /**
+     * Creates an ip device description using the supplied information.
+     * @param base IpDeviceDescription to basic information (except for type)
+     * @param type device type
+     * @param annotations Annotations to use.
+     */
+    public DefaultIpDeviceDescription(IpDeviceDescription base, Type type, SparseAnnotations... annotations) {
+        this(base.deviceURI(), type, base.deviceIdentifier(),
+                base.deviceTed(), annotations);
+    }
+
+    @Override
+    public URI deviceURI() {
+        return uri;
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    @Override
+    public IpDeviceIdentifier deviceIdentifier() {
+        return deviceIdentifier;
+    }
+
+    @Override
+    public DeviceTed deviceTed() {
+        return deviceTed;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("uri", uri)
+                .add("type", type)
+                .add("devid", deviceIdentifier)
+                .add("devTed", deviceTed)
+                .toString();
+    }
+
+    /**
+     * Default constructor for serialization.
+     */
+    private DefaultIpDeviceDescription() {
+        this.uri = null;
+        this.type = null;
+        this.deviceIdentifier = null;
+        this.deviceTed = null;
+    }
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultPrefixDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultPrefixDescription.java
new file mode 100644
index 0000000..36cc14a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultPrefixDescription.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.iptopology.api.PrefixIdentifier;
+import org.onosproject.iptopology.api.PrefixTed;
+import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.SparseAnnotations;
+
+/**
+ * Default implementation of immutable Prefix description.
+ */
+public class DefaultPrefixDescription extends AbstractDescription
+        implements PrefixDescription {
+
+    private final PrefixIdentifier prefixIdentifier;
+    private final PrefixTed prefixTed;
+
+
+    /**
+     * Creates prefix description using the supplied information.
+     *
+     * @param prefixIdentifier prefix identifier
+     * @param prefixTed        prefix traffic engineering parameters
+     * @param annotations      optional key/value annotations map
+     */
+    public DefaultPrefixDescription(PrefixIdentifier prefixIdentifier, PrefixTed prefixTed,
+                                  SparseAnnotations...annotations) {
+        super(annotations);
+        this.prefixIdentifier = prefixIdentifier;
+        this.prefixTed = prefixTed;
+    }
+
+    /**
+     * Default constructor for serialization.
+     */
+    private DefaultPrefixDescription() {
+        this.prefixIdentifier = null;
+        this.prefixTed = null;
+    }
+
+    /**
+     * Creates prefix description using the supplied information.
+     *
+     * @param base        PrefixDescription to get basic information from
+     * @param annotations optional key/value annotations map
+     */
+    public DefaultPrefixDescription(PrefixDescription base,
+                                  SparseAnnotations annotations) {
+        this(base.prefixIdentifier(), base.prefixTed(), annotations);
+    }
+
+    @Override
+    public PrefixIdentifier prefixIdentifier() {
+        return prefixIdentifier;
+    }
+
+    @Override
+    public PrefixTed prefixTed() {
+        return prefixTed;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("prefixIdentifier", prefixIdentifier)
+                .add("prefixTed", prefixTed)
+                .add("annotations", annotations())
+                .toString();
+    }
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/InterfaceDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/InterfaceDescription.java
new file mode 100644
index 0000000..6e7804d
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/InterfaceDescription.java
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onosproject.iptopology.api.InterfaceIdentifier;
+import org.onosproject.net.Description;
+
+
+/**
+ * Information about an interface.
+ */
+public interface InterfaceDescription extends Description {
+
+    /**
+     * Returns the IPv4 Address of an interface.
+     *
+     * @return ipv4 address
+     */
+    Ip4Address ipv4Address();
+
+    /**
+     * Returns the IPv6 Address of an interface.
+     *
+     * @return ipv6 address
+     */
+    Ip6Address ipv6Address();
+
+
+    /**
+     * Returns the interface id of the interface.
+     *
+     * @return interface identifier
+     */
+    InterfaceIdentifier intfId();
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceDescription.java
new file mode 100644
index 0000000..c0a4391
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceDescription.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2014-2015 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.iptopology.api.device;
+
+import org.onosproject.iptopology.api.DeviceTed;
+import org.onosproject.iptopology.api.IpDevice;
+import org.onosproject.iptopology.api.IpDeviceIdentifier;
+import org.onosproject.net.Description;
+
+
+import java.net.URI;
+
+/**
+ * Carrier of immutable information about an ip device.
+ */
+public interface IpDeviceDescription extends Description {
+
+    /**
+     * Protocol/provider specific URI that can be used to encode the identity
+     * information required to communicate with the ip device externally, e.g.
+     * datapath ID.
+     *
+     * @return provider specific URI for the ip device
+     */
+    URI deviceURI();
+
+    /**
+     * Returns the type of the ip device. For ex: Psuedo or actual
+     *
+     * @return type of the device
+     */
+    IpDevice.Type type();
+
+    /**
+     * Returns the device identifier details.
+     *
+     * @return identifier of the device
+     */
+    IpDeviceIdentifier deviceIdentifier();
+
+    /**
+     * Returns the traffic engineering parameters of the device.
+     *
+     * @return traffic engineering parameters of the device
+     */
+    DeviceTed deviceTed();
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceEvent.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceEvent.java
new file mode 100644
index 0000000..07f263e
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceEvent.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2014-2015 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.iptopology.api.device;
+
+import org.joda.time.LocalDateTime;
+import org.onosproject.event.AbstractEvent;
+import org.onosproject.iptopology.api.DeviceIntf;
+import org.onosproject.iptopology.api.DevicePrefix;
+import org.onosproject.iptopology.api.IpDevice;
+
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Describes ip device event.
+ */
+public class IpDeviceEvent extends AbstractEvent<IpDeviceEvent.Type, IpDevice> {
+
+    private final DeviceIntf devInterface;
+    private final DevicePrefix devicePrefix;
+
+    /**
+     * Type of device events.
+     */
+    public enum Type {
+        /**
+         * Signifies that a new device has been detected.
+         */
+        DEVICE_ADDED,
+
+        /**
+         * Signifies that some device attributes have changed; excludes
+         * availability changes.
+         */
+        DEVICE_UPDATED,
+
+        /**
+         * Signifies that a device has been removed.
+         */
+        DEVICE_REMOVED,
+
+        /**
+         * Signifies that an interface has been added.
+         */
+        INTERFACE_ADDED,
+
+        /**
+         * Signifies that an interface has been updated.
+         */
+        INTERFACE_UPDATED,
+
+        /**
+         * Signifies that an interface has been removed.
+         */
+        INTERFACE_REMOVED,
+
+        /**
+         * Signifies that a prefix has been added.
+         */
+        PREFIX_ADDED,
+
+        /**
+         * Signifies that a prefix has been updated.
+         */
+        PREFIX_UPDATED,
+
+        /**
+         * Signifies that a prefix has been removed.
+         */
+        PREFIX_REMOVED,
+
+    }
+
+    /**
+     * Creates an event of a given type and for the specified ip device.
+     *
+     * @param type   device event type
+     * @param device event device subject
+     */
+    public IpDeviceEvent(Type type, IpDevice device) {
+        this(type, device, null, null);
+    }
+
+    /**
+     * Creates an event of a given type and for the specified device and interface.
+     *
+     * @param type   device event type
+     * @param device event device subject
+     * @param devInterface   optional interface subject
+     */
+    public IpDeviceEvent(Type type, IpDevice device, DeviceIntf devInterface) {
+        this(type, device, devInterface, null);
+    }
+
+    /**
+     * Creates an event of a given type and for the specified device and interface.
+     *
+     * @param type   device event type
+     * @param device event device subject
+     * @param devicePrefix   optional prefix subject
+     */
+    public IpDeviceEvent(Type type, IpDevice device, DevicePrefix devicePrefix) {
+        this(type, device, null, devicePrefix);
+    }
+
+
+    /**
+     * Creates an event of a given type and for the specified device, interface and prefix.
+     *
+     * @param type   device event type
+     * @param device event device subject
+     * @param devInterface   optional interface subject
+     * @param devicePrefix   optional prefix subject
+     */
+    public IpDeviceEvent(Type type, IpDevice device, DeviceIntf devInterface,  DevicePrefix devicePrefix) {
+        super(type, device);
+        this.devInterface = devInterface;
+        this.devicePrefix = devicePrefix;
+    }
+
+
+    /**
+     * Creates an event of a given type and for the specified device, interface and time.
+     *
+     * @param type   device event type
+     * @param device event device subject
+     * @param devInterface   optional interface subject
+     * @param devicePrefix   optional prefix subject
+     * @param time   occurrence time
+     */
+
+    public IpDeviceEvent(Type type, IpDevice device, DeviceIntf devInterface,  DevicePrefix devicePrefix, long time) {
+        super(type, device, time);
+        this.devInterface = devInterface;
+        this.devicePrefix = devicePrefix;
+    }
+
+
+    /**
+     * Returns the interface subject.
+     *
+     * @return interface subject or null if the event is not interface specific.
+     */
+    public DeviceIntf deviceInterface() {
+        return devInterface;
+    }
+
+    /**
+     * Returns the prefix subject.
+     *
+     * @return prefix subject or null if the event is not prefix specific.
+     */
+    public DevicePrefix prefix() {
+        return devicePrefix;
+    }
+
+    @Override
+    public String toString() {
+        if (devInterface == null || devicePrefix == null) {
+            return super.toString();
+        }
+        return toStringHelper(this)
+                .add("time", new LocalDateTime(time()))
+                .add("type", type())
+                .add("subject", subject())
+                .add("interface", devInterface)
+                .add("prefix", devicePrefix)
+                .toString();
+     }
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceListener.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceListener.java
new file mode 100644
index 0000000..cd40c40
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceListener.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Entity capable of receiving ip device related events.
+ */
+public interface IpDeviceListener extends EventListener<IpDeviceEvent> {
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProvider.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProvider.java
new file mode 100644
index 0000000..67502eb
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProvider.java
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import org.onosproject.net.provider.Provider;
+
+/**
+ * Abstraction of a ip device information provider.
+ */
+public interface IpDeviceProvider extends Provider {
+    // Currently there is none to set some information into the network
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProviderRegistry.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProviderRegistry.java
new file mode 100644
index 0000000..74b2741
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProviderRegistry.java
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import org.onosproject.net.provider.ProviderRegistry;
+
+/**
+ * Abstraction of a ip device provider registry.
+ */
+public interface IpDeviceProviderRegistry
+        extends ProviderRegistry<IpDeviceProvider, IpDeviceProviderService> {
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProviderService.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProviderService.java
new file mode 100644
index 0000000..f84b8b7
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceProviderService.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2014-2015 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.iptopology.api.device;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.provider.ProviderService;
+
+import java.util.List;
+
+/**
+ * Service through which ip device providers can inject ip device information into
+ * the core.
+ */
+public interface IpDeviceProviderService extends ProviderService<IpDeviceProvider> {
+
+    /**
+     * Signals the core that an ip device is added or updated with IP topology information.
+     *
+     * @param deviceId device identifier
+     * @param deviceDescription information about network ip device
+     */
+    void addOrUpdateIpDevice(DeviceId deviceId, IpDeviceDescription deviceDescription);
+
+    /**
+     * Signals the core that an ip device is removed.
+     *
+     * @param deviceId identity of the ip device to be removed
+     */
+    void removeIpDevice(DeviceId deviceId);
+
+    /**
+     * Sends information about all interfaces of a device. It is up to the core to
+     * determine what has changed.
+     *
+     * @param deviceId         identity of the ip device
+     * @param interfaceDescriptions list of device interfaces
+     */
+    void updateInterfaces(DeviceId deviceId, List<InterfaceDescription> interfaceDescriptions);
+
+    /**
+     * signals interfaces of a device is deleted.
+     *
+     * @param deviceId         identity of the ip device
+     * @param interfaceDescriptions list of device interfaces
+     */
+    void removeInterfaces(DeviceId deviceId, List<InterfaceDescription> interfaceDescriptions);
+
+    /**
+     * Sends information about all ip prefix of a device. It is up to the core to
+     * determine what has changed.
+     *
+     * @param deviceId         identity of the ip device
+     * @param prefixDescriptions list of device ip prefixes
+     */
+    void updatePrefixes(DeviceId deviceId, List<PrefixDescription> prefixDescriptions);
+
+    /**
+     * signals ip prefix of a device is deleted.
+     *
+     * @param deviceId         identity of the ip device
+     * @param prefixDescriptions list of device ip prefixes
+     */
+    void removePrefixes(DeviceId deviceId, List<PrefixDescription> prefixDescriptions);
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceService.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceService.java
new file mode 100644
index 0000000..4b126eb
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceService.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2014-2015 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.iptopology.api.device;
+
+import org.onosproject.event.ListenerService;
+import org.onosproject.iptopology.api.DeviceIntf;
+import org.onosproject.iptopology.api.DevicePrefix;
+import org.onosproject.iptopology.api.InterfaceIdentifier;
+import org.onosproject.iptopology.api.IpDevice;
+import org.onosproject.net.DeviceId;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+
+import java.util.List;
+
+/**
+ * Service for interacting with the inventory of ip devices.
+ */
+public interface IpDeviceService
+    extends ListenerService<IpDeviceEvent, IpDeviceListener> {
+
+    /**
+     * Returns the number of ip devices known to the system.
+     *
+     * @return number of infrastructure devices
+     */
+    int getIpDeviceCount();
+
+    /**
+     * Returns a collection of the currently known ip
+     * devices.
+     *
+     * @return collection of devices
+     */
+    Iterable<IpDevice> getIpDevices();
+
+    /**
+     * Returns a collection of the currently known ip
+     * devices by device type.
+     *
+     * @param type device type
+     * @return collection of devices
+     */
+    Iterable<IpDevice> getIpDevices(IpDevice.Type type);
+
+
+    /**
+     * Returns the ip device with the specified identifier.
+     *
+     * @param deviceId device identifier
+     * @return device or null if one with the given identifier is not known
+     */
+    IpDevice getIpDevice(DeviceId deviceId);
+
+    /**
+     * Returns the list of interfaces associated with the device.
+     *
+     * @param deviceId device identifier
+     * @return list of device interfaces
+     */
+    List<DeviceIntf> getInterfaces(DeviceId deviceId);
+
+    /**
+     * Returns the interface with the specified ipv4 address and hosted by the given device.
+     *
+     * @param deviceId   device identifier
+     * @param ipv4Address ipv4 address
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, Ip4Address ipv4Address);
+
+    /**
+     * Returns the interface with the specified ipv6 address and hosted by the given device.
+     *
+     * @param deviceId   device identifier
+     * @param ipv6Address ipv6 address
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, Ip6Address ipv6Address);
+
+    /**
+     * Returns the interface with the specified interface id and hosted by the given device.
+     *
+     * @param deviceId   device identifier
+     * @param intfId interface id
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, InterfaceIdentifier intfId);
+
+    /**
+     * Returns the list of ip prefix associated with the device.
+     *
+     * @param deviceId device identifier
+     * @return list of device prefixes
+     */
+    List<DevicePrefix> getPrefixes(DeviceId deviceId);
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStore.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStore.java
new file mode 100644
index 0000000..db1dd42
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStore.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2014-2015 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.iptopology.api.device;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onosproject.iptopology.api.DevicePrefix;
+import org.onosproject.iptopology.api.InterfaceIdentifier;
+import org.onosproject.iptopology.api.IpDevice;
+import org.onosproject.iptopology.api.DeviceIntf;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.store.Store;
+
+import java.util.List;
+
+/**
+ * Manages inventory of ip devices; not intended for direct use.
+ */
+public interface IpDeviceStore extends Store<IpDeviceEvent, IpDeviceStoreDelegate> {
+
+    /**
+     * Returns the number of ip devices known to the system.
+     *
+     * @return number of ip devices
+     */
+    int getIpDeviceCount();
+
+    /**
+     * Returns an iterable collection of all ip devices known to the system.
+     *
+     * @return ip device collection
+     */
+    Iterable<IpDevice> getIpDevices();
+
+
+    /**
+     * Returns an ip device with the specified identifier.
+     *
+     * @param deviceId device identifier
+     * @return ip device
+     */
+    IpDevice getIpDevice(DeviceId deviceId);
+
+    /**
+     * Creates a new infrastructure ip device, or updates an existing one using
+     * the supplied device description.
+     *
+     * @param providerId        provider identifier
+     * @param deviceId          device identifier
+     * @param deviceDescription device description
+     * @return ready to send event describing what occurred; null if no change
+     */
+    IpDeviceEvent createOrUpdateIpDevice(ProviderId providerId, DeviceId deviceId,
+                                     IpDeviceDescription deviceDescription);
+
+    /**
+     * Administratively removes the specified ip device from the store.
+     *
+     * @param deviceId device to be removed
+     * @return null if no such ip device
+     */
+    IpDeviceEvent removeIpDevice(DeviceId deviceId);
+
+    /**
+     * Updates the interface of the specified ip device using the given
+     * list of interface descriptions. The list is assumed to be comprehensive.
+     *
+     * @param providerId            provider identifier
+     * @param deviceId              ip device identifier
+     * @param interfaceDescriptions list of interface descriptions
+     * @return ready to send events describing what occurred; empty list if no change
+     */
+    List<IpDeviceEvent> updateInterfaces(ProviderId providerId, DeviceId deviceId,
+                                  List<InterfaceDescription> interfaceDescriptions);
+
+    /**
+     * Administratively removes the specified interface from the store.
+     *
+     * @param deviceId device of the interfaces to be removed
+     * @param interfaceDescriptions list of interface descriptions
+     * @return ready to send events describing what occurred.
+     */
+    List<IpDeviceEvent> removeInterfaces(DeviceId deviceId, List<InterfaceDescription> interfaceDescriptions);
+
+    /**
+     * Returns the list of interfaces that belong to the specified device.
+     *
+     * @param deviceId device identifier
+     * @return list of device interfaces
+     */
+    List<DeviceIntf> getInterfaces(DeviceId deviceId);
+
+    /**
+     * Returns the specified device interface.
+     *
+     * @param deviceId    device identifier
+     * @param ipv4Address ipv4 address of the interface
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, Ip4Address ipv4Address);
+
+    /**
+     * Returns the specified device interface.
+     *
+     * @param deviceId    device identifier
+     * @param ipv6Address ipv6 address of the interface
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, Ip6Address ipv6Address);
+
+    /**
+     * Returns the specified device interface.
+     *
+     * @param deviceId    device identifier
+     * @param intfId      interface identifier of the interface
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, InterfaceIdentifier intfId);
+
+    /**
+     * Updates the prefix information of the specified ip device using the given
+     * list of prefix descriptions. The list is assumed to be comprehensive.
+     *
+     * @param providerId           provider identifier
+     * @param deviceId             ip device identifier
+     * @param prefixDescriptions   list of prefix descriptions
+     * @return ready to send events describing what occurred; empty list if no change
+     */
+    List<IpDeviceEvent>  updatePrefixes(ProviderId providerId, DeviceId deviceId,
+                                        List<PrefixDescription> prefixDescriptions);
+
+    /**
+     * Administratively removes the specified prefix from the store.
+     *
+     * @param deviceId device of the prefix to be removed
+     * @param prefixDescriptions list of prefix descriptions
+     * @return ready to send events describing what occurred.
+     */
+    List<IpDeviceEvent> removePrefixes(DeviceId deviceId, List<PrefixDescription> prefixDescriptions);
+
+    /**
+     * Returns the list of prefixes that belong to the specified device.
+     *
+     * @param deviceId device identifier
+     * @return list of device prefixes
+     */
+    List<DevicePrefix> getPrefixes(DeviceId deviceId);
+
+}
+
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStoreDelegate.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStoreDelegate.java
new file mode 100644
index 0000000..14efe06
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import org.onosproject.store.StoreDelegate;
+
+/**
+ * Infrastructure ip topology store delegate abstraction.
+ */
+public interface IpDeviceStoreDelegate extends StoreDelegate<IpDeviceEvent> {
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/PrefixDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/PrefixDescription.java
new file mode 100644
index 0000000..eb1ece3
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/PrefixDescription.java
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.device;
+
+import org.onosproject.iptopology.api.PrefixIdentifier;
+import org.onosproject.iptopology.api.PrefixTed;
+import org.onosproject.net.Description;
+
+/**
+ * Information about a prefix.
+ */
+public interface PrefixDescription extends Description {
+
+    /**
+     * Returns the prefix identifier.
+     *
+     * @return prefix identifier
+     */
+    PrefixIdentifier prefixIdentifier();
+
+    /**
+     * Returns the prefix Traffic Engineering parameters.
+     *
+     * @return prefix Traffic Engineering parameters
+     */
+    PrefixTed prefixTed();
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/package-info.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/package-info.java
new file mode 100644
index 0000000..5e4e29b
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Ip device model &amp; related services API definitions.
+ */
+package org.onosproject.iptopology.api.device;
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/DefaultIpLinkDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/DefaultIpLinkDescription.java
new file mode 100644
index 0000000..4a3b46d
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/DefaultIpLinkDescription.java
@@ -0,0 +1,95 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.iptopology.api.IpLinkIdentifier;
+import org.onosproject.iptopology.api.LinkTed;
+import org.onosproject.iptopology.api.TerminationPoint;
+import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.SparseAnnotations;
+
+/**
+ * Default implementation of immutable ip link description entity.
+ */
+public class DefaultIpLinkDescription extends AbstractDescription
+        implements IpLinkDescription {
+
+    private final TerminationPoint src;
+    private final TerminationPoint dst;
+    private final IpLinkIdentifier linkIdentifier;
+    private final LinkTed linkTed;
+
+    /**
+     * Creates an ip link description using the supplied information.
+     *
+     * @param src             link source
+     * @param dst             link destination
+     * @param linkIdentifier  link identifier
+     * @param linkTed         link traffic engineering parameters
+     * @param annotations optional key/value annotations
+     */
+    public DefaultIpLinkDescription(TerminationPoint src, TerminationPoint dst,
+                                    IpLinkIdentifier linkIdentifier, LinkTed linkTed,
+                                    SparseAnnotations... annotations) {
+        super(annotations);
+        this.src = src;
+        this.dst = dst;
+        this.linkIdentifier = linkIdentifier;
+        this.linkTed = linkTed;
+    }
+
+    /**
+     * Creates an ip link description using the supplied information.
+     *
+     * @param base        IpLinkDescription to basic information
+     * @param annotations optional key/value annotations
+     */
+    public DefaultIpLinkDescription(IpLinkDescription base, SparseAnnotations... annotations) {
+        this(base.src(), base.dst(), base.linkIdentifier(),
+                base.linkTed(), annotations);
+    }
+
+    @Override
+    public TerminationPoint src() {
+        return src;
+    }
+
+    @Override
+    public TerminationPoint dst() {
+        return dst;
+    }
+
+    @Override
+    public IpLinkIdentifier linkIdentifier() {
+        return linkIdentifier;
+    }
+
+    @Override
+    public LinkTed linkTed() {
+        return linkTed; }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("src", src())
+                .add("dst", dst())
+                .add("linkIdentifier", linkIdentifier())
+                .add("linkTed", linkTed())
+                .toString();
+    }
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkDescription.java
new file mode 100644
index 0000000..258e744
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkDescription.java
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import org.onosproject.iptopology.api.IpLinkIdentifier;
+import org.onosproject.iptopology.api.LinkTed;
+import org.onosproject.iptopology.api.TerminationPoint;
+import org.onosproject.net.Description;
+
+/**
+ * Describes an ip link.
+ */
+public interface IpLinkDescription extends Description {
+
+    /**
+     * Returns the link source.
+     *
+     * @return links source
+     */
+    TerminationPoint src();
+
+    /**
+     * Returns the link destination.
+     *
+     * @return links destination
+     */
+    TerminationPoint dst();
+
+    /**
+     * Returns the link identifier.
+     *
+     * @return links identifier informations
+     */
+    IpLinkIdentifier linkIdentifier();
+
+    /**
+     * Returns the link traffic engineering parameters.
+     *
+     * @return links traffic engineering parameters
+     */
+    LinkTed linkTed();
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkEvent.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkEvent.java
new file mode 100644
index 0000000..4050734
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkEvent.java
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import org.onosproject.event.AbstractEvent;
+import org.onosproject.iptopology.api.IpLink;
+
+/**
+ * Describes ip link event.
+ */
+public class IpLinkEvent extends AbstractEvent<IpLinkEvent.Type, IpLink> {
+
+    /**
+     * Type of link events.
+     */
+    public enum Type {
+        /**
+         * Signifies that a new ip link has been detected.
+         */
+        LINK_ADDED,
+
+        /**
+         * Signifies that an ip link has been updated or changed state.
+         */
+        LINK_UPDATED,
+
+        /**
+         * Signifies that an ip link has been removed.
+         */
+        LINK_REMOVED
+    }
+
+    /**
+     * Creates an event of a given type and for the specified ip link and the
+     * current time.
+     *
+     * @param type link event type
+     * @param link event link subject
+     */
+    public IpLinkEvent(Type type, IpLink link) {
+        super(type, link);
+    }
+
+    /**
+     * Creates an event of a given type and for the specified ip link and time.
+     *
+     * @param type link event type
+     * @param link event link subject
+     * @param time occurrence time
+     */
+    public IpLinkEvent(Type type, IpLink link, long time) {
+        super(type, link, time);
+    }
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkListener.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkListener.java
new file mode 100644
index 0000000..5acb73a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkListener.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Entity capable of receiving ip link related events.
+ */
+public interface IpLinkListener extends EventListener<IpLinkEvent> {
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProvider.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProvider.java
new file mode 100644
index 0000000..a58bf61
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProvider.java
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import org.onosproject.net.provider.Provider;
+
+/**
+ * Abstraction of an entity providing information about ip links
+ * to the core.
+ */
+public interface IpLinkProvider extends Provider {
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProviderRegistry.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProviderRegistry.java
new file mode 100644
index 0000000..e060ae6
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProviderRegistry.java
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import org.onosproject.net.provider.ProviderRegistry;
+
+/**
+ * Abstraction of an ip link provider registry.
+ */
+public interface IpLinkProviderRegistry
+        extends ProviderRegistry<IpLinkProvider, IpLinkProviderService> {
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProviderService.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProviderService.java
new file mode 100644
index 0000000..c255442
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkProviderService.java
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+
+import org.onosproject.iptopology.api.TerminationPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.provider.ProviderService;
+
+/**
+ * Means for injecting ip link information into the core.
+ */
+public interface IpLinkProviderService extends ProviderService<IpLinkProvider> {
+
+    /**
+     * Signals that an ip link is added or updated with IP topology information.
+     *
+     * @param linkDescription ip link information
+     */
+    void addOrUpdateIpLink(IpLinkDescription linkDescription);
+
+    /**
+     * Signals that an ip link has disappeared.
+     *
+     * @param linkDescription ip link information
+     */
+    void removeIpLink(IpLinkDescription linkDescription);
+
+    /**
+     * Signals that ip links associated with the specified
+     * termination point have vanished.
+     *
+     * @param terminationPoint termination point
+     */
+    void removeIpLink(TerminationPoint terminationPoint);
+
+    /**
+     * Signals that ip links associated with the specified
+     * device have vanished.
+     *
+     * @param deviceId device identifier
+     */
+    void removeIpLink(DeviceId deviceId);
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkService.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkService.java
new file mode 100644
index 0000000..723e907
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkService.java
@@ -0,0 +1,108 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import java.util.Set;
+
+import org.onosproject.event.ListenerService;
+import org.onosproject.iptopology.api.IpLink;
+import org.onosproject.iptopology.api.TerminationPoint;
+import org.onosproject.net.DeviceId;
+
+/**
+ * Service for interacting with the inventory of infrastructure links.
+ */
+public interface IpLinkService
+    extends ListenerService<IpLinkEvent, IpLinkListener> {
+
+    /**
+     * Returns the count of all known ip links.
+     *
+     * @return number of ip links
+     */
+    int getIpLinkCount();
+
+    /**
+     * Returns a collection of all ip links.
+     *
+     * @return all ip links
+     */
+    Iterable<IpLink> getIpLinks();
+
+
+    /**
+     * Returns set of all ip links leading to and from the
+     * specified ip device.
+     *
+     * @param deviceId device identifier
+     * @return set of ip device links
+     */
+    Set<IpLink> getIpDeviceLinks(DeviceId deviceId);
+
+    /**
+     * Returns set of all ip links leading from the specified ip device.
+     *
+     * @param deviceId device identifier
+     * @return set of ip device egress links
+     */
+    Set<IpLink> getIpDeviceEgressLinks(DeviceId deviceId);
+
+    /**
+     * Returns set of all ip links leading to the specified ip device.
+     *
+     * @param deviceId device identifier
+     * @return set of ip device ingress links
+     */
+    Set<IpLink> getIpDeviceIngressLinks(DeviceId deviceId);
+
+    /**
+     * Returns set of all ip links leading to and from the
+     * specified termination point.
+     *
+     * @param terminationPoint termination point
+     * @return set of ip links
+     */
+    Set<IpLink> getIpLinks(TerminationPoint terminationPoint);
+
+    /**
+     * Returns set of all ip links leading from the specified
+     * termination point.
+     *
+     * @param terminationPoint termination point
+     * @return set of ip device egress links
+     */
+    Set<IpLink> getEgressIpLinks(TerminationPoint terminationPoint);
+
+    /**
+     * Returns set of all ip links leading to the specified
+     * termination point.
+     *
+     * @param terminationPoint termination point
+     * @return set of ip device ingress links
+     */
+    Set<IpLink> getIngressIpLinks(TerminationPoint terminationPoint);
+
+    /**
+     * Returns the ip links between the specified source
+     * and destination termination points.
+     *
+     * @param src source termination point
+     * @param dst destination termination point
+     * @return ip link from source to destination; null if none found
+     */
+    IpLink getIpLink(TerminationPoint src, TerminationPoint dst);
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkStore.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkStore.java
new file mode 100644
index 0000000..8f5c60f
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkStore.java
@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import org.onosproject.iptopology.api.IpLink;
+import org.onosproject.iptopology.api.TerminationPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.store.Store;
+
+import java.util.Set;
+
+/**
+ * Manages inventory of ip links; not intended for direct use.
+ */
+public interface IpLinkStore extends Store<IpLinkEvent, IpLinkStoreDelegate> {
+
+    /**
+     * Returns the number of ip links in the store.
+     *
+     * @return number of ip links
+     */
+    int getIpLinkCount();
+
+    /**
+     * Returns an iterable collection of all ip links in the inventory.
+     *
+     * @return collection of all ip links
+     */
+    Iterable<IpLink> getIpLinks();
+
+    /**
+     * Returns all ip links egressing from the specified device.
+     *
+     * @param deviceId device identifier
+     * @return set of ip device links
+     */
+    Set<IpLink> getIpDeviceEgressLinks(DeviceId deviceId);
+
+    /**
+     * Returns all ip links ingressing from the specified device.
+     *
+     * @param deviceId device identifier
+     * @return set of ip device links
+     */
+    Set<IpLink> getIpDeviceIngressLinks(DeviceId deviceId);
+
+    /**
+     * Returns the ip link between the two termination points.
+     *
+     * @param src source termination point
+     * @param dst destination termination point
+     * @return ip link or null if one not found between the termination points
+     */
+    IpLink getIpLink(TerminationPoint src, TerminationPoint dst);
+
+    /**
+     * Returns all ip links egressing from the specified termination point.
+     *
+     * @param src source termination point
+     * @return set of termination point ip links
+     */
+    Set<IpLink> getEgressIpLinks(TerminationPoint src);
+
+    /**
+     * Returns all ip links ingressing to the specified termination point.
+     *
+     * @param dst destination termination point
+     * @return set of termination point ip links
+     */
+    Set<IpLink> getIngressIpLinks(TerminationPoint dst);
+
+    /**
+     * Creates a new ip link, or updates an existing one, based on the given
+     * information.
+     *
+     * @param providerId      provider identity
+     * @param linkDescription ip link description
+     * @return create or update ip link event, or null if no change resulted
+     */
+    IpLinkEvent createOrUpdateIpLink(ProviderId providerId,
+                                        IpLinkDescription linkDescription);
+
+    /**
+     * Removes ip link, based on the specified information.
+     *
+     * @param src ip link source
+     * @param dst ip link destination
+     * @return remove or update ip link event, or null if no change resulted
+     */
+    IpLinkEvent removeOrDownIpLink(TerminationPoint src, TerminationPoint dst);
+
+    /**
+     * Removes ip link based on the specified information.
+     *
+     * @param src ip link source
+     * @param dst ip link destination
+     * @return remove ip link event, or null if no change resulted
+     */
+    IpLinkEvent removeIpLink(TerminationPoint src, TerminationPoint dst);
+
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkStoreDelegate.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkStoreDelegate.java
new file mode 100644
index 0000000..9397a49
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/IpLinkStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.onosproject.iptopology.api.link;
+
+import org.onosproject.store.StoreDelegate;
+
+/**
+ * Ip link store delegate abstraction.
+ */
+public interface IpLinkStoreDelegate extends StoreDelegate<IpLinkEvent> {
+}
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/package-info.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/package-info.java
new file mode 100644
index 0000000..581c236
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/link/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Ip link model &amp; related services API definitions.
+ */
+package org.onosproject.iptopology.api.link;
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/package-info.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/package-info.java
new file mode 100644
index 0000000..e113355
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * Ip Topology API.
+ */
+package org.onosproject.iptopology.api;
diff --git a/apps/pom.xml b/apps/pom.xml
index 005052f..c72cf5a 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -47,6 +47,7 @@
         <module>cordfabric</module>
         <module>xos-integration</module>
         <module>pcep-api</module>
+        <module>iptopology-api</module>
         <module>olt</module>
         <module>cip</module>
         <module>flowanalyzer</module>