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
index 7be13ad..295d799 100644
--- 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
@@ -1,142 +1,142 @@
-/*
- * 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 routeDish routing distinguisher instance
-     * @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();
-    }
+/*
+ * 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 routeDish routing distinguisher instance
+     * @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
