diff --git a/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java b/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
index 5345e34..9e68636 100644
--- a/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
+++ b/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
@@ -156,6 +156,11 @@
     public static final String PROTECTED = "protected";
 
     /**
+     * Annotation key for REST server identifier.
+     */
+    public static final String REST_SERVER = "restServer";
+
+    /**
      * Returns the value annotated object for the specified annotation key.
      * The annotated value is expected to be String that can be parsed as double.
      * If parsing fails, the returned value will be 1.0.
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/DevicesDiscovery.java b/core/api/src/main/java/org/onosproject/net/behaviour/DevicesDiscovery.java
new file mode 100644
index 0000000..6c553aa
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/DevicesDiscovery.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2017-present 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.net.behaviour;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.driver.HandlerBehaviour;
+
+import java.util.Set;
+
+/**
+ * Handler behaviour capable of managing a set of forwarding plane devices.
+ */
+public interface DevicesDiscovery extends HandlerBehaviour {
+
+    /**
+     * Returns a set of proxied device ids.
+     *
+     * @return a set of deviceId
+     */
+    Set<DeviceId> deviceIds();
+
+    /**
+     * Returns a device description appropriately annotated to support
+     * downstream model extension via projections of the resulting device,
+     * as in the following example.
+     * This process permits to discovery the description of a proxied device by
+     * leveraging on the device ids discovered
+     * @see org.onosproject.net.behaviour.DevicesDiscovery#deviceDetails(DeviceId)
+     *
+     * @param deviceId the device Id of the device of interest
+     * @return annotated device description
+     */
+    DeviceDescription deviceDetails(DeviceId deviceId);
+}
\ No newline at end of file
diff --git a/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/HttpSBControllerImpl.java b/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/HttpSBControllerImpl.java
index 2c2d1a2..b162b56 100644
--- a/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/HttpSBControllerImpl.java
+++ b/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/HttpSBControllerImpl.java
@@ -63,8 +63,8 @@
             LoggerFactory.getLogger(HttpSBControllerImpl.class);
     private static final String XML = "xml";
     private static final String JSON = "json";
-    private static final String DOUBLESLASH = "//";
-    private static final String COLON = ":";
+    protected static final String DOUBLESLASH = "//";
+    protected static final String COLON = ":";
     private static final int STATUS_OK = Response.Status.OK.getStatusCode();
     private static final int STATUS_CREATED = Response.Status.CREATED.getStatusCode();
     private static final int STATUS_ACCEPTED = Response.Status.ACCEPTED.getStatusCode();
@@ -279,7 +279,7 @@
                                       .build()).build();
     }
 
-    private String getUrlString(DeviceId device, String request) {
+    protected String getUrlString(DeviceId device, String request) {
         if (deviceMap.get(device).url() != null) {
             return deviceMap.get(device).protocol() + COLON + DOUBLESLASH
                     + deviceMap.get(device).url() + request;
diff --git a/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/package-info.java b/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/package-info.java
index e6fe54d..6401451 100644
--- a/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/package-info.java
+++ b/protocols/rest/api/src/main/java/org/onosproject/protocol/http/ctl/package-info.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright 2016-present Open Networking Laboratory
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 /**
- * @author onos
- *
+ * REST southbound protocol controller.
  */
 package org.onosproject.protocol.http.ctl;
diff --git a/protocols/rest/api/src/main/java/org/onosproject/protocol/http/package-info.java b/protocols/rest/api/src/main/java/org/onosproject/protocol/http/package-info.java
index c54b035..e4e6cb7 100644
--- a/protocols/rest/api/src/main/java/org/onosproject/protocol/http/package-info.java
+++ b/protocols/rest/api/src/main/java/org/onosproject/protocol/http/package-info.java
@@ -1,20 +1,20 @@
-/**
+/*
  * Copyright 2016-present Open Networking Laboratory
- *
+ * <p>
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
  */
+
 /**
- * @author onos
- *
+ * REST southbound protocol controller.
  */
 package org.onosproject.protocol.http;
diff --git a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java
index 40816a4..53ae0dc 100644
--- a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java
+++ b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java
@@ -16,16 +16,16 @@
 
 package org.onosproject.protocol.rest;
 
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Objects;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
 import org.apache.commons.lang3.StringUtils;
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Objects;
+import java.util.Optional;
 
 /**
  * Default implementation for Rest devices.
@@ -40,9 +40,21 @@
     private boolean isActive;
     private String protocol;
     private String url;
+    private boolean isProxy;
+    private final Optional<String> testUrl;
+    private final Optional<String> manufacturer;
+    private final Optional<String> hwVersion;
+    private final Optional<String> swVersion;
 
     public DefaultRestSBDevice(IpAddress ip, int port, String name, String password,
                                String protocol, String url, boolean isActive) {
+        this(ip, port, name, password, protocol, url, isActive, "", "", "", "");
+    }
+
+    public DefaultRestSBDevice(IpAddress ip, int port, String name, String password,
+                               String protocol, String url, boolean isActive, String testUrl, String manufacturer,
+                               String hwVersion,
+                               String swVersion) {
         Preconditions.checkNotNull(ip, "IP address cannot be null");
         Preconditions.checkArgument(port > 0, "Port address cannot be negative");
         Preconditions.checkNotNull(protocol, "protocol address cannot be null");
@@ -53,6 +65,21 @@
         this.isActive = isActive;
         this.protocol = protocol;
         this.url = StringUtils.isEmpty(url) ? null : url;
+        this.manufacturer = StringUtils.isEmpty(manufacturer) ?
+                Optional.empty() : Optional.ofNullable(manufacturer);
+        this.hwVersion = StringUtils.isEmpty(hwVersion) ?
+                Optional.empty() : Optional.ofNullable(hwVersion);
+        this.swVersion = StringUtils.isEmpty(swVersion) ?
+                Optional.empty() : Optional.ofNullable(swVersion);
+        this.testUrl = StringUtils.isEmpty(testUrl) ?
+                Optional.empty() : Optional.ofNullable(testUrl);
+        if (this.manufacturer.isPresent()
+                && this.hwVersion.isPresent()
+                && this.swVersion.isPresent()) {
+            this.isProxy = true;
+        } else {
+            this.isProxy = false;
+        }
     }
 
     @Override
@@ -107,14 +134,45 @@
     }
 
     @Override
+    public boolean isProxy() {
+        return isProxy;
+    }
+
+    @Override
+    public Optional<String> testUrl() {
+        return testUrl;
+    }
+
+    @Override
+    public Optional<String> manufacturer() {
+        return manufacturer;
+    }
+
+    @Override
+    public Optional<String> hwVersion() {
+        return hwVersion;
+    }
+
+    @Override
+    public Optional<String> swVersion() {
+        return swVersion;
+    }
+
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
+                .omitNullValues()
                 .add("url", url)
+                .add("testUrl", testUrl)
                 .add("protocol", protocol)
                 .add("username", username)
                 .add("port", port)
                 .add("ip", ip)
+                .add("manufacturer", manufacturer.orElse(null))
+                .add("hwVersion", hwVersion.orElse(null))
+                .add("swVersion", swVersion.orElse(null))
                 .toString();
+
     }
 
     @Override
diff --git a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBController.java b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBController.java
index 2fe3791..bca4a6c 100644
--- a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBController.java
+++ b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBController.java
@@ -16,11 +16,44 @@
 
 package org.onosproject.protocol.rest;
 
+import org.onosproject.net.DeviceId;
 import org.onosproject.protocol.http.HttpSBController;
 
+import java.util.Set;
+
 /**
  * Abstraction of an REST controller. Serves as a one stop shop for obtaining
- * Rest southbound devices and (un)register listeners.
+ * Rest southbound devices.
  */
 public interface RestSBController extends HttpSBController {
+
+    /**
+     * Add a new association between a proxied device exposed to ONOS and
+     * a REST proxy server.
+     * @param deviceId REST device identifier
+     * @param proxy REST proxy device
+     */
+    void addProxiedDevice(DeviceId deviceId, RestSBDevice proxy);
+
+    /**
+     * Remove the association between a proxied device exposed to ONOS
+     * and a REST proxy server.
+     * @param deviceId REST device identifier
+     */
+    void removeProxiedDevice(DeviceId deviceId);
+
+    /**
+     * Get all the proxied device exposed to ONOS ids under the same
+     * REST proxy server.
+     * @param proxyId REST proxy device identifier
+     * @return set of device ids under same proxy
+     */
+    Set<DeviceId> getProxiedDevices(DeviceId proxyId);
+
+    /**
+     * Get a REST proxied server given a device id.
+     * @param deviceId the id of proxied device exposed to ONOS
+     * @return the corresponding REST proxied device
+     */
+    RestSBDevice getProxySBDevice(DeviceId deviceId);
 }
diff --git a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBDevice.java b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBDevice.java
index b1f61ac..bacbbfe 100644
--- a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBDevice.java
+++ b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/RestSBDevice.java
@@ -19,6 +19,8 @@
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
 
+import java.util.Optional;
+
 /**
  * Represents an abstraction of a Rest Device in ONOS.
  */
@@ -85,4 +87,39 @@
      * @return url
      */
     String url();
+
+    /**
+     * Returns the proxy state of this device
+     * (if true, the device is proxying multiple ONOS devices).
+     * @return proxy state
+     */
+    boolean isProxy();
+
+    /**
+     * Returns the url for the REST TEST requests.
+     *
+     * @return testUrl
+     */
+    Optional<String> testUrl();
+
+    /**
+     * The manufacturer of the rest device.
+     *
+     * @return the name of the manufacturer
+     */
+    Optional<String> manufacturer();
+
+    /**
+     * The hardware version of the rest device.
+     *
+     * @return the hardware version
+     */
+    Optional<String> hwVersion();
+
+    /**
+     * The software version of rest device.
+     *
+     * @return the software version.
+     */
+    Optional<String> swVersion();
 }
diff --git a/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java b/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java
index 37dfc85..86f8020 100644
--- a/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java
+++ b/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java
@@ -16,15 +16,24 @@
 
 package org.onosproject.protocol.rest.ctl;
 
+import com.google.common.collect.ImmutableSet;
 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.Service;
+import org.onosproject.net.DeviceId;
 import org.onosproject.protocol.http.ctl.HttpSBControllerImpl;
 import org.onosproject.protocol.rest.RestSBController;
+import org.onosproject.protocol.rest.RestSBDevice;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.ws.rs.client.WebTarget;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
 /**
  * The implementation of RestSBController.
  */
@@ -35,6 +44,8 @@
     private static final Logger log =
             LoggerFactory.getLogger(RestSBControllerImpl.class);
 
+    private final Map<DeviceId, RestSBDevice> proxiedDeviceMap = new ConcurrentHashMap<>();
+
     @Activate
     public void activate() {
         log.info("Started");
@@ -47,4 +58,64 @@
         log.info("Stopped");
     }
 
+
+    @Override
+    public void addProxiedDevice(DeviceId deviceId, RestSBDevice proxy) {
+        proxiedDeviceMap.put(deviceId, proxy);
+        log.debug("Added device: {} to proxy {}", deviceId, proxy.deviceId());
+    }
+
+    @Override
+    public void removeProxiedDevice(DeviceId deviceId) {
+        log.debug("Removed device: {} from proxy {}", deviceId, proxiedDeviceMap.get(deviceId).deviceId());
+        proxiedDeviceMap.remove(deviceId);
+    }
+
+
+    @Override
+    public Set<DeviceId> getProxiedDevices(DeviceId proxyId) {
+        return ImmutableSet.copyOf(
+                proxiedDeviceMap.keySet().stream().filter(
+                        v -> proxiedDeviceMap.get(v).deviceId().equals(proxyId)
+                ).collect(Collectors.toSet()));
+    }
+
+    @Override
+    public RestSBDevice getProxySBDevice(DeviceId deviceId) {
+        return proxiedDeviceMap.get(deviceId);
+    }
+
+    @Override
+    protected WebTarget getWebTarget(DeviceId device, String request) {
+        DeviceId deviceId = device;
+        if (proxiedDeviceMap.containsKey(device)) {
+            deviceId = proxiedDeviceMap.get(device).deviceId();
+        }
+        return super.getWebTarget(deviceId, request);
+    }
+
+    @Override
+    protected String getUrlString(DeviceId id, String request) {
+        DeviceId deviceId = id;
+        if (proxiedDeviceMap.containsKey(id)) {
+            deviceId = proxiedDeviceMap.get(id).deviceId();
+        }
+
+        RestSBDevice device = super.getDeviceMap().get(deviceId);
+        if (device != null) {
+            if (device.url() != null && !device.url().isEmpty()) {
+                return device.protocol() + super.COLON + super.DOUBLESLASH + device.ip().toString() +
+                        super.COLON + device.port()
+                        + device.url() + request;
+            } else {
+                return device.protocol() + super.COLON +
+                        super.DOUBLESLASH +
+                        device.ip().toString() +
+                        super.COLON + device.port() + request;
+            }
+        } else {
+            return super.getUrlString(deviceId, request);
+        }
+
+    }
 }
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 48f6a68..93f9ca9 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
@@ -17,7 +17,6 @@
 package org.onosproject.provider.rest.device.impl;
 
 import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -34,6 +33,7 @@
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.behaviour.DevicesDiscovery;
 import org.onosproject.net.behaviour.PortDiscovery;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
@@ -46,6 +46,12 @@
 import org.onosproject.net.device.DeviceProviderRegistry;
 import org.onosproject.net.device.DeviceProviderService;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.net.driver.DefaultDriverHandler;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverData;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.protocol.rest.RestSBController;
@@ -58,6 +64,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
@@ -75,11 +82,12 @@
     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 int TEST_CONNECT_TIMEOUT = 1000;
     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 UNKNOWN = "unknown";
     private final Logger log = getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -97,10 +105,12 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DriverService driverService;
+
 
     private DeviceProviderService providerService;
-    protected static final String ISNOTNULL = "Rest device is not null";
-    private static final String UNKNOWN = "unknown";
+    private ApplicationId appId;
 
     private final ExecutorService executor =
             Executors.newFixedThreadPool(5, groupedThreads("onos/restsbprovider", "device-installer-%d", log));
@@ -116,7 +126,6 @@
                 }
             };
     private final NetworkConfigListener cfgLister = new InternalNetworkConfigListener();
-    private ApplicationId appId;
 
     private Set<DeviceId> addedDevices = new HashSet<>();
 
@@ -161,34 +170,98 @@
     public boolean isReachable(DeviceId deviceId) {
         RestSBDevice restDevice = controller.getDevice(deviceId);
         if (restDevice == null) {
-            log.debug("the requested device id: " +
-                              deviceId.toString() +
-                              "  is not associated to any REST Device");
-            return false;
+            restDevice = controller.getProxySBDevice(deviceId);
+            if (restDevice == null) {
+                log.debug("the requested device id: " +
+                                  deviceId.toString() +
+                                  "  is not associated to any REST or REST " +
+                                  "proxy Device");
+                return false;
+            }
         }
         return restDevice.isActive();
     }
 
-    private void deviceAdded(RestSBDevice nodeId) {
-        Preconditions.checkNotNull(nodeId, ISNOTNULL);
-        DeviceId deviceId = nodeId.deviceId();
-        ChassisId cid = new ChassisId();
-        String ipAddress = nodeId.ip().toString();
-        SparseAnnotations annotations = DefaultAnnotations.builder()
-                .set(IPADDRESS, ipAddress)
-                .set(AnnotationKeys.PROTOCOL, REST.toUpperCase())
-                .build();
-        DeviceDescription deviceDescription = new DefaultDeviceDescription(
-                deviceId.uri(),
-                Device.Type.SWITCH,
-                UNKNOWN, UNKNOWN,
-                UNKNOWN, UNKNOWN,
-                cid,
-                annotations);
-        nodeId.setActive(true);
-        providerService.deviceConnected(deviceId, deviceDescription);
-        checkAndUpdateDevice(deviceId);
-        addedDevices.add(deviceId);
+    private void deviceAdded(RestSBDevice restSBDev) {
+        checkNotNull(restSBDev, ISNOTNULL);
+
+        //check if the server is controlling a single or multiple devices
+        if (restSBDev.isProxy()) {
+
+            Driver driver = driverService.getDriver(restSBDev.manufacturer().get(),
+                                                    restSBDev.hwVersion().get(),
+                                                    restSBDev.swVersion().get());
+
+            if (driver != null && driver.hasBehaviour(DevicesDiscovery.class)) {
+
+                //Creates the driver to communicate with the server
+                DevicesDiscovery devicesDiscovery =
+                        devicesDiscovery(restSBDev, driver);
+                Set<DeviceId> deviceIds = devicesDiscovery.deviceIds();
+                restSBDev.setActive(true);
+                deviceIds.stream().forEach(deviceId -> {
+                    controller.addProxiedDevice(deviceId, restSBDev);
+                    DeviceDescription devDesc =
+                            devicesDiscovery.deviceDetails(deviceId);
+                    checkNotNull(devDesc,
+                                 "deviceDescription cannot be null");
+                    providerService.deviceConnected(
+                            deviceId, mergeAnn(restSBDev.deviceId(), devDesc));
+
+                    if (driver.hasBehaviour(DeviceDescriptionDiscovery.class)) {
+                        DriverHandler h = driverService.createHandler(deviceId);
+                        DeviceDescriptionDiscovery devDisc =
+                                h.behaviour(DeviceDescriptionDiscovery.class);
+                        providerService.updatePorts(deviceId,
+                                                    devDisc.discoverPortDetails());
+                    }
+
+                    checkAndUpdateDevice(deviceId);
+                    addedDevices.add(deviceId);
+                });
+            } else {
+                log.warn("Driver not found for {}", restSBDev);
+            }
+        } else {
+            DeviceId deviceId = restSBDev.deviceId();
+            ChassisId cid = new ChassisId();
+            String ipAddress = restSBDev.ip().toString();
+            SparseAnnotations annotations = DefaultAnnotations.builder()
+                    .set(IPADDRESS, ipAddress)
+                    .set(AnnotationKeys.PROTOCOL, REST.toUpperCase())
+                    .build();
+            DeviceDescription deviceDescription = new DefaultDeviceDescription(
+                    deviceId.uri(),
+                    Device.Type.SWITCH,
+                    UNKNOWN, UNKNOWN,
+                    UNKNOWN, UNKNOWN,
+                    cid,
+                    annotations);
+            restSBDev.setActive(true);
+            providerService.deviceConnected(deviceId, deviceDescription);
+            checkAndUpdateDevice(deviceId);
+            addedDevices.add(deviceId);
+        }
+    }
+
+    private DefaultDeviceDescription mergeAnn(DeviceId devId, DeviceDescription desc) {
+        return new DefaultDeviceDescription(
+                desc,
+                DefaultAnnotations.merge(
+                        DefaultAnnotations.builder()
+                                .set(AnnotationKeys.PROTOCOL, REST.toUpperCase())
+                                // The rest server added as annotation to the device
+                                .set(AnnotationKeys.REST_SERVER, devId.toString())
+                                .build(),
+                        desc.annotations()));
+    }
+
+    private DevicesDiscovery devicesDiscovery(RestSBDevice restSBDevice, Driver driver) {
+        DriverData driverData = new DefaultDriverData(driver, restSBDevice.deviceId());
+        DevicesDiscovery devicesDiscovery = driver.createBehaviour(driverData,
+                                                                   DevicesDiscovery.class);
+        devicesDiscovery.setHandler(new DefaultDriverHandler(driverData));
+        return devicesDiscovery;
     }
 
     private void checkAndUpdateDevice(DeviceId deviceId) {
@@ -200,17 +273,17 @@
             if (isReachable && deviceService.isAvailable(deviceId)) {
                 Device device = deviceService.getDevice(deviceId);
                 if (device.is(DeviceDescriptionDiscovery.class)) {
-                        DeviceDescriptionDiscovery deviceDescriptionDiscovery =
-                                device.as(DeviceDescriptionDiscovery.class);
-                        DeviceDescription updatedDeviceDescription =
-                                deviceDescriptionDiscovery.discoverDeviceDetails();
-                        if (updatedDeviceDescription != null &&
-                                !descriptionEquals(device, updatedDeviceDescription)) {
-                            providerService.deviceConnected(
-                                    deviceId,
-                                    new DefaultDeviceDescription(
-                                            updatedDeviceDescription, true,
-                                            updatedDeviceDescription.annotations()));
+                    DeviceDescriptionDiscovery deviceDescriptionDiscovery =
+                            device.as(DeviceDescriptionDiscovery.class);
+                    DeviceDescription updatedDeviceDescription =
+                            deviceDescriptionDiscovery.discoverDeviceDetails();
+                    if (updatedDeviceDescription != null &&
+                            !descriptionEquals(device, updatedDeviceDescription)) {
+                        providerService.deviceConnected(
+                                deviceId,
+                                new DefaultDeviceDescription(
+                                        updatedDeviceDescription, true,
+                                        updatedDeviceDescription.annotations()));
                         //if ports are not discovered, retry the discovery
                         if (deviceService.getPorts(deviceId).isEmpty()) {
                             discoverPorts(deviceId);
@@ -237,8 +310,12 @@
     }
 
     private void deviceRemoved(DeviceId deviceId) {
-        Preconditions.checkNotNull(deviceId, ISNOTNULL);
+        checkNotNull(deviceId, ISNOTNULL);
         providerService.deviceDisconnected(deviceId);
+        controller.getProxiedDevices(deviceId).stream().forEach(device -> {
+            controller.removeProxiedDevice(device);
+            providerService.deviceDisconnected(device);
+        });
         controller.removeDevice(deviceId);
     }
 
@@ -282,11 +359,16 @@
         }
     }
 
-    private boolean testDeviceConnection(RestSBDevice device) {
+    private boolean testDeviceConnection(RestSBDevice dev) {
         try {
-            return controller.get(device.deviceId(), "", JSON) != null;
+            if (dev.testUrl().isPresent()) {
+                return controller
+                        .get(dev.deviceId(), dev.testUrl().get(), JSON) != null;
+            }
+            return controller.get(dev.deviceId(), "", JSON) != null;
+
         } catch (ProcessingException e) {
-            log.warn("Cannot connect to device {}", device, e);
+            log.warn("Cannot connect to device {}", dev, e);
         }
         return false;
     }
diff --git a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProviderUtilities.java b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProviderUtilities.java
index 1f97bee..e92d941 100644
--- a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProviderUtilities.java
+++ b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProviderUtilities.java
@@ -43,7 +43,7 @@
      * Needs addressing for secutirty purposes.
      *
      * @throws NoSuchAlgorithmException if algorithm specified is not available
-     * @throws KeyManagementException if unable to use the key
+     * @throws KeyManagementException   if unable to use the key
      */
     //FIXME redo for security purposes.
     protected static void enableSslCert() throws NoSuchAlgorithmException, KeyManagementException {
diff --git a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestProviderConfig.java b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestProviderConfig.java
index c31f604..5e6fc96 100644
--- a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestProviderConfig.java
+++ b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestProviderConfig.java
@@ -26,7 +26,6 @@
 import org.onosproject.protocol.rest.DefaultRestSBDevice;
 import org.onosproject.protocol.rest.RestSBDevice;
 
-
 import java.util.Set;
 
 /**
@@ -43,6 +42,10 @@
     private static final String PASSWORD = "password";
     private static final String PROTOCOL = "protocol";
     private static final String URL = "url";
+    private static final String TESTURL = "testUrl";
+    private static final String MANUFACTURER = "manufacturer";
+    private static final String HWVERSION = "hwVersion";
+    private static final String SWVERSION = "swVersion";
 
     public Set<RestSBDevice> getDevicesAddresses() throws ConfigException {
         Set<RestSBDevice> devicesAddresses = Sets.newHashSet();
@@ -56,10 +59,15 @@
                 String password = node.path(PASSWORD).asText();
                 String protocol = node.path(PROTOCOL).asText();
                 String url = node.path(URL).asText();
+                String testUrl = node.path(TESTURL).asText();
+                String manufacturer = node.path(MANUFACTURER).asText();
+                String hwVersion = node.path(HWVERSION).asText();
+                String swVersion = node.path(SWVERSION).asText();
+
                 devicesAddresses.add(new DefaultRestSBDevice(ipAddr, port, username,
                                                              password, protocol,
-                                                             url, false));
-
+                                                             url, false, testUrl, manufacturer,
+                                                             hwVersion, swVersion));
             }
         } catch (IllegalArgumentException e) {
             throw new ConfigException(CONFIG_VALUE_ERROR, e);
