diff --git a/core/api/src/main/java/org/onosproject/net/ConnectPoint.java b/core/api/src/main/java/org/onosproject/net/ConnectPoint.java
index c2959df..7a311aa 100644
--- a/core/api/src/main/java/org/onosproject/net/ConnectPoint.java
+++ b/core/api/src/main/java/org/onosproject/net/ConnectPoint.java
@@ -26,6 +26,14 @@
  */
 public class ConnectPoint implements Comparable<ConnectPoint> {
 
+    private static final String NO_SEP_SPECIFIED =
+        "Connect point not specified, Connect point must be in \"deviceUri/portNumber\" format";
+
+    private static final String SEP_NO_VALUE =
+        "Connect point separator specified, but no port number included, connect point must "
+            + " be in \"deviceUri/portNumber\" format";
+
+
     private final ElementId elementId;
     private final PortNumber portNumber;
 
@@ -116,13 +124,24 @@
      * @return a ConnectPoint based on the information in the string.
      */
     public static ConnectPoint deviceConnectPoint(String string) {
+        /*
+         * As device IDs may have a path component, we are expecting one
+         * of:
+         * - scheme:ip:port/cp
+         * - scheme:ip:port/path/cp
+         *
+         * The assumption is the last `/` will separate the device ID
+         * from the connection point number.
+         */
         checkNotNull(string);
-        String[] splitted = string.split("/");
-        checkArgument(splitted.length == 2,
-                      "Connect point must be in \"deviceUri/portNumber\" format");
+        int idx = string.lastIndexOf("/");
+        checkArgument(idx != -1, NO_SEP_SPECIFIED);
 
-        return new ConnectPoint(DeviceId.deviceId(splitted[0]),
-                                PortNumber.portNumber(splitted[1]));
+        String id = string.substring(0, idx);
+        String cp = string.substring(idx + 1);
+        checkArgument(!cp.isEmpty(), SEP_NO_VALUE);
+
+        return new ConnectPoint(DeviceId.deviceId(id), PortNumber.portNumber(cp));
     }
 
     /**
@@ -152,13 +171,24 @@
      * @return a ConnectPoint based on the information in the string.
      */
     public static ConnectPoint fromString(String string) {
+        /*
+         * As device IDs may have a path component, we are expecting one
+         * of:
+         * - scheme:ip:port/cp
+         * - scheme:ip:port/path/cp
+         *
+         * The assumption is the last `/` will separate the device ID
+         * from the connection point number.
+         */
         checkNotNull(string);
-        String[] splitted = string.split("/");
-        checkArgument(splitted.length == 2,
-                "Connect point must be in \"deviceUri/portNumber\" format");
+        int idx = string.lastIndexOf("/");
+        checkArgument(idx != -1, NO_SEP_SPECIFIED);
 
-        return new ConnectPoint(DeviceId.deviceId(splitted[0]),
-                PortNumber.fromString(splitted[1]));
+        String id = string.substring(0, idx);
+        String cp = string.substring(idx + 1);
+        checkArgument(!cp.isEmpty(), SEP_NO_VALUE);
+
+        return new ConnectPoint(DeviceId.deviceId(id), PortNumber.fromString(cp));
     }
 
     @Override
diff --git a/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java b/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java
index f823093..73dfe79 100644
--- a/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java
+++ b/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java
@@ -67,7 +67,6 @@
 
         expectDeviceParseException("");
         expectDeviceParseException("1/");
-        expectDeviceParseException("1/1/1");
         expectDeviceParseException("of:0011223344556677/word");
     }
 
@@ -90,7 +89,7 @@
     private static void expectDeviceParseException(String string) {
         try {
             ConnectPoint.deviceConnectPoint(string);
-            fail("Expected exception was not thrown");
+            fail(String.format("Expected exception was not thrown for '%s'", string));
         } catch (Exception e) {
             assertTrue(true);
         }
diff --git a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockNetconfController.java b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockNetconfController.java
index ce50558..0101b00 100644
--- a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockNetconfController.java
+++ b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockNetconfController.java
@@ -55,7 +55,7 @@
         String[] nameParts = deviceId.uri().toASCIIString().split(":");
         IpAddress ipAddress = Ip4Address.valueOf(nameParts[1]);
         int port = Integer.parseInt(nameParts[2]);
-        NetconfDeviceInfo ncdi = new NetconfDeviceInfo("mock", "mock", ipAddress, port);
+        NetconfDeviceInfo ncdi = new NetconfDeviceInfo("mock", "mock", ipAddress, port, null);
 
         mockNetconfDevice = new MockNetconfDevice(ncdi);
         devicesMap.put(deviceId, mockNetconfDevice);
@@ -96,4 +96,9 @@
         return null;
     }
 
+    @Override
+    public NetconfDevice getNetconfDevice(IpAddress ip, int port, String path) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
index 8f8fa00..041c379 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
@@ -97,4 +97,14 @@
      * @return NetconfDevice Netconf device
      */
     NetconfDevice getNetconfDevice(IpAddress ip, int port);
+
+    /**
+     * Gets a Netconf Device by node identifier.
+     *
+     * @param ip   device ip
+     * @param port device port
+     * @param path device path
+     * @return NetconfDevice Netconf device
+     */
+    NetconfDevice getNetconfDevice(IpAddress ip, int port, String path);
 }
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceInfo.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceInfo.java
index 8d16873..930e7a5 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceInfo.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceInfo.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.netconf;
 
+import org.apache.commons.lang3.tuple.Triple;
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.netconf.config.NetconfDeviceConfig;
@@ -44,6 +45,7 @@
     private String password;
     private IpAddress ipAddress;
     private int port;
+    private Optional<String> path;
     private char[] key;
     private Optional<NetconfSshClientLib> sshClientLib;
     private OptionalInt connectTimeoutSec;
@@ -51,7 +53,6 @@
     private OptionalInt idleTimeoutSec;
     private DeviceId deviceId;
 
-
     /**
      * Information for contacting the controller.
      *
@@ -59,9 +60,10 @@
      * @param password  the password for the device
      * @param ipAddress the ip address
      * @param port      the tcp port
+     * @param path      the path part
      */
     public NetconfDeviceInfo(String name, String password, IpAddress ipAddress,
-                             int port) {
+                             int port, String path) {
         checkArgument(!name.equals(""), "Empty device username");
         checkArgument(port > 0, "Negative port");
         checkNotNull(ipAddress, "Null ip address");
@@ -69,6 +71,11 @@
         this.password = password;
         this.ipAddress = ipAddress;
         this.port = port;
+        if (path == null || path.isEmpty()) {
+            this.path = Optional.empty();
+        } else {
+            this.path = Optional.of(path);
+        }
         this.sshClientLib = Optional.empty();
         this.connectTimeoutSec = OptionalInt.empty();
         this.replyTimeoutSec = OptionalInt.empty();
@@ -82,11 +89,25 @@
      * @param password  the password for the device
      * @param ipAddress the ip address
      * @param port      the tcp port
+     */
+    public NetconfDeviceInfo(String name, String password, IpAddress ipAddress,
+                             int port) {
+        this(name, password, ipAddress, port, null);
+    }
+
+    /**
+     * Information for contacting the controller.
+     *
+     * @param name      the connection type
+     * @param password  the password for the device
+     * @param ipAddress the ip address
+     * @param port      the tcp port
+     * @param path      the path part
      * @param keyString the string containing a DSA or RSA private key
      *                  of the user in OpenSSH key format
      */
     public NetconfDeviceInfo(String name, String password, IpAddress ipAddress,
-                             int port, String keyString) {
+                             int port, String path, String keyString) {
         checkArgument(!name.equals(""), "Empty device name");
         checkArgument(port > 0, "Negative port");
         checkNotNull(ipAddress, "Null ip address");
@@ -94,6 +115,7 @@
         this.password = password;
         this.ipAddress = ipAddress;
         this.port = port;
+        this.path = Optional.ofNullable(path);
         this.key = keyString.toCharArray();
         this.sshClientLib = Optional.empty();
         this.connectTimeoutSec = OptionalInt.empty();
@@ -114,6 +136,7 @@
         this.password = netconfConfig.password();
         this.ipAddress = netconfConfig.ip();
         this.port = netconfConfig.port();
+        this.path = netconfConfig.path();
         if (netconfConfig.sshKey() != null && !netconfConfig.sshKey().isEmpty()) {
             this.key = netconfConfig.sshKey().toCharArray();
         }
@@ -164,6 +187,15 @@
     }
 
     /**
+     * Allows the path aspect of the device URI to be set.
+     *
+     * @param path path aspect value
+     */
+    public void setPath(Optional<String> path) {
+        this.path = path;
+    }
+
+    /**
      * Exposes the name of the controller.
      *
      * @return String name
@@ -199,6 +231,15 @@
         return port;
     }
 
+    /*
+     * Exposes the path of the aspect.
+     *
+     * @return path aspect
+     */
+    public Optional<String> path() {
+        return path;
+    }
+
     /**
      * Exposes the key of the controller.
      *
@@ -265,7 +306,8 @@
     public DeviceId getDeviceId() {
         if (deviceId == null) {
             try {
-                deviceId = DeviceId.deviceId(new URI("netconf", ipAddress.toString() + ":" + port, null));
+                deviceId = DeviceId.deviceId(new URI("netconf", ipAddress.toString() + ":" + port +
+                            (path.isPresent() ? "/" + path.get() : ""), null));
             } catch (URISyntaxException e) {
                 throw new IllegalArgumentException("Unable to build deviceID for device " + toString(), e);
             }
@@ -275,7 +317,11 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(ipAddress, port, name);
+        if (path.isPresent()) {
+            return Objects.hash(ipAddress, port, path.get(), name);
+        } else {
+            return Objects.hash(ipAddress, port, name);
+        }
     }
 
     @Override
@@ -285,10 +331,40 @@
             if (netconfDeviceInfo.name().equals(name)
                     && netconfDeviceInfo.ip().equals(ipAddress)
                     && netconfDeviceInfo.port() == port
+                    && netconfDeviceInfo.path().equals(path)
                     && netconfDeviceInfo.password().equals(password)) {
                 return true;
             }
         }
         return false;
     }
+
+    public static Triple<String, Integer, Optional<String>> extractIpPortPath(DeviceId deviceId) {
+        /*
+         * We can expect the following formats:
+         *
+         * netconf:ip:port/path
+         * netconf:ip:port
+         */
+        String string = deviceId.toString();
+
+        /*
+         * The first ':' is the separation between the scheme and the IP.
+         *
+         * The last ':' will represent the separator between the IP and the port.
+         */
+        int first = string.indexOf(':');
+        int last = string.lastIndexOf(':');
+        String ip = string.substring(first + 1, last);
+        String port = string.substring(last + 1);
+        String path = null;
+        int pathSep = port.indexOf('/');
+        if (pathSep != -1) {
+            path = port.substring(pathSep + 1);
+            port = port.substring(0, pathSep);
+        }
+
+        return Triple.of(ip, new Integer(port),
+                (path == null || path.isEmpty() ? Optional.empty() : Optional.of(path)));
+    }
 }
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/config/NetconfDeviceConfig.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/config/NetconfDeviceConfig.java
index d9a3468..1135abd 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/config/NetconfDeviceConfig.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/config/NetconfDeviceConfig.java
@@ -17,22 +17,34 @@
 package org.onosproject.netconf.config;
 
 import com.google.common.annotations.Beta;
-import org.apache.commons.lang3.tuple.Pair;
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.Config;
+import org.slf4j.Logger;
 
 import java.util.Optional;
 import java.util.OptionalInt;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.netconf.NetconfDeviceInfo.extractIpPortPath;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Configuration for Netconf provider.
+ *
+ * The URI for a netconf device is of the format
+ *
+ * {@code netconf:<ip>[:<port>][/<path>]}
+ *
+ * The {@code ip} and {@code port} are used to create a netconf connection
+ * to the device. The {@code path} is an optional component that is not used
+ * by the default netconf driver, but is leveragable by custom drivers.
  */
 @Beta
 public class NetconfDeviceConfig extends Config<DeviceId> {
 
+    private final Logger log = getLogger(getClass());
+
     /**
      * netcfg ConfigKey.
      */
@@ -40,6 +52,7 @@
 
     public static final String IP = "ip";
     public static final String PORT = "port";
+    public static final String PATH = "path";
     public static final String USERNAME = "username";
     public static final String PASSWORD = "password";
     public static final String SSHKEY = "sshkey";
@@ -50,7 +63,7 @@
 
     @Override
     public boolean isValid() {
-        return hasOnlyFields(IP, PORT, USERNAME, PASSWORD, SSHKEY, SSHCLIENT,
+        return hasOnlyFields(IP, PORT, PATH, USERNAME, PASSWORD, SSHKEY, SSHCLIENT,
                 CONNECT_TIMEOUT, REPLY_TIMEOUT, IDLE_TIMEOUT) && ip() != null;
     }
 
@@ -60,7 +73,7 @@
      * @return ip
      */
     public IpAddress ip() {
-        return IpAddress.valueOf(get(IP, checkNotNull(extractIpPort()).getKey()));
+        return IpAddress.valueOf(get(IP, checkNotNull(extractIpPortPath(subject)).getLeft()));
     }
 
     /**
@@ -69,7 +82,20 @@
      * @return port
      */
     public int port() {
-        return get(PORT, checkNotNull(extractIpPort()).getValue());
+        return get(PORT, checkNotNull(extractIpPortPath(subject)).getMiddle());
+    }
+
+    /**
+     * Gets the path of the NETCONF device.
+     *
+     * @return path
+     */
+    public Optional<String> path() {
+        String val = get(PATH, "");
+        if (val.isEmpty()) {
+            return extractIpPortPath(subject).getRight();
+        }
+        return Optional.ofNullable(val);
     }
 
     /**
@@ -161,6 +187,16 @@
     }
 
     /**
+     * Sets the path for the device.
+     *
+     * @param path the path
+     * @return instance for chaining
+     */
+    public NetconfDeviceConfig setPath(String path) {
+        return (NetconfDeviceConfig) setOrClear(PATH, path);
+    }
+
+    /**
      * Sets the username for the Device.
      *
      * @param username username
@@ -241,22 +277,4 @@
     public NetconfDeviceConfig setIdleTimeout(Integer idleTimeout) {
         return (NetconfDeviceConfig) setOrClear(IDLE_TIMEOUT, idleTimeout);
     }
-
-
-    private Pair<String, Integer> extractIpPort() {
-        // Assuming one of
-        //  - netconf:ip:port
-        //  - netconf:ip
-
-        // foo:schemespecifcpart
-        String info = subject.uri().getSchemeSpecificPart();
-        int portSeparator = info.lastIndexOf(':');
-        if (portSeparator == -1) {
-            // assume default port
-            return Pair.of(info, 830);
-        }
-        String ip = info.substring(0, portSeparator);
-        int port = Integer.parseInt(info.substring(portSeparator + 1));
-        return Pair.of(ip, port);
-    }
 }
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
index 0395dee..10eabd9 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.netconf.ctl.impl;
 
+import org.apache.commons.lang3.tuple.Triple;
+
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cfg.ComponentConfigService;
@@ -49,9 +51,9 @@
 import org.slf4j.LoggerFactory;
 
 import java.security.Security;
-import java.util.Arrays;
 import java.util.Dictionary;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
@@ -62,6 +64,7 @@
 import static org.onlab.util.Tools.getIntegerProperty;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.netconf.ctl.impl.OsgiPropertyConstants.*;
+import static org.onosproject.netconf.NetconfDeviceInfo.extractIpPortPath;
 
 /**
  * The implementation of NetconfController.
@@ -204,13 +207,15 @@
     }
 
     @Override
+    public NetconfDevice getNetconfDevice(IpAddress ip, int port, String path) {
+        return getNetconfDevice(DeviceId.deviceId(
+                    String.format("netconf:%s:%d%s",
+                        ip.toString(), port, (path != null && !path.isEmpty() ? "/" + path : ""))));
+    }
+
+    @Override
     public NetconfDevice getNetconfDevice(IpAddress ip, int port) {
-        for (DeviceId info : netconfDeviceMap.keySet()) {
-            if (info.uri().getSchemeSpecificPart().equals(ip.toString() + ":" + port)) {
-                return netconfDeviceMap.get(info);
-            }
-        }
-        return null;
+        return getNetconfDevice(ip, port, null);
     }
 
     @Override
@@ -225,28 +230,19 @@
         } else if (netCfg != null) {
             log.debug("Device {} is present in NetworkConfig", deviceId);
             deviceInfo = new NetconfDeviceInfo(netCfg);
-
         } else {
             log.debug("Creating NETCONF device {}", deviceId);
             Device device = deviceService.getDevice(deviceId);
-            String ip;
+            String ip, path = null;
             int port;
             if (device != null) {
                 ip = device.annotations().value("ipaddress");
                 port = Integer.parseInt(device.annotations().value("port"));
             } else {
-                String[] info = deviceId.toString().split(":");
-                if (info.length == 3) {
-                    ip = info[1];
-                    port = Integer.parseInt(info[2]);
-                } else {
-                    ip = Arrays.asList(info).stream().filter(el -> !el.equals(info[0])
-                            && !el.equals(info[info.length - 1]))
-                            .reduce((t, u) -> t + ":" + u)
-                            .get();
-                    log.debug("ip v6 {}", ip);
-                    port = Integer.parseInt(info[info.length - 1]);
-                }
+                Triple<String, Integer, Optional<String>> info = extractIpPortPath(deviceId);
+                ip = info.getLeft();
+                port = info.getMiddle();
+                path = (info.getRight().isPresent() ? info.getRight().get() : null);
             }
             try {
                 DeviceKey deviceKey = deviceKeyService.getDeviceKey(
@@ -257,7 +253,8 @@
                     deviceInfo = new NetconfDeviceInfo(usernamepasswd.username(),
                                                        usernamepasswd.password(),
                                                        IpAddress.valueOf(ip),
-                                                       port);
+                                                       port,
+                                                       path);
 
                 } else if (deviceKey.type() == DeviceKey.Type.SSL_KEY) {
                     String username = deviceKey.annotations().value(AnnotationKeys.USERNAME);
@@ -268,6 +265,7 @@
                                                        password,
                                                        IpAddress.valueOf(ip),
                                                        port,
+                                                       path,
                                                        sshkey);
                 } else {
                     log.error("Unknown device key for device {}", deviceId);
diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
index 44011f1..e503584 100644
--- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
@@ -322,7 +322,9 @@
         reflectedDeviceMap.clear();
         NetconfDevice device1 = ctrl.connectDevice(deviceInfo1.getDeviceId());
         NetconfDevice device2 = ctrl.connectDevice(deviceInfo2.getDeviceId());
-        assertTrue("Incorrect device connection", ctrl.getDevicesMap().containsKey(deviceId1));
+        assertTrue(String.format("Incorrect device connection from '%s' we get '%s' contains '%s'",
+                    deviceInfo1, ctrl.getDevicesMap(), deviceId1),
+                ctrl.getDevicesMap().containsKey(deviceId1));
         assertTrue("Incorrect device connection", ctrl.getDevicesMap().containsKey(deviceId2));
         assertEquals("Incorrect device connection", 2, ctrl.getDevicesMap().size());
     }
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
index e60e285..fe5cda9 100644
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -19,6 +19,7 @@
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.Striped;
+import org.apache.commons.lang3.tuple.Triple;
 import org.onlab.packet.ChassisId;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -75,7 +76,6 @@
 import java.net.Socket;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Map;
@@ -95,6 +95,7 @@
 import static java.util.concurrent.Executors.newScheduledThreadPool;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.provider.netconf.device.impl.OsgiPropertyConstants.*;
+import static org.onosproject.netconf.NetconfDeviceInfo.extractIpPortPath;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -143,6 +144,7 @@
     private static final String IPADDRESS = "ipaddress";
     private static final String NETCONF = "netconf";
     private static final String PORT = "port";
+    private static final String PATH = "path";
     private static final int CORE_POOL_SIZE = 10;
 
     /** Configure poll frequency for port status and statistics; default is 30 sec. */
@@ -313,18 +315,9 @@
             ip = device.annotations().value(IPADDRESS);
             port = Integer.parseInt(device.annotations().value(PORT));
         } else {
-            String[] info = deviceId.toString().split(":");
-            if (info.length == 3) {
-                ip = info[1];
-                port = Integer.parseInt(info[2]);
-            } else {
-                ip = Arrays.asList(info).stream().filter(el -> !el.equals(info[0])
-                        && !el.equals(info[info.length - 1]))
-                        .reduce((t, u) -> t + ":" + u)
-                        .get();
-                log.debug("ip v6 {}", ip);
-                port = Integer.parseInt(info[info.length - 1]);
-            }
+            Triple<String, Integer, Optional<String>> info = extractIpPortPath(deviceId);
+            ip = info.getLeft();
+            port = info.getMiddle();
         }
         // FIXME just opening TCP session probably is not the appropriate
         // method to test reachability.
@@ -438,8 +431,10 @@
             return;
         }
         DeviceDescription deviceDescription = createDeviceRepresentation(deviceId, config);
-        log.debug("Connecting NETCONF device {}, on {}:{} with username {}",
-                  deviceId, config.ip(), config.port(), config.username());
+        log.debug("Connecting NETCONF device {}, on {}:{}{} with username {}",
+                  deviceId, config.ip(), config.port(),
+                 (config.path().isPresent() ? "/" + config.path().get() : ""),
+                 config.username());
         storeDeviceKey(config.sshKey(), config.username(), config.password(), deviceId);
         retriedPortDiscoveryMap.put(deviceId, new AtomicInteger(0));
         if (deviceService.getDevice(deviceId) == null) {
@@ -543,19 +538,22 @@
         //Netconf configuration object
         ChassisId cid = new ChassisId();
         String ipAddress = config.ip().toString();
-        SparseAnnotations annotations = DefaultAnnotations.builder()
+        DefaultAnnotations.Builder annotations = DefaultAnnotations.builder()
                 .set(IPADDRESS, ipAddress)
                 .set(PORT, String.valueOf(config.port()))
                 .set(AnnotationKeys.PROTOCOL, SCHEME_NAME.toUpperCase())
-                .set(AnnotationKeys.PROVIDER_MARK_ONLINE, String.valueOf(true))
-                .build();
+                .set(AnnotationKeys.PROVIDER_MARK_ONLINE, String.valueOf(true));
+        if (config.path().isPresent()) {
+            annotations.set(PATH, config.path().get());
+        }
+
         return new DefaultDeviceDescription(
                 deviceId.uri(),
                 Device.Type.SWITCH,
                 UNKNOWN, UNKNOWN,
                 UNKNOWN, UNKNOWN,
                 cid, false,
-                annotations);
+                annotations.build());
     }
 
     private void storeDeviceKey(String sshKey, String username, String password, DeviceId deviceId) {
@@ -616,14 +614,16 @@
      *
      * @param ip   IP address
      * @param port port number
+     * @param path path aspect
      * @return DeviceId
      */
-    public DeviceId getDeviceId(String ip, int port) {
+    public DeviceId getDeviceId(String ip, int port, Optional<String> path) {
         try {
-            return DeviceId.deviceId(new URI(NETCONF, ip + ":" + port, null));
+            return DeviceId.deviceId(new URI(NETCONF, ip + ":" + port +
+                        (path.isPresent() ? "/" + path : ""), null));
         } catch (URISyntaxException e) {
             throw new IllegalArgumentException("Unable to build deviceID for device "
-                                                       + ip + ":" + port, e);
+                    + ip + ":" + port + (path.isPresent() ? "/" + path : ""), e);
         }
     }
 
@@ -650,7 +650,6 @@
      */
     private class InternalNetworkConfigListener implements NetworkConfigListener {
 
-
         @Override
         public void event(NetworkConfigEvent event) {
             if (event.configClass().equals(NetconfDeviceConfig.class)) {
diff --git a/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfControllerAdapter.java b/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfControllerAdapter.java
index 8714dd8..51410f5 100644
--- a/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfControllerAdapter.java
+++ b/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfControllerAdapter.java
@@ -75,4 +75,9 @@
     public NetconfDevice getNetconfDevice(IpAddress ip, int port) {
         return null;
     }
+
+    @Override
+    public NetconfDevice getNetconfDevice(IpAddress ip, int port, String path) {
+        return null;
+    }
 }
