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
index 4767074..d8c8425 100644
--- 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
@@ -1,106 +1,106 @@
-/*
- * 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 providerId     provider identification
-     * @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();
-    }
+/*
+ * 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 providerId     provider identification
+     * @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
