diff --git a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java
index 37b3d02..61d1625 100644
--- a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java
+++ b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java
@@ -66,6 +66,7 @@
 import org.slf4j.Logger;
 
 import javax.ws.rs.ProcessingException;
+import javax.ws.rs.core.MediaType;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -95,14 +96,9 @@
         implements DeviceProvider {
     private static final String APP_NAME = "org.onosproject.restsb";
     protected static final String REST = "rest";
-    private static final String JSON = "json";
     private static final String PROVIDER = "org.onosproject.provider.rest.device";
     private static final String IPADDRESS = "ipaddress";
-    private static final String HTTPS = "https";
-    private static final String AUTHORIZATION_PROPERTY = "authorization";
-    private static final String BASIC_AUTH_PREFIX = "Basic ";
-    private static final String URL_SEPARATOR = "://";
-    protected static final String ISNOTNULL = "Rest device is not null";
+    private static final String ISNOTNULL = "Rest device is not null";
     private static final String UNKNOWN = "unknown";
     private static final int REST_TIMEOUT_SEC = 5;
     private static final int DEFAULT_POLL_FREQUENCY_SECONDS = 30;
@@ -126,14 +122,14 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DriverService driverService;
 
-
     private DeviceProviderService providerService;
     private ApplicationId appId;
 
     private ExecutorService executor;
-    private SharedScheduledExecutorService portStatisticsExecutor = SharedScheduledExecutors.getPoolThreadExecutor();
+    private final SharedScheduledExecutorService portStatisticsExecutor =
+            SharedScheduledExecutors.getPoolThreadExecutor();
 
-    protected final List<ConfigFactory> factories = ImmutableList.of(
+    private final List<ConfigFactory> factories = ImmutableList.of(
             new ConfigFactory<ApplicationId, RestProviderConfig>(APP_SUBJECT_FACTORY,
                                                                  RestProviderConfig.class,
                                                                  "rest_devices",
@@ -152,9 +148,8 @@
                 }
             });
 
-    private final NetworkConfigListener cfgLister = new InternalNetworkConfigListener();
+    private final NetworkConfigListener configListener = new InternalNetworkConfigListener();
 
-    private Set<DeviceId> addedDevices = new HashSet<>();
     private ScheduledFuture<?> scheduledTask;
 
 
@@ -164,7 +159,7 @@
         providerService = providerRegistry.register(this);
         factories.forEach(cfgService::registerConfigFactory);
         executor = Executors.newFixedThreadPool(5, groupedThreads("onos/restsbprovider", "device-installer-%d", log));
-        cfgService.addListener(cfgLister);
+        cfgService.addListener(configListener);
         executor.execute(RestDeviceProvider.this::createAndConnectDevices);
         executor.execute(RestDeviceProvider.this::createDevices);
         scheduledTask = schedulePolling();
@@ -173,7 +168,7 @@
 
     @Deactivate
     public void deactivate() {
-        cfgService.removeListener(cfgLister);
+        cfgService.removeListener(configListener);
         controller.getDevices().keySet().forEach(this::deviceRemoved);
         providerRegistry.unregister(this);
         providerService = null;
@@ -198,7 +193,6 @@
         // TODO: This will be implemented later.
     }
 
-
     @Override
     public boolean isReachable(DeviceId deviceId) {
         RestSBDevice restDevice = controller.getDevice(deviceId);
@@ -232,7 +226,7 @@
                         devicesDiscovery(restSBDev, driver);
                 Set<DeviceId> deviceIds = devicesDiscovery.deviceIds();
                 restSBDev.setActive(true);
-                deviceIds.stream().forEach(deviceId -> {
+                deviceIds.forEach(deviceId -> {
                     controller.addProxiedDevice(deviceId, restSBDev);
                     DeviceDescription devDesc =
                             devicesDiscovery.deviceDetails(deviceId);
@@ -250,7 +244,6 @@
                     }
 
                     checkAndUpdateDevice(deviceId);
-                    addedDevices.add(deviceId);
                 });
             } else {
                 log.warn("Driver not found for {}", restSBDev);
@@ -273,7 +266,6 @@
             restSBDev.setActive(true);
             providerService.deviceConnected(deviceId, deviceDescription);
             checkAndUpdateDevice(deviceId);
-            addedDevices.add(deviceId);
         }
     }
 
@@ -345,7 +337,7 @@
     private void deviceRemoved(DeviceId deviceId) {
         checkNotNull(deviceId, ISNOTNULL);
         providerService.deviceDisconnected(deviceId);
-        controller.getProxiedDevices(deviceId).stream().forEach(device -> {
+        controller.getProxiedDevices(deviceId).forEach(device -> {
             controller.removeProxiedDevice(device);
             providerService.deviceDisconnected(device);
         });
@@ -361,18 +353,17 @@
                                .map(deviceId -> {
                                    RestDeviceConfig config =
                                            cfgService.getConfig(deviceId, RestDeviceConfig.class);
-                                   RestSBDevice device = new DefaultRestSBDevice(config.ip(),
-                                                                                 config.port(),
-                                                                                 config.username(),
-                                                                                 config.password(),
-                                                                                 config.protocol(),
-                                                                                 config.url(),
-                                                                                 false, config.testUrl(),
-                                                                                 config.manufacturer(),
-                                                                                 config.hwVersion(),
-                                                                                 config.swVersion());
-                                   return device;
-
+                                   return new DefaultRestSBDevice(config.ip(),
+                                                                  config.port(),
+                                                                  config.username(),
+                                                                  config.password(),
+                                                                  config.protocol(),
+                                                                  config.url(),
+                                                                  false,
+                                                                  config.testUrl(),
+                                                                  config.manufacturer(),
+                                                                  config.hwVersion(),
+                                                                  config.swVersion());
                                }).collect(Collectors.toSet()));
     }
 
@@ -388,7 +379,6 @@
             log.error("Configuration error {}", e);
         }
         log.debug("REST Devices {}", controller.getDevices());
-        addedDevices.clear();
     }
 
     private void connectDevices(Set<RestSBDevice> devices) {
@@ -402,9 +392,7 @@
                     controller.addDevice(device);
                     return testDeviceConnection(device);
                 })
-                .forEach(device -> {
-                    deviceAdded(device);
-                });
+                .forEach(this::deviceAdded);
         //Removing devices not wanted anymore
         toBeRemoved.forEach(device -> deviceRemoved(device.deviceId()));
     }
@@ -453,26 +441,16 @@
             Callable<Boolean> connectionSuccess;
 
             if (dev.testUrl().isPresent()) {
-                connectionSuccess = new Callable<Boolean>() {
-                    @Override
-                    public Boolean call() throws Exception {
-                        return controller
-                                .get(dev.deviceId(), dev.testUrl().get(), JSON) != null;
-                    }
-                };
+                connectionSuccess = () ->
+                        controller.get(dev.deviceId(), dev.testUrl().get(), MediaType.APPLICATION_JSON_TYPE) != null;
             } else {
-                connectionSuccess = new Callable<Boolean>() {
-                    @Override
-                    public Boolean call() throws Exception {
-                        return controller.get(dev.deviceId(), "", JSON) != null;
-                    }
-                };
+                connectionSuccess = () ->
+                        controller.get(dev.deviceId(), "", MediaType.APPLICATION_JSON_TYPE) != null;
             }
 
             Future<Boolean> future = executor.submit(connectionSuccess);
             try {
-                Boolean result = future.get(REST_TIMEOUT_SEC, TimeUnit.SECONDS);
-                return result;
+                return future.get(REST_TIMEOUT_SEC, TimeUnit.SECONDS);
             } catch (TimeoutException ex) {
                 log.warn("Connection to device {} timed out", dev.deviceId());
                 return false;
