diff --git a/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java b/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java
index 8d2fd14..0e3e156 100644
--- a/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java
+++ b/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java
@@ -1,148 +1,148 @@
-/*
- * 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.ovsdb.provider.host;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.toHex;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.packet.VlanId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.DefaultAnnotations;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-import org.onosproject.net.host.DefaultHostDescription;
-import org.onosproject.net.host.HostDescription;
-import org.onosproject.net.host.HostProvider;
-import org.onosproject.net.host.HostProviderRegistry;
-import org.onosproject.net.host.HostProviderService;
-import org.onosproject.net.host.HostService;
-import org.onosproject.net.provider.AbstractProvider;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.ovsdb.controller.EventSubject;
-import org.onosproject.ovsdb.controller.OvsdbController;
-import org.onosproject.ovsdb.controller.OvsdbEvent;
-import org.onosproject.ovsdb.controller.OvsdbEventListener;
-import org.onosproject.ovsdb.controller.OvsdbEventSubject;
-import org.slf4j.Logger;
-
-/**
- * Provider which uses an ovsdb controller to detect host.
- */
-@Component(immediate = true)
-@Service
-public class OvsdbHostProvider extends AbstractProvider implements HostProvider {
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected HostProviderRegistry providerRegistry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected HostService hostService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected OvsdbController controller;
-
-    private HostProviderService providerService;
-    private OvsdbEventListener innerEventListener = new InnerOvsdbEventListener();
-
-    @Activate
-    public void activate() {
-        providerService = providerRegistry.register(this);
-        controller.addOvsdbEventListener(innerEventListener);
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        providerRegistry.unregister(this);
-        providerService = null;
-        log.info("Stopped");
-    }
-
-    public OvsdbHostProvider() {
-        super(new ProviderId("ovsdb", "org.onosproject.ovsdb.provider.host"));
-    }
-
-    @Override
-    public void triggerProbe(Host host) {
-        log.info("Triggering probe on host {}", host);
-    }
-
-    private class InnerOvsdbEventListener implements OvsdbEventListener {
-
-        @Override
-        public void handle(OvsdbEvent<EventSubject> event) {
-            OvsdbEventSubject subject = null;
-            if (event.subject() instanceof OvsdbEventSubject) {
-                subject = (OvsdbEventSubject) event.subject();
-            }
-            checkNotNull(subject, "EventSubject is not null");
-            // If ifaceid is null,it indicates this is not a vm port.
-            if (subject.ifaceid() == null) {
-                return;
-            }
-            switch (event.type()) {
-            case PORT_ADDED:
-                HostId hostId = HostId.hostId(subject.hwAddress(), null);
-                DeviceId deviceId = DeviceId.deviceId(uri(subject.dpid().value()));
-                PortNumber portNumber = PortNumber.portNumber(subject
-                        .portNumber().value(), subject.portName().value());
-                HostLocation loaction = new HostLocation(deviceId, portNumber,
-                                                         0L);
-                SparseAnnotations annotations = DefaultAnnotations.builder()
-                        .set("ifaceid", subject.ifaceid().value()).build();
-                HostDescription hostDescription = new DefaultHostDescription(
-                                                                             subject.hwAddress(),
-                                                                             VlanId.vlanId(),
-                                                                             loaction,
-                                                                             annotations);
-                providerService.hostDetected(hostId, hostDescription);
-                break;
-            case PORT_REMOVED:
-                HostId host = HostId.hostId(subject.hwAddress(), null);
-                providerService.hostVanished(host);
-                break;
-            default:
-                break;
-            }
-
-        }
-
-    }
-
-    public URI uri(String value) {
-        try {
-            return new URI("of", toHex(Long.valueOf(value)), null);
-        } catch (URISyntaxException e) {
-            return null;
-        }
-    }
-}
+/*
+ * 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.ovsdb.provider.host;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.toHex;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.VlanId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.host.DefaultHostDescription;
+import org.onosproject.net.host.HostDescription;
+import org.onosproject.net.host.HostProvider;
+import org.onosproject.net.host.HostProviderRegistry;
+import org.onosproject.net.host.HostProviderService;
+import org.onosproject.net.host.HostService;
+import org.onosproject.net.provider.AbstractProvider;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.ovsdb.controller.EventSubject;
+import org.onosproject.ovsdb.controller.OvsdbController;
+import org.onosproject.ovsdb.controller.OvsdbEvent;
+import org.onosproject.ovsdb.controller.OvsdbEventListener;
+import org.onosproject.ovsdb.controller.OvsdbEventSubject;
+import org.slf4j.Logger;
+
+/**
+ * Provider which uses an ovsdb controller to detect host.
+ */
+@Component(immediate = true)
+@Service
+public class OvsdbHostProvider extends AbstractProvider implements HostProvider {
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostProviderRegistry providerRegistry;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected OvsdbController controller;
+
+    private HostProviderService providerService;
+    private OvsdbEventListener innerEventListener = new InnerOvsdbEventListener();
+
+    @Activate
+    public void activate() {
+        providerService = providerRegistry.register(this);
+        controller.addOvsdbEventListener(innerEventListener);
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        providerRegistry.unregister(this);
+        providerService = null;
+        log.info("Stopped");
+    }
+
+    public OvsdbHostProvider() {
+        super(new ProviderId("ovsdb", "org.onosproject.ovsdb.provider.host"));
+    }
+
+    @Override
+    public void triggerProbe(Host host) {
+        log.info("Triggering probe on host {}", host);
+    }
+
+    private class InnerOvsdbEventListener implements OvsdbEventListener {
+
+        @Override
+        public void handle(OvsdbEvent<EventSubject> event) {
+            OvsdbEventSubject subject = null;
+            if (event.subject() instanceof OvsdbEventSubject) {
+                subject = (OvsdbEventSubject) event.subject();
+            }
+            checkNotNull(subject, "EventSubject is not null");
+            // If ifaceid is null,it indicates this is not a vm port.
+            if (subject.ifaceid() == null) {
+                return;
+            }
+            switch (event.type()) {
+            case PORT_ADDED:
+                HostId hostId = HostId.hostId(subject.hwAddress(), null);
+                DeviceId deviceId = DeviceId.deviceId(uri(subject.dpid().value()));
+                PortNumber portNumber = PortNumber.portNumber(subject
+                        .portNumber().value(), subject.portName().value());
+                HostLocation loaction = new HostLocation(deviceId, portNumber,
+                                                         0L);
+                SparseAnnotations annotations = DefaultAnnotations.builder()
+                        .set("ifaceid", subject.ifaceid().value()).build();
+                HostDescription hostDescription = new DefaultHostDescription(
+                                                                             subject.hwAddress(),
+                                                                             VlanId.vlanId(),
+                                                                             loaction,
+                                                                             annotations);
+                providerService.hostDetected(hostId, hostDescription);
+                break;
+            case PORT_REMOVED:
+                HostId host = HostId.hostId(subject.hwAddress(), null);
+                providerService.hostVanished(host);
+                break;
+            default:
+                break;
+            }
+
+        }
+
+    }
+
+    public URI uri(String value) {
+        try {
+            return new URI("of", toHex(Long.valueOf(value)), null);
+        } catch (URISyntaxException e) {
+            return null;
+        }
+    }
+}
