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 887e1dd..c991762 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
@@ -19,6 +19,8 @@
 import com.google.common.base.Preconditions;
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
+import org.onosproject.netconf.config.NetconfDeviceConfig;
+import org.onosproject.netconf.config.NetconfSshClientLib;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -26,6 +28,8 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Objects;
+import java.util.Optional;
+import java.util.OptionalInt;
 
 /**
  * Represents a Netconf device information.
@@ -43,6 +47,10 @@
     //File keyFile @deprecated 1.9.0
     @Deprecated
     private File keyFile;
+    private Optional<NetconfSshClientLib> sshClientLib;
+    private OptionalInt connectTimeoutSec;
+    private OptionalInt replyTimeoutSec;
+    private OptionalInt idleTimeoutSec;
     private DeviceId deviceId;
 
 
@@ -63,6 +71,10 @@
         this.password = password;
         this.ipAddress = ipAddress;
         this.port = port;
+        this.sshClientLib = Optional.empty();
+        this.connectTimeoutSec = OptionalInt.empty();
+        this.replyTimeoutSec = OptionalInt.empty();
+        this.idleTimeoutSec = OptionalInt.empty();
     }
 
     /**
@@ -90,6 +102,73 @@
         this.port = port;
         this.key = keyString.toCharArray();
         this.keyFile = new File(keyString);
+        this.sshClientLib = Optional.empty();
+        this.connectTimeoutSec = OptionalInt.empty();
+        this.replyTimeoutSec = OptionalInt.empty();
+        this.idleTimeoutSec = OptionalInt.empty();
+    }
+
+    /**
+     * Convenieince constructor that converts all known fields from NetCfg data.
+     * @param netconfConfig NetCf configuration
+     */
+    public NetconfDeviceInfo(NetconfDeviceConfig netconfConfig) {
+        Preconditions.checkArgument(!netconfConfig.username().isEmpty(), "Empty device name");
+        Preconditions.checkNotNull(netconfConfig.port() > 0, "Negative port");
+        Preconditions.checkNotNull(netconfConfig.ip(), "Null ip address");
+
+        this.name = netconfConfig.username();
+        this.password = netconfConfig.password();
+        this.ipAddress = netconfConfig.ip();
+        this.port = netconfConfig.port();
+        if (netconfConfig.sshKey() != null && !netconfConfig.sshKey().isEmpty()) {
+            this.key = netconfConfig.sshKey().toCharArray();
+        }
+        this.keyFile = new File(netconfConfig.sshKey());
+        if (netconfConfig.sshClient().isPresent()) {
+            this.sshClientLib = Optional.of(NetconfSshClientLib.getEnum(netconfConfig.sshClient().get()));
+        } else {
+            this.sshClientLib = Optional.empty();
+        }
+        this.connectTimeoutSec = netconfConfig.connectTimeout();
+        this.replyTimeoutSec = netconfConfig.replyTimeout();
+        this.idleTimeoutSec = netconfConfig.idleTimeout();
+    }
+
+    /**
+     * Allows the NETCONF SSH Client library to be set.
+     *
+     * @param sshClientLib An enumerated value
+     */
+    public void setSshClientLib(Optional<NetconfSshClientLib> sshClientLib) {
+        this.sshClientLib = sshClientLib;
+    }
+
+    /**
+     * Allows the NETCONF SSH session initial connect timeout to be set.
+     *
+     * @param connectTimeoutSec value in seconds
+     */
+    public void setConnectTimeoutSec(OptionalInt connectTimeoutSec) {
+        this.connectTimeoutSec = connectTimeoutSec;
+    }
+
+    /**
+     * Allows the NETCONF SSH session replies timeout to be set.
+     *
+     * @param replyTimeoutSec value in seconds
+     */
+    public void setReplyTimeoutSec(OptionalInt replyTimeoutSec) {
+        this.replyTimeoutSec = replyTimeoutSec;
+    }
+
+    /**
+     * Allows the NETCONF SSH session idle timeout to be set.
+     *
+     * @param idleTimeoutSec value in seconds
+     */
+    public void setIdleTimeoutSec(OptionalInt idleTimeoutSec) {
+        this.idleTimeoutSec = idleTimeoutSec;
     }
 
     /**
@@ -153,6 +232,42 @@
     }
 
     /**
+     * Exposes the Client library implementation.
+     *
+     * @return Enumerated value
+     */
+    public Optional<NetconfSshClientLib> sshClientLib() {
+        return sshClientLib;
+    }
+
+    /**
+     * Exposes the device specific connect timeout.
+     *
+     * @return The timeout value in seconds
+     */
+    public OptionalInt getConnectTimeoutSec() {
+        return connectTimeoutSec;
+    }
+
+    /**
+     * Exposes the device specific reply timeout.
+     *
+     * @return The timeout value in seconds
+     */
+    public OptionalInt getReplyTimeoutSec() {
+        return replyTimeoutSec;
+    }
+
+    /**
+     * Exposes the device specific idle timeout.
+     *
+     * @return The timeout value in seconds
+     */
+    public OptionalInt getIdleTimeoutSec() {
+        return idleTimeoutSec;
+    }
+
+    /**
      * Return the info about the device in a string.
      * String format: "netconf:name@ip:port"
      *
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfSession.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfSession.java
index 7a4df0b..06c8b9c 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfSession.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfSession.java
@@ -593,4 +593,28 @@
      */
     void removeDeviceOutputListener(NetconfDeviceOutputEventListener listener);
 
+    /**
+     * Read the connect timeout that this session was created with.
+     * @return timeout in seconds
+     */
+    default int timeoutConnectSec() {
+        return 0;
+    };
+
+    /**
+     * Read the reply timeout that this session was created with.
+     * @return timeout in seconds
+     */
+    default int timeoutReplySec() {
+        return 0;
+    };
+
+    /**
+     * Read the idle timeout that this session was created with.
+     * @return timeout in seconds
+     */
+    default int timeoutIdleSec() {
+        return 0;
+    };
+
 }
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 1accaec..28758b5 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
@@ -21,6 +21,10 @@
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.Config;
+
+import java.util.Optional;
+import java.util.OptionalInt;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
@@ -34,16 +38,20 @@
      */
     public static final String CONFIG_KEY = "netconf";
 
-    private static final String IP = "ip";
-    private static final String PORT = "port";
-    private static final String USERNAME = "username";
-    private static final String PASSWORD = "password";
-    private static final String SSHKEY = "sshkey";
+    public static final String IP = "ip";
+    public static final String PORT = "port";
+    public static final String USERNAME = "username";
+    public static final String PASSWORD = "password";
+    public static final String SSHKEY = "sshkey";
+    public static final String SSHCLIENT = "ssh-client";
+    public static final String CONNECT_TIMEOUT = "connect-timeout";
+    public static final String REPLY_TIMEOUT = "reply-timeout";
+    public static final String IDLE_TIMEOUT = "idle-timeout";
 
     @Override
     public boolean isValid() {
-        return hasOnlyFields(IP, PORT, USERNAME, PASSWORD, SSHKEY) &&
-                ip() != null;
+        return hasOnlyFields(IP, PORT, USERNAME, PASSWORD, SSHKEY, SSHCLIENT,
+                CONNECT_TIMEOUT, REPLY_TIMEOUT, IDLE_TIMEOUT) && ip() != null;
     }
 
     /**
@@ -92,6 +100,47 @@
     }
 
     /**
+     * Gets the NETCONF SSH Client implementation.
+     * Expecting "apache-mina" or "ethz-ssh2"
+     *
+     * @return sshClient
+     */
+    public Optional<String> sshClient() {
+        String sshClient = get(SSHCLIENT, "");
+        return (sshClient.isEmpty() ? Optional.empty() : Optional.ofNullable(sshClient));
+    }
+
+    /**
+     * Gets the connect timeout of the SSH connection.
+     *
+     * @return connectTimeout
+     */
+    public OptionalInt connectTimeout() {
+        int connectTimeout = get(CONNECT_TIMEOUT, 0);
+        return (connectTimeout == 0) ? OptionalInt.empty() : OptionalInt.of(connectTimeout);
+    }
+
+    /**
+     * Gets the reply timeout of the SSH connection.
+     *
+     * @return replyTimeout
+     */
+    public OptionalInt replyTimeout() {
+        int replyTimeout = get(REPLY_TIMEOUT, 0);
+        return (replyTimeout == 0) ? OptionalInt.empty() : OptionalInt.of(replyTimeout);
+    }
+
+    /**
+     * Gets the idle timeout of the SSH connection.
+     *
+     * @return idleTimeout
+     */
+    public OptionalInt idleTimeout() {
+        int idleTimeout = get(IDLE_TIMEOUT, 0);
+        return (idleTimeout == 0) ? OptionalInt.empty() : OptionalInt.of(idleTimeout);
+    }
+
+    /**
      * Sets the Ip for the Device.
      *
      * @param ip the ip
@@ -141,6 +190,59 @@
         return (NetconfDeviceConfig) setOrClear(SSHKEY, sshKey);
     }
 
+    /**
+     * Sets the NETCONF Ssh client implementation for the Device.
+     * Must be 'apache-mina' or 'ethz-ssh2'
+     * When specified, overrides NetconfControllerImpl.sshLibrary for this device
+     *
+     * @param sshimpl sshimpl as string
+     * @return instance for chaining
+     */
+    public NetconfDeviceConfig setSshImpl(String sshimpl) {
+        return (NetconfDeviceConfig) setOrClear(SSHCLIENT, sshimpl);
+    }
+
+    /**
+     * Sets the NETCONF Connect Timeout for the Device.
+     * This is the amount of time in seconds allowed for the SSH handshake to take place
+     * Minimum 1 second
+     * When specified, overrides NetconfControllerImpl.netconfConnectTimeout for this device
+     *
+     * @param connectTimeout connectTimeout as int
+     * @return instance for chaining
+     */
+    public NetconfDeviceConfig setConnectTimeout(Integer connectTimeout) {
+        return (NetconfDeviceConfig) setOrClear(CONNECT_TIMEOUT, connectTimeout);
+    }
+
+    /**
+     * Sets the NETCONF Reply Timeout for the Device.
+     * This is the amount of time in seconds allowed for the NETCONF Reply to a command
+     * Minimum 1 second
+     * When specified, overrides NetconfControllerImpl.netconfReplyTimeout for this device
+     *
+     * @param replyTimeout replyTimeout as int
+     * @return instance for chaining
+     */
+    public NetconfDeviceConfig setReplyTimeout(Integer replyTimeout) {
+        return (NetconfDeviceConfig) setOrClear(REPLY_TIMEOUT, replyTimeout);
+    }
+
+    /**
+     * Sets the NETCONF Idle Timeout for the Device.
+     * This is the amount of time in seconds after which the SSH connection will
+     * close if no traffic is detected
+     * Minimum 10 second
+     * When specified, overrides NetconfControllerImpl.netconfIdleTimeout for this device
+     *
+     * @param idleTimeout idleTimeout as int
+     * @return instance for chaining
+     */
+    public NetconfDeviceConfig setIdleTimeout(Integer idleTimeout) {
+        return (NetconfDeviceConfig) setOrClear(IDLE_TIMEOUT, idleTimeout);
+    }
+
+
     private Pair<String, Integer> extractIpPort() {
         // Assuming one of
         //  - netconf:ip:port
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/config/NetconfSshClientLib.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/config/NetconfSshClientLib.java
new file mode 100644
index 0000000..8ca1e93
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/config/NetconfSshClientLib.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.netconf.config;
+
+/**
+ * Enumerated list of SSH client library types.
+ */
+public enum NetconfSshClientLib {
+    APACHE_MINA("apache-mina"),
+    ETHZ_SSH2("ethz-ssh2");
+
+    private String impl;
+
+    private NetconfSshClientLib(String impl) {
+        this.impl = impl;
+    }
+
+    @Override
+    public String toString() {
+        return impl;
+    }
+
+    public static NetconfSshClientLib getEnum(String valueOf) {
+        return valueOf(valueOf.toUpperCase().replace('-', '_'));
+    }
+}
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java
index 0f98c77..a2c6a3d 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java
@@ -104,6 +104,9 @@
     private boolean subscriptionConnected = false;
     private String notificationFilterSchema = null;
 
+    private int connectTimeout;
+    private int replyTimeout;
+
 
     public NetconfSessionImpl(NetconfDeviceInfo deviceInfo) throws NetconfException {
         this.deviceInfo = deviceInfo;
@@ -112,13 +115,18 @@
         connectionActive = false;
         replies = new ConcurrentHashMap<>();
         errorReplies = new ArrayList<>();
+        connectTimeout = deviceInfo.getConnectTimeoutSec().orElse(
+                                    NetconfControllerImpl.netconfConnectTimeout);
+        replyTimeout = deviceInfo.getReplyTimeoutSec().orElse(
+                                    NetconfControllerImpl.netconfReplyTimeout);
+        log.info("Connecting to {} with timeouts C:{}, R:{}. idle=connect", deviceInfo,
+                connectTimeout, replyTimeout);
         startConnection();
     }
 
     private void startConnection() throws NetconfException {
         if (!connectionActive) {
             netconfConnection = new Connection(deviceInfo.ip().toString(), deviceInfo.port());
-            int connectTimeout = NetconfControllerImpl.netconfConnectTimeout;
 
             try {
                 netconfConnection.connect(null, 1000 * connectTimeout, 1000 * connectTimeout);
@@ -312,7 +320,6 @@
         request = formatRequestMessageId(request, messageId);
         request = formatXmlHeader(request);
         CompletableFuture<String> futureReply = request(request, messageId);
-        int replyTimeout = NetconfControllerImpl.netconfReplyTimeout;
         String rp;
         try {
             rp = futureReply.get(replyTimeout, TimeUnit.SECONDS);
@@ -622,6 +629,24 @@
     }
 
     @Override
+    public int timeoutConnectSec() {
+        return connectTimeout;
+    }
+
+    @Override
+    public int timeoutReplySec() {
+        return replyTimeout;
+    }
+
+    /**
+     * Idle timeout is not settable on ETZ_SSH - the valuse used is the connect timeout.
+     */
+    @Override
+    public int timeoutIdleSec() {
+        return connectTimeout;
+    }
+
+    @Override
     public void addDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
         streamHandler.addDeviceEventListener(listener);
     }
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 2265234..5e6d7f9 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
@@ -29,6 +29,7 @@
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.key.DeviceKey;
 import org.onosproject.net.key.DeviceKeyId;
@@ -42,6 +43,8 @@
 import org.onosproject.netconf.NetconfDeviceOutputEvent;
 import org.onosproject.netconf.NetconfDeviceOutputEventListener;
 import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.config.NetconfDeviceConfig;
+import org.onosproject.netconf.config.NetconfSshClientLib;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -55,8 +58,8 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
+import static org.onlab.util.Tools.getIntegerProperty;
 import static org.onlab.util.Tools.groupedThreads;
 
 /**
@@ -87,10 +90,10 @@
     protected static int netconfIdleTimeout = DEFAULT_IDLE_TIMEOUT_SECONDS;
 
     private static final String SSH_LIBRARY = "sshLibrary";
-    private static final String APACHE_MINA = "apache_mina";
-    @Property(name = SSH_LIBRARY, value = APACHE_MINA,
+    private static final String APACHE_MINA_STR = "apache-mina";
+    @Property(name = SSH_LIBRARY, value = APACHE_MINA_STR,
             label = "Ssh Library instead of apache_mina (i.e. ethz-ssh2")
-    protected static String sshLibrary = APACHE_MINA;
+    protected static NetconfSshClientLib sshLibrary = NetconfSshClientLib.APACHE_MINA;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ComponentConfigService cfgService;
@@ -101,6 +104,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceKeyService deviceKeyService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry netCfgService;
+
     public static final Logger log = LoggerFactory
             .getLogger(NetconfControllerImpl.class);
 
@@ -139,36 +145,24 @@
         if (context == null) {
             netconfReplyTimeout = DEFAULT_REPLY_TIMEOUT_SECONDS;
             netconfConnectTimeout = DEFAULT_CONNECT_TIMEOUT_SECONDS;
-            sshLibrary = APACHE_MINA;
+            netconfIdleTimeout = DEFAULT_IDLE_TIMEOUT_SECONDS;
+            sshLibrary = NetconfSshClientLib.APACHE_MINA;
             log.info("No component configuration");
             return;
         }
 
         Dictionary<?, ?> properties = context.getProperties();
 
-        int newNetconfReplyTimeout;
-        int newNetconfConnectTimeout;
-        int newNetconfIdleTimeout;
         String newSshLibrary;
-        try {
-            String s = get(properties, PROP_NETCONF_REPLY_TIMEOUT);
-            newNetconfReplyTimeout = isNullOrEmpty(s) ?
-                    netconfReplyTimeout : Integer.parseInt(s.trim());
 
-            s = get(properties, PROP_NETCONF_CONNECT_TIMEOUT);
-            newNetconfConnectTimeout = isNullOrEmpty(s) ?
-                    netconfConnectTimeout : Integer.parseInt(s.trim());
+        int newNetconfReplyTimeout = getIntegerProperty(
+                properties, PROP_NETCONF_REPLY_TIMEOUT, netconfReplyTimeout);
+        int newNetconfConnectTimeout = getIntegerProperty(
+                properties, PROP_NETCONF_CONNECT_TIMEOUT, netconfConnectTimeout);
+        int newNetconfIdleTimeout = getIntegerProperty(
+                properties, PROP_NETCONF_IDLE_TIMEOUT, netconfIdleTimeout);
 
-            s = get(properties, PROP_NETCONF_IDLE_TIMEOUT);
-            newNetconfIdleTimeout = isNullOrEmpty(s) ?
-                    netconfIdleTimeout : Integer.parseInt(s.trim());
-
-            newSshLibrary = get(properties, SSH_LIBRARY);
-
-        } catch (NumberFormatException e) {
-            log.warn("Component configuration had invalid value", e);
-            return;
-        }
+        newSshLibrary = get(properties, SSH_LIBRARY);
 
         if (newNetconfConnectTimeout < 0) {
             log.warn("netconfConnectTimeout is invalid - less than 0");
@@ -184,8 +178,10 @@
         netconfReplyTimeout = newNetconfReplyTimeout;
         netconfConnectTimeout = newNetconfConnectTimeout;
         netconfIdleTimeout = newNetconfIdleTimeout;
-        sshLibrary = newSshLibrary;
-        log.info("Settings: {} = {}, {} = {}, {} = {}",
+        if (newSshLibrary != null) {
+            sshLibrary = NetconfSshClientLib.getEnum(newSshLibrary);
+        }
+        log.info("Settings: {} = {}, {} = {}, {} = {}, {} = {}",
                  PROP_NETCONF_REPLY_TIMEOUT, netconfReplyTimeout,
                  PROP_NETCONF_CONNECT_TIMEOUT, netconfConnectTimeout,
                  PROP_NETCONF_IDLE_TIMEOUT, netconfIdleTimeout,
@@ -221,9 +217,17 @@
 
     @Override
     public NetconfDevice connectDevice(DeviceId deviceId) throws NetconfException {
+        NetconfDeviceConfig netCfg  = netCfgService.getConfig(
+                deviceId, NetconfDeviceConfig.class);
+        NetconfDeviceInfo deviceInfo = null;
+
         if (netconfDeviceMap.containsKey(deviceId)) {
             log.debug("Device {} is already present", deviceId);
             return netconfDeviceMap.get(deviceId);
+        } 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);
@@ -249,7 +253,6 @@
             try {
                 DeviceKey deviceKey = deviceKeyService.getDeviceKey(
                         DeviceKeyId.deviceKeyId(deviceId.toString()));
-                NetconfDeviceInfo deviceInfo = null;
                 if (deviceKey.type() == DeviceKey.Type.USERNAME_PASSWORD) {
                     UsernamePassword usernamepasswd = deviceKey.asUsernamePassword();
 
@@ -271,13 +274,13 @@
                 } else {
                     log.error("Unknown device key for device {}", deviceId);
                 }
-                NetconfDevice netconfDevicedevice = createDevice(deviceInfo);
-                netconfDevicedevice.getSession().addDeviceOutputListener(downListener);
-                return netconfDevicedevice;
             } catch (NullPointerException e) {
                 throw new NetconfException("No Device Key for device " + deviceId, e);
             }
         }
+        NetconfDevice netconfDevicedevice = createDevice(deviceInfo);
+        netconfDevicedevice.getSession().addDeviceOutputListener(downListener);
+        return netconfDevicedevice;
     }
 
     @Override
@@ -341,10 +344,15 @@
         @Override
         public NetconfDevice createNetconfDevice(NetconfDeviceInfo netconfDeviceInfo)
                 throws NetconfException {
-            if (sshLibrary.equals(ETHZ_SSH2)) {
+            if (NetconfSshClientLib.ETHZ_SSH2.equals(netconfDeviceInfo.sshClientLib()) ||
+                    NetconfSshClientLib.ETHZ_SSH2.equals(sshLibrary)) {
+                log.info("Creating NETCONF session to {} with {}",
+                            netconfDeviceInfo.name(), NetconfSshClientLib.ETHZ_SSH2);
                 return new DefaultNetconfDevice(netconfDeviceInfo,
-                                                new NetconfSessionImpl.SshNetconfSessionFactory());
+                            new NetconfSessionImpl.SshNetconfSessionFactory());
             }
+            log.info("Creating NETCONF session to {} with {}",
+                    netconfDeviceInfo.getDeviceId(), NetconfSshClientLib.APACHE_MINA);
             return new DefaultNetconfDevice(netconfDeviceInfo);
         }
     }
@@ -372,8 +380,8 @@
 
                     } catch (NetconfException e) {
                         log.error("The SSH connection with device {} couldn't be " +
-                                          "reestablished due to {}. " +
-                                          "Marking the device as unreachable", e.getMessage());
+                                "reestablished due to {}. " +
+                                "Marking the device as unreachable", e.getMessage());
                         log.debug("Complete exception: ", e);
                         removeDevice(did);
                     }
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionImpl.java
index 99ad5f2..959c807 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionImpl.java
@@ -136,6 +136,8 @@
     private final Collection<NetconfSession> children =
             new CopyOnWriteArrayList<>();
 
+    private int connectTimeout;
+    private int replyTimeout;
 
     public NetconfSessionImpl(NetconfDeviceInfo deviceInfo) throws NetconfException {
         this.deviceInfo = deviceInfo;
@@ -144,6 +146,7 @@
         connectionActive = false;
         replies = new ConcurrentHashMap<>();
         errorReplies = new ArrayList<>();
+
         startConnection();
     }
 
@@ -160,9 +163,15 @@
     }
 
     private void startConnection() throws NetconfException {
+        connectTimeout = deviceInfo.getConnectTimeoutSec().orElse(
+                                    NetconfControllerImpl.netconfConnectTimeout);
+        replyTimeout = deviceInfo.getReplyTimeoutSec().orElse(
+                                    NetconfControllerImpl.netconfReplyTimeout);
+        log.debug("Connecting to {} with timeouts C:{}, R:{}. I:connect-timeout", deviceInfo,
+                connectTimeout, replyTimeout);
+
         if (!connectionActive) {
             netconfConnection = new Connection(deviceInfo.ip().toString(), deviceInfo.port());
-            int connectTimeout = NetconfControllerImpl.netconfConnectTimeout;
 
             try {
                 netconfConnection.connect(null, 1000 * connectTimeout, 1000 * connectTimeout);
@@ -431,16 +440,18 @@
         request = formatXmlHeader(request);
         request = formatRequestMessageId(request, messageId);
         CompletableFuture<String> futureReply = request(request, messageId);
-        int replyTimeout = NetconfControllerImpl.netconfReplyTimeout;
         String rp;
         try {
+            log.debug("Sending request to NETCONF with timeout {} for {}",
+                    replyTimeout, deviceInfo.name());
             rp = futureReply.get(replyTimeout, TimeUnit.SECONDS);
             replies.remove(messageId);
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             throw new NetconfException("Interrupted waiting for reply for request" + request, e);
         } catch (TimeoutException e) {
-            throw new NetconfException("Timed out waiting for reply for request " + request, e);
+            throw new NetconfException("Timed out waiting for reply for request " +
+                    request + " after " + replyTimeout + " sec.", e);
         } catch (ExecutionException e) {
             log.warn("Closing session {} for {} due to unexpected Error", sessionID, deviceInfo, e);
 
@@ -790,7 +801,6 @@
         onosCapabilities = capabilities;
     }
 
-
     @Override
     public void addDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
         streamHandler.addDeviceEventListener(listener);
@@ -798,6 +808,24 @@
     }
 
     @Override
+    public int timeoutConnectSec() {
+        return connectTimeout;
+    }
+
+    @Override
+    public int timeoutReplySec() {
+        return replyTimeout;
+    }
+
+    /**
+     * Idle timeout is not settable on ETZ_SSH - the valuse used is the connect timeout.
+     */
+    @Override
+    public int timeoutIdleSec() {
+        return connectTimeout;
+    }
+
+    @Override
     public void removeDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
         primaryListeners.remove(listener);
         streamHandler.removeDeviceEventListener(listener);
@@ -902,4 +930,4 @@
             return new NetconfSessionImpl(netconfDeviceInfo);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImpl.java
index 0e2e3ea..6d30314 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImpl.java
@@ -143,6 +143,10 @@
     private final Collection<NetconfSession> children =
             new CopyOnWriteArrayList<>();
 
+    private int connectTimeout;
+    private int replyTimeout;
+    private int idleTimeout;
+
 
     private ClientChannel channel = null;
     private ClientSession session = null;
@@ -153,6 +157,7 @@
         this.deviceInfo = deviceInfo;
         replies = new ConcurrentHashMap<>();
         errorReplies = new ArrayList<>();
+
         startConnection();
     }
 
@@ -165,6 +170,15 @@
     }
 
     private void startConnection() throws NetconfException {
+        connectTimeout = deviceInfo.getConnectTimeoutSec().orElse(
+                                NetconfControllerImpl.netconfConnectTimeout);
+        replyTimeout = deviceInfo.getReplyTimeoutSec().orElse(
+                                NetconfControllerImpl.netconfReplyTimeout);
+        idleTimeout = deviceInfo.getIdleTimeoutSec().orElse(
+                                NetconfControllerImpl.netconfIdleTimeout);
+        log.info("Connecting to {} with timeouts C:{}, R:{}, I:{}", deviceInfo,
+                connectTimeout, replyTimeout, idleTimeout);
+
         try {
             startClient();
         } catch (IOException e) {
@@ -174,11 +188,10 @@
 
     private void startClient() throws IOException {
         client = SshClient.setUpDefaultClient();
-        int replyTimeoutSec = NetconfControllerImpl.netconfIdleTimeout;
         client.getProperties().putIfAbsent(FactoryManager.IDLE_TIMEOUT,
-                TimeUnit.SECONDS.toMillis(replyTimeoutSec));
+                TimeUnit.SECONDS.toMillis(idleTimeout));
         client.getProperties().putIfAbsent(FactoryManager.NIO2_READ_TIMEOUT,
-                TimeUnit.SECONDS.toMillis(replyTimeoutSec + 15L));
+                TimeUnit.SECONDS.toMillis(idleTimeout + 15L));
         client.start();
         client.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
         startSession();
@@ -189,7 +202,7 @@
         connectFuture = client.connect(deviceInfo.name(),
                 deviceInfo.ip().toString(),
                 deviceInfo.port())
-                .verify(NetconfControllerImpl.netconfConnectTimeout, TimeUnit.SECONDS);
+                .verify(connectTimeout, TimeUnit.SECONDS);
         session = connectFuture.getSession();
         //Using the device ssh key if possible
         if (deviceInfo.getKey() != null) {
@@ -213,7 +226,7 @@
         } else {
             session.addPasswordIdentity(deviceInfo.password());
         }
-        session.auth().verify(NetconfControllerImpl.netconfConnectTimeout, TimeUnit.SECONDS);
+        session.auth().verify(connectTimeout, TimeUnit.SECONDS);
         Set<ClientSession.ClientSessionEvent> event = session.waitFor(
                 ImmutableSet.of(ClientSession.ClientSessionEvent.WAIT_AUTH,
                         ClientSession.ClientSessionEvent.CLOSED,
@@ -239,7 +252,7 @@
     private void openChannel() throws IOException {
         channel = session.createSubsystemChannel("netconf");
         OpenFuture channelFuture = channel.open();
-        if (channelFuture.await(NetconfControllerImpl.netconfConnectTimeout, TimeUnit.SECONDS)) {
+        if (channelFuture.await(connectTimeout, TimeUnit.SECONDS)) {
             if (channelFuture.isOpened()) {
                 streamHandler = new NetconfStreamThread(channel.getInvertedOut(), channel.getInvertedIn(),
                         channel.getInvertedErr(), deviceInfo,
@@ -456,6 +469,21 @@
         return streamHandler.sendMessage(request);
     }
 
+    @Override
+    public int timeoutConnectSec() {
+        return connectTimeout;
+    }
+
+    @Override
+    public int timeoutReplySec() {
+        return replyTimeout;
+    }
+
+    @Override
+    public int timeoutIdleSec() {
+        return idleTimeout;
+    }
+
     private CompletableFuture<String> request(String request, int messageId) {
         return streamHandler.sendMessage(request, messageId);
     }
@@ -474,16 +502,18 @@
         request = formatXmlHeader(request);
         request = formatRequestMessageId(request, messageId);
         CompletableFuture<String> futureReply = request(request, messageId);
-        int replyTimeout = NetconfControllerImpl.netconfReplyTimeout;
         String rp;
         try {
+            log.debug("Sending request to NETCONF with timeout {} for {}",
+                    replyTimeout, deviceInfo.name());
             rp = futureReply.get(replyTimeout, TimeUnit.SECONDS);
             replies.remove(messageId); // Why here???
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             throw new NetconfException("Interrupted waiting for reply for request" + request, e);
         } catch (TimeoutException e) {
-            throw new NetconfException("Timed out waiting for reply for request " + request, e);
+            throw new NetconfException("Timed out waiting for reply for request " +
+                    request + " after " + replyTimeout + " sec.", e);
         } catch (ExecutionException e) {
             log.warn("Closing session {} for {} due to unexpected Error", sessionID, deviceInfo, e);
             try {
@@ -951,4 +981,4 @@
             return new NetconfSessionMinaImpl(netconfDeviceInfo);
         }
     }
-}
\ No newline at end of file
+}
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 eab21fd..ed4eabf 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
@@ -15,6 +15,8 @@
  */
 package org.onosproject.netconf.ctl.impl;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Before;
@@ -24,6 +26,12 @@
 import org.onosproject.cfg.ComponentConfigAdapter;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.Config;
+import org.onosproject.net.config.ConfigApplyDelegate;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.NetworkConfigRegistryAdapter;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.key.DeviceKeyService;
 import org.onosproject.netconf.NetconfDevice;
@@ -34,8 +42,12 @@
 import org.onosproject.netconf.NetconfDeviceOutputEventListener;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.config.NetconfDeviceConfig;
+import org.onosproject.netconf.config.NetconfSshClientLib;
 import org.osgi.service.component.ComponentContext;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.util.Dictionary;
 import java.util.Enumeration;
@@ -51,6 +63,9 @@
  * Unit tests for the Netconf controller implementation test.
  */
 public class NetconfControllerImplTest {
+    private final Set<ConfigFactory> cfgFactories = new HashSet<>();
+    private final Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
+    private boolean available = false;
 
     NetconfControllerImpl ctrl;
 
@@ -60,6 +75,9 @@
     NetconfDeviceInfo badDeviceInfo3;
     NetconfDeviceInfo deviceInfoIpV6;
 
+    NetconfDeviceConfig deviceConfig10;
+    DeviceId deviceConfig10Id;
+
     //Devices & DeviceId
     NetconfDevice device1;
     DeviceId deviceId1;
@@ -77,16 +95,25 @@
     private static final String DEVICE_1_IP = "10.10.10.11";
     private static final String DEVICE_2_IP = "10.10.10.12";
     private static final String BAD_DEVICE_IP = "10.10.10.13";
+    private static final String DEVICE_10_IP = "10.10.10.10";
     private static final String DEVICE_IPV6 = "2001:db8::1";
 
     private static final int DEVICE_1_PORT = 11;
     private static final int DEVICE_2_PORT = 12;
     private static final int BAD_DEVICE_PORT = 13;
     private static final int IPV6_DEVICE_PORT = 14;
+    private static final int DEVICE_10_PORT = 10;
+
+    private static final String DEVICE_10_USERNAME = "device10";
+    private static final String DEVICE_10_PASSWORD = "010";
+    private static final int DEVICE_10_CONNECT_TIMEOUT = 10;
+    private static final int DEVICE_10_REPLY_TIMEOUT = 11;
+    private static final int DEVICE_10_IDLE_TIMEOUT = 12;
 
     private static ComponentConfigService cfgService = new ComponentConfigAdapter();
     private static DeviceService deviceService = new NetconfDeviceServiceMock();
     private static DeviceKeyService deviceKeyService = new NetconfDeviceKeyServiceMock();
+    private final NetworkConfigRegistry netCfgService = new MockNetworkConfigRegistry();
 
     private final ComponentContext context = new MockComponentContext();
 
@@ -97,13 +124,35 @@
         ctrl.cfgService = cfgService;
         ctrl.deviceService = deviceService;
         ctrl.deviceKeyService = deviceKeyService;
+        ctrl.netCfgService = netCfgService;
 
         //Creating mock devices
         deviceInfo1 = new NetconfDeviceInfo("device1", "001", IpAddress.valueOf(DEVICE_1_IP), DEVICE_1_PORT);
         deviceInfo2 = new NetconfDeviceInfo("device2", "002", IpAddress.valueOf(DEVICE_2_IP), DEVICE_2_PORT);
+        deviceInfo2.setSshClientLib(Optional.of(NetconfSshClientLib.ETHZ_SSH2));
         badDeviceInfo3 = new NetconfDeviceInfo("device3", "003", IpAddress.valueOf(BAD_DEVICE_IP), BAD_DEVICE_PORT);
         deviceInfoIpV6 = new NetconfDeviceInfo("deviceIpv6", "004", IpAddress.valueOf(DEVICE_IPV6), IPV6_DEVICE_PORT);
 
+        deviceConfig10Id = DeviceId.deviceId("netconf:" + DEVICE_10_IP + ":" + DEVICE_10_PORT);
+        //Create a JSON entry just like Network Config accepts
+        ObjectMapper mapper = new ObjectMapper();
+        String jsonMessage = "{\n" +
+                "  \"ip\":\"" + DEVICE_10_IP + "\",\n" +
+                "  \"port\":" + DEVICE_10_PORT + ",\n" +
+                "  \"username\":\"" + DEVICE_10_USERNAME + "\",\n" +
+                "  \"password\":\"" + DEVICE_10_PASSWORD + "\",\n" +
+                "  \"" + NetconfDeviceConfig.CONNECT_TIMEOUT + "\":" + DEVICE_10_CONNECT_TIMEOUT + ",\n" +
+                "  \"" + NetconfDeviceConfig.REPLY_TIMEOUT + "\":" + DEVICE_10_REPLY_TIMEOUT + ",\n" +
+                "  \"" + NetconfDeviceConfig.IDLE_TIMEOUT + "\":" + DEVICE_10_IDLE_TIMEOUT + ",\n" +
+                "  \"" + NetconfDeviceConfig.SSHCLIENT + "\":\"" + NetconfSshClientLib.ETHZ_SSH2.toString() + "\"\n" +
+                "}";
+        InputStream jsonStream = new ByteArrayInputStream(jsonMessage.getBytes());
+        JsonNode jsonNode = mapper.readTree(jsonStream);
+        jsonStream.close();
+        ConfigApplyDelegate delegate = new MockDelegate();
+        deviceConfig10 = new NetconfDeviceConfig();
+        deviceConfig10.init(deviceConfig10Id, "netconf", jsonNode, mapper, delegate);
+
         device1 = new TestNetconfDevice(deviceInfo1);
         deviceId1 = deviceInfo1.getDeviceId();
         device2 = new TestNetconfDevice(deviceInfo2);
@@ -162,7 +211,7 @@
                      2, ctrl.netconfConnectTimeout);
         assertEquals("Incorrect NetConf session timeout",
                      1, ctrl.netconfReplyTimeout);
-        assertEquals("ethz-ssh2", ctrl.sshLibrary);
+        assertEquals("ethz-ssh2", ctrl.sshLibrary.toString());
     }
 
     /**
@@ -228,13 +277,41 @@
     }
 
     /**
+     * Check for connection by netconfDeviceConfig.
+     */
+    @Test
+    public void testConnectDeviceNetConfig10() throws Exception {
+        NetconfDevice fetchedDevice10 = ctrl.connectDevice(deviceConfig10Id);
+        assertEquals("Incorrect device fetched - ip",
+                fetchedDevice10.getDeviceInfo().ip().toString(), DEVICE_10_IP);
+        assertEquals("Incorrect device fetched - port",
+                fetchedDevice10.getDeviceInfo().port(), DEVICE_10_PORT);
+        assertEquals("Incorrect device fetched - username",
+                fetchedDevice10.getDeviceInfo().name(), DEVICE_10_USERNAME);
+        assertEquals("Incorrect device fetched - password",
+                fetchedDevice10.getDeviceInfo().password(), DEVICE_10_PASSWORD);
+        assertEquals("Incorrect device fetched - connectTimeout",
+                fetchedDevice10.getDeviceInfo().getConnectTimeoutSec().getAsInt(),
+                DEVICE_10_CONNECT_TIMEOUT);
+        assertEquals("Incorrect device fetched - replyTimeout",
+                fetchedDevice10.getDeviceInfo().getReplyTimeoutSec().getAsInt(),
+                DEVICE_10_REPLY_TIMEOUT);
+        assertEquals("Incorrect device fetched - idleTimeout",
+                fetchedDevice10.getDeviceInfo().getIdleTimeoutSec().getAsInt(),
+                DEVICE_10_IDLE_TIMEOUT);
+        assertEquals("Incorrect device fetched - sshClient",
+                fetchedDevice10.getDeviceInfo().sshClientLib().get(),
+                NetconfSshClientLib.ETHZ_SSH2);
+    }
+
+    /**
      * Check for correct device connection. In this case the device map get modified.
      */
     @Test
     public void testConnectCorrectDevice() throws Exception {
         reflectedDeviceMap.clear();
-        ctrl.connectDevice(deviceInfo1.getDeviceId());
-        ctrl.connectDevice(deviceInfo2.getDeviceId());
+        NetconfDevice device1 = ctrl.connectDevice(deviceInfo1.getDeviceId());
+        NetconfDevice device2 = ctrl.connectDevice(deviceInfo2.getDeviceId());
         assertTrue("Incorrect device connection", ctrl.getDevicesMap().containsKey(deviceId1));
         assertTrue("Incorrect device connection", ctrl.getDevicesMap().containsKey(deviceId2));
         assertEquals("Incorrect device connection", 2, ctrl.getDevicesMap().size());
@@ -416,4 +493,46 @@
             return null;
         }
     }
+
+    private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
+        NetconfDeviceConfig cfg = null;
+
+        @Override
+        public void registerConfigFactory(ConfigFactory configFactory) {
+            cfgFactories.add(configFactory);
+        }
+
+        @Override
+        public void unregisterConfigFactory(ConfigFactory configFactory) {
+            cfgFactories.remove(configFactory);
+        }
+
+        @Override
+        public void addListener(NetworkConfigListener listener) {
+            netCfgListeners.add(listener);
+        }
+
+        @Override
+        public void removeListener(NetworkConfigListener listener) {
+            netCfgListeners.remove(listener);
+        }
+
+
+        @Override
+        public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
+            DeviceId did = (DeviceId) subject;
+            if (configClass.equals(NetconfDeviceConfig.class)
+                    && did.equals(deviceConfig10Id)) {
+                return (C) deviceConfig10;
+            }
+            return null;
+        }
+
+    }
+
+    private class MockDelegate implements ConfigApplyDelegate {
+        @Override
+        public void onApply(Config configFile) {
+        }
+    }
 }
diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java
index 1b5e7fa..842bafd 100644
--- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java
@@ -16,6 +16,7 @@
 package org.onosproject.netconf.ctl.impl;
 
 import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -28,6 +29,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Optional;
+import java.util.OptionalInt;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -46,10 +48,11 @@
 import org.junit.Test;
 import org.onlab.junit.TestTools;
 import org.onlab.packet.Ip4Address;
+import org.onosproject.netconf.DatastoreId;
+import org.onosproject.netconf.NetconfController;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
-import org.onosproject.netconf.DatastoreId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -116,28 +119,36 @@
         sshServerNetconf.open();
         log.info("SSH Server opened on port {}", PORT_NUMBER);
 
-        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo(
+        NetconfController netconfCtl = new NetconfControllerImpl();
+
+        NetconfDeviceInfo deviceInfo1 = new NetconfDeviceInfo(
                 TEST_USERNAME, TEST_PASSWORD, Ip4Address.valueOf(TEST_HOSTNAME), PORT_NUMBER);
 
-        session1 = new NetconfSessionImpl(deviceInfo, ImmutableList.of("urn:ietf:params:netconf:base:1.0"));
+        session1 = new NetconfSessionImpl(deviceInfo1, ImmutableList.of("urn:ietf:params:netconf:base:1.0"));
         log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session1.getSessionId());
         assertTrue("Incorrect sessionId", !session1.getSessionId().equalsIgnoreCase("-1"));
         assertTrue("Incorrect sessionId", !session1.getSessionId().equalsIgnoreCase("0"));
         assertThat(session1.getDeviceCapabilitiesSet(), containsInAnyOrder(
                 NetconfSessionMinaImplTest.DEFAULT_CAPABILITIES.toArray()));
-        session2 = new NetconfSessionImpl(deviceInfo, ImmutableList.of("urn:ietf:params:netconf:base:1.0"));
+
+        NetconfDeviceInfo deviceInfo2 = new NetconfDeviceInfo(
+                TEST_USERNAME, TEST_PASSWORD, Ip4Address.valueOf(TEST_HOSTNAME), PORT_NUMBER);
+        deviceInfo2.setConnectTimeoutSec(OptionalInt.of(11));
+        deviceInfo2.setReplyTimeoutSec(OptionalInt.of(10));
+        deviceInfo2.setIdleTimeoutSec(OptionalInt.of(12));
+        session2 = new NetconfSessionMinaImpl(deviceInfo2, ImmutableList.of("urn:ietf:params:netconf:base:1.0"));
         log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session2.getSessionId());
         assertTrue("Incorrect sessionId", !session2.getSessionId().equalsIgnoreCase("-1"));
         assertTrue("Incorrect sessionId", !session2.getSessionId().equalsIgnoreCase("0"));
         assertThat(session2.getDeviceCapabilitiesSet(), containsInAnyOrder(
                 NetconfSessionMinaImplTest.DEFAULT_CAPABILITIES.toArray()));
-        session3 = new NetconfSessionImpl(deviceInfo);
+        session3 = new NetconfSessionImpl(deviceInfo1);
         log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session3.getSessionId());
         assertTrue("Incorrect sessionId", !session3.getSessionId().equalsIgnoreCase("-1"));
         assertTrue("Incorrect sessionId", !session3.getSessionId().equalsIgnoreCase("0"));
         assertThat(session3.getDeviceCapabilitiesSet(), containsInAnyOrder(
                 NetconfSessionMinaImplTest.DEFAULT_CAPABILITIES_1_1.toArray()));
-        session4 = new NetconfSessionImpl(deviceInfo);
+        session4 = new NetconfSessionImpl(deviceInfo1);
         log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session4.getSessionId());
         assertTrue("Incorrect sessionId", !session4.getSessionId().equalsIgnoreCase("-1"));
         assertTrue("Incorrect sessionId", !session4.getSessionId().equalsIgnoreCase("0"));
@@ -572,6 +583,18 @@
         fail("NETCONF test failed to complete.");
     }
 
+    @Test
+    public void testSessionTimeouts() {
+        assertTrue("SSH Client wrong", session1 instanceof NetconfSessionImpl);
+        assertEquals("Timeout wrong", 5, session1.timeoutConnectSec());
+        assertEquals("Timeout wrong", 5, session1.timeoutReplySec());
+        assertEquals("Timeout wrong", 5, session1.timeoutIdleSec());
+
+        assertTrue("SSH Client wrong", session2 instanceof NetconfSessionMinaImpl);
+        assertEquals("Timeout wrong", 11, session2.timeoutConnectSec());
+        assertEquals("Timeout wrong", 10, session2.timeoutReplySec());
+        assertEquals("Timeout wrong", 12, session2.timeoutIdleSec());
+    }
 
     public static String getTestHelloReply(Optional<Long> sessionId, boolean useChunkedFraming) {
         if (useChunkedFraming) {
@@ -736,4 +759,4 @@
             return session.copyConfig(target, source);
         }
     }
-}
\ No newline at end of file
+}
