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;
