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
