diff --git a/.gitignore b/.gitignore
index 87013fb9759b94a2b27f6bb1d855638e3dbebeba..b8d9663f4b14a7e5419d947a17977e404fb5633f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,5 @@ docs/build/doctrees/
 .DS_Store
 */.DS_Store
 
+tests/cisco3-out.txt
+tests/test.log
diff --git a/.travis.yml b/.travis.yml
index a0ec6c3ebd6582b5c0cb5c1b4aabd64015149d60..826a27ddbcc81ce56d6dcdaed9c51a4dccb5b23a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,17 +1,27 @@
 ---
 language: python
 python:
-  - "2.7"
-  - "3.5"
   - "3.6"
   - "3.7"
+  - "3.8-dev"
+  - "nightly"
+stages:
+  - lint
+  - test
 matrix:
   include:
-  - python: 3.6
-    env: TOXENV=black
-  - python: 3.6
-    env: TOXENV=pylama
-install: 
-  - pip install tox==3.13.1 tox-travis==0.12
-script: 
+    - stage: lint
+      name: Black
+      python: 3.6
+      env: TOXENV=black
+    - stage: lint
+      name: Pylama
+      python: 3.6
+      env: TOXENV=pylama
+  allow_failures:
+    - python: 3.8-dev
+    - python: nightly
+install:
+  - pip install tox==3.13.2 tox-travis==0.12
+script:
   - tox
diff --git a/MANIFEST.in b/MANIFEST.in
index a2cde7e16c6a83cd846a11298e270315934b4c1a..0874c6ddf5608b9c2538ce62abebfdc703b8478e 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,4 +1,5 @@
 include *.md
 include requirements.txt
 include LICENSE
+recursive-include tests/ *
 
diff --git a/PLATFORMS.md b/PLATFORMS.md
index ce7516cf79005c6ae0e6e0bfdc3d88f2fa37e34b..a45aa4ccc4f61a798623a0a19586ad57a0e03d35 100644
--- a/PLATFORMS.md
+++ b/PLATFORMS.md
@@ -30,6 +30,7 @@
 - HPE Comware7
 - Huawei
 - IP Infusion OcNOS
+- Juniper ScreenOS
 - Mellanox
 - MikroTik RouterOS
 - MikroTik SwitchOS
@@ -38,6 +39,7 @@
 - Palo Alto PAN-OS
 - Pluribus
 - Ruckus ICX/FastIron
+- Ruijie Networks
 - Ubiquiti EdgeSwitch
 - Vyatta VyOS
 
diff --git a/README.md b/README.md
index 6545acfe66774e1ae72c777bd35e209563ea293c..3fc64774c92478799381275018e9e4557699e493 100644
--- a/README.md
+++ b/README.md
@@ -182,7 +182,7 @@ For all code contributions, please ensure that you have ran `black` against the
 
 If you find an issue with Netmiko, then you can open an issue on this projects issue page here: [https://github.com/ktbyers/netmiko/issues](https://github.com/ktbyers/netmiko/issues). Please make sure you've read through the common issues and examples prior to opening an issue. Please only open issues for bugs, feature requests, or other topics related to development of Netmiko. If you simply have a question, join us on Slack...
 
-If you have questions or would like to discuss Netmiko, a #netmiko channel exists in [this Slack](https://pynet.slack.com) workspace. To join, use [this invitation](https://join.slack.com/t/pynet/shared_invite/enQtNTA2MDI3NjU0MTM0LTQ5MjExNGNlNWIzMmRhOTZmNmZkNDA2Nzk4Y2Q1Y2RkMWNhZGEzM2Y5MjI0NDYxODkzM2M0ODIwYzFkMzVmZGY). Once you have entered the workspace, then you can join the #netmiko channel.
+If you have questions or would like to discuss Netmiko, a #netmiko channel exists in [this Slack](https://pynet.slack.com) workspace. To join, use [this invitation](https://join.slack.com/t/pynet/shared_invite/enQtNTA2MDI3NjU0MTM0LTIyZDdhMTBlOWNmNDJhNjkxZTEyMDg3NTRkOWIxMTUwOTAzYmQ0ZjMwMGMyNTM4N2E1YzA3YWQ1MWFiOWM1YzU). Once you have entered the workspace, then you can join the #netmiko channel.
 
 
 ---
diff --git a/docs/netmiko/a10/a10_ssh.html b/docs/netmiko/a10/a10_ssh.html
index d0fd1092819ee040c16aae52484c1476d4868a94..aa7a6c4dfac96f37e2224f340b7c444f03083428 100644
--- a/docs/netmiko/a10/a10_ssh.html
+++ b/docs/netmiko/a10/a10_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.a10.a10_ssh API documentation</title>
 <meta name="description" content="A10 support." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;A10 support.&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -62,7 +61,7 @@ class A10SSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.a10.a10_ssh.A10SSH"><code class="flex name class">
 <span>class <span class="ident">A10SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>A10 support.</p>
@@ -182,6 +181,10 @@ class A10SSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -324,7 +327,7 @@ class A10SSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/a10/index.html b/docs/netmiko/a10/index.html
index fd8e9d33bd7d172d140996a79e4cfd09c92c55bb..16a50412b6cabaaaa5a166094b7f06bfee2205b8 100644
--- a/docs/netmiko/a10/index.html
+++ b/docs/netmiko/a10/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.a10 API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.a10.a10_ssh import A10SSH
+<pre><code class="python">from netmiko.a10.a10_ssh import A10SSH
 
 __all__ = [&#34;A10SSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;A10SSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.a10.A10SSH"><code class="flex name class">
 <span>class <span class="ident">A10SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>A10 support.</p>
@@ -166,6 +165,10 @@ __all__ = [&#34;A10SSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -313,7 +316,7 @@ __all__ = [&#34;A10SSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/accedian/accedian_ssh.html b/docs/netmiko/accedian/accedian_ssh.html
index 90c10bc49bcb17f09e36fe091fba4a8074b7c97b..9c0a0bd931b9d5cdba3cbf7911e80240e2c708e0 100644
--- a/docs/netmiko/accedian/accedian_ssh.html
+++ b/docs/netmiko/accedian/accedian_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.accedian.accedian_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -60,7 +59,7 @@ class AccedianSSH(CiscoSSHConnection):
         self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=2
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        super(AccedianSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -83,7 +82,7 @@ class AccedianSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.accedian.accedian_ssh.AccedianSSH"><code class="flex name class">
 <span>class <span class="ident">AccedianSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -203,6 +202,10 @@ class AccedianSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -239,7 +242,7 @@ class AccedianSSH(CiscoSSHConnection):
         self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=2
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        super(AccedianSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -317,7 +320,7 @@ class AccedianSSH(CiscoSSHConnection):
     self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=2
 ):
     &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-    super(AccedianSSH, self).set_base_prompt(
+    super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -401,7 +404,7 @@ class AccedianSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/accedian/index.html b/docs/netmiko/accedian/index.html
index aea7b21504fa1b5289bd572b3d0764d176491606..b1d16b1290b4dd315b9a9a3184e47b480ba286c2 100644
--- a/docs/netmiko/accedian/index.html
+++ b/docs/netmiko/accedian/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.accedian API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -45,7 +45,7 @@ __all__ = [&#34;AccedianSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.accedian.AccedianSSH"><code class="flex name class">
 <span>class <span class="ident">AccedianSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -165,6 +165,10 @@ __all__ = [&#34;AccedianSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -201,7 +205,7 @@ __all__ = [&#34;AccedianSSH&#34;]</code></pre>
         self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=2
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        super(AccedianSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -279,7 +283,7 @@ __all__ = [&#34;AccedianSSH&#34;]</code></pre>
     self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=2
 ):
     &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-    super(AccedianSSH, self).set_base_prompt(
+    super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -368,7 +372,7 @@ __all__ = [&#34;AccedianSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/alcatel/alcatel_aos_ssh.html b/docs/netmiko/alcatel/alcatel_aos_ssh.html
index 2097da0d7aef24e0f120f3673ac6b1bf30a115a9..b79843822526cccf642989ef7c2feafad91b7f03 100644
--- a/docs/netmiko/alcatel/alcatel_aos_ssh.html
+++ b/docs/netmiko/alcatel/alcatel_aos_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.alcatel.alcatel_aos_ssh API documentation</title>
 <meta name="description" content="Alcatel-Lucent Enterprise AOS support (AOS6 and AOS8)." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,8 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Alcatel-Lucent Enterprise AOS support (AOS6 and AOS8).&#34;&#34;&#34;
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -69,7 +67,7 @@ class AlcatelAosSSH(CiscoSSHConnection):
         self, cmd=&#34;write memory flash-synchro&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(AlcatelAosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -85,7 +83,7 @@ class AlcatelAosSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.alcatel.alcatel_aos_ssh.AlcatelAosSSH"><code class="flex name class">
 <span>class <span class="ident">AlcatelAosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Alcatel-Lucent Enterprise AOS support (AOS6 and AOS8).</p>
@@ -205,6 +203,10 @@ class AlcatelAosSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -247,7 +249,7 @@ class AlcatelAosSSH(CiscoSSHConnection):
         self, cmd=&#34;write memory flash-synchro&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(AlcatelAosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -342,7 +344,7 @@ class AlcatelAosSSH(CiscoSSHConnection):
     self, cmd=&#34;write memory flash-synchro&#34;, confirm=False, confirm_response=&#34;&#34;
 ):
     &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-    return super(AlcatelAosSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -423,7 +425,7 @@ class AlcatelAosSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/alcatel/index.html b/docs/netmiko/alcatel/index.html
index 7515e99716e24a5e9fdc4039bb519078da975087..7f35988da4054e24afa618a9fdbedf0b7ba5fa0a 100644
--- a/docs/netmiko/alcatel/index.html
+++ b/docs/netmiko/alcatel/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.alcatel API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,11 +22,9 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.alcatel.alcatel_sros_ssh import AlcatelSrosSSH
-from netmiko.alcatel.alcatel_aos_ssh import AlcatelAosSSH
+<pre><code class="python">from netmiko.alcatel.alcatel_aos_ssh import AlcatelAosSSH
 
-__all__ = [&#34;AlcatelSrosSSH&#34;, &#34;AlcatelAosSSH&#34;]</code></pre>
+__all__ = [&#34;AlcatelAosSSH&#34;]</code></pre>
 </details>
 </section>
 <section>
@@ -36,10 +34,6 @@ __all__ = [&#34;AlcatelSrosSSH&#34;, &#34;AlcatelAosSSH&#34;]</code></pre>
 <dd>
 <section class="desc"><p>Alcatel-Lucent Enterprise AOS support (AOS6 and AOS8).</p></section>
 </dd>
-<dt><code class="name"><a title="netmiko.alcatel.alcatel_sros_ssh" href="alcatel_sros_ssh.html">netmiko.alcatel.alcatel_sros_ssh</a></code></dt>
-<dd>
-<section class="desc"><p>Alcatel-Lucent SROS support.</p></section>
-</dd>
 </dl>
 </section>
 <section>
@@ -51,7 +45,7 @@ __all__ = [&#34;AlcatelSrosSSH&#34;, &#34;AlcatelAosSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.alcatel.AlcatelAosSSH"><code class="flex name class">
 <span>class <span class="ident">AlcatelAosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Alcatel-Lucent Enterprise AOS support (AOS6 and AOS8).</p>
@@ -171,6 +165,10 @@ __all__ = [&#34;AlcatelSrosSSH&#34;, &#34;AlcatelAosSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -213,7 +211,7 @@ __all__ = [&#34;AlcatelSrosSSH&#34;, &#34;AlcatelAosSSH&#34;]</code></pre>
         self, cmd=&#34;write memory flash-synchro&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(AlcatelAosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -308,7 +306,7 @@ __all__ = [&#34;AlcatelSrosSSH&#34;, &#34;AlcatelAosSSH&#34;]</code></pre>
     self, cmd=&#34;write memory flash-synchro&#34;, confirm=False, confirm_response=&#34;&#34;
 ):
     &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-    return super(AlcatelAosSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -355,361 +353,6 @@ __all__ = [&#34;AlcatelSrosSSH&#34;, &#34;AlcatelAosSSH&#34;]</code></pre>
 </li>
 </ul>
 </dd>
-<dt id="netmiko.alcatel.AlcatelSrosSSH"><code class="flex name class">
-<span>class <span class="ident">AlcatelSrosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Alcatel-Lucent SROS support.</p>
-<pre><code>    Initialize attributes for establishing connection to target device.
-
-    :param ip: IP address of target device. Not required if `host` is
-        provided.
-    :type ip: str
-
-    :param host: Hostname of target device. Not required if `ip` is
-            provided.
-    :type host: str
-
-    :param username: Username to authenticate against target device if
-            required.
-    :type username: str
-
-    :param password: Password to authenticate against target device if
-            required.
-    :type password: str
-
-    :param secret: The enable password if target device requires one.
-    :type secret: str
-
-    :param port: The destination port used to connect to the target
-            device.
-    :type port: int or None
-
-    :param device_type: Class selection based on device type.
-    :type device_type: str
-
-    :param verbose: Enable additional messages to standard output.
-    :type verbose: bool
-
-    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
-    :type global_delay_factor: int
-
-    :param use_keys: Connect to target device using SSH keys.
-    :type use_keys: bool
-
-    :param key_file: Filename path of the SSH key file to use.
-    :type key_file: str
-
-    :param pkey: SSH key object to use.
-    :type pkey: paramiko.PKey
-
-    :param passphrase: Passphrase to use for encrypted key; password will be used for key
-            decryption if not specified.
-    :type passphrase: str
-
-    :param allow_agent: Enable use of SSH key-agent.
-    :type allow_agent: bool
-
-    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
-            means unknown SSH host keys will be accepted).
-    :type ssh_strict: bool
-
-    :param system_host_keys: Load host keys from the users known_hosts file.
-    :type system_host_keys: bool
-    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
-            alt_key_file.
-    :type alt_host_keys: bool
-
-    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
-    :type alt_key_file: str
-
-    :param ssh_config_file: File name of OpenSSH configuration file.
-    :type ssh_config_file: str
-
-    :param timeout: Connection timeout.
-    :type timeout: float
-
-    :param session_timeout: Set a timeout for parallel requests.
-    :type session_timeout: float
-
-    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
-    :type auth_timeout: float
-
-    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
-    :type banner_timeout: float
-
-    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
-            Currently defaults to 0, for backwards compatibility (it will not attempt
-            to keep the connection alive).
-    :type keepalive: int
-
-    :param default_enter: Character(s) to send to correspond to enter key (default:
-</code></pre>
-<p>).
-:type default_enter: str</p>
-<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
-            enter key (default:
-</code></pre>
-<p>)
-:type response_return: str</p>
-<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
-            to select smallest of global and specific. Sets default global_delay_factor to .1
-            (default: False)
-    :type fast_cli: boolean
-
-    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
-    :type session_log: str
-
-    :param session_log_record_writes: The session log generally only records channel reads due
-            to eliminate command duplication due to command echo. You can enable this if you
-            want to record both channel reads and channel writes in the log (default: False).
-    :type session_log_record_writes: boolean
-
-    :param session_log_file_mode: "write" or "append" for session_log file mode
-            (default: "write")
-    :type session_log_file_mode: str
-
-    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
-            (default: False)
-    :type allow_auto_change: bool
-
-    :param encoding: Encoding to be used when writing bytes to the output channel.
-            (default: ascii)
-    :type encoding: str
-</code></pre></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">class AlcatelSrosSSH(CiscoSSHConnection):
-    &#34;&#34;&#34;Alcatel-Lucent SROS support.&#34;&#34;&#34;
-
-    def session_preparation(self):
-        self._test_channel_read()
-        self.set_base_prompt()
-        self.disable_paging(command=&#34;environment no more&#34;)
-        # Clear the read buffer
-        time.sleep(0.3 * self.global_delay_factor)
-        self.clear_buffer()
-
-    def set_base_prompt(self, *args, **kwargs):
-        &#34;&#34;&#34;Remove the &gt; when navigating into the different config level.&#34;&#34;&#34;
-        cur_base_prompt = super(AlcatelSrosSSH, self).set_base_prompt(*args, **kwargs)
-        match = re.search(r&#34;(.*)(&gt;.*)*#&#34;, cur_base_prompt)
-        if match:
-            # strip off &gt;... from base_prompt
-            self.base_prompt = match.group(1)
-            return self.base_prompt
-
-    def enable(self, cmd=&#34;enable-admin&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
-        &#34;&#34;&#34;Enter enable mode.&#34;&#34;&#34;
-        return super(AlcatelSrosSSH, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
-
-    def check_enable_mode(self, check_string=&#34;CLI Already in admin mode&#34;):
-        &#34;&#34;&#34;Check whether we are in enable-admin mode.
-         SROS requires us to do this:
-        *A:HOSTNAME# enable-admin
-        MINOR: CLI Already in admin mode.
-        *A:HOSTNAME#
-        *A:HOSTNAME# enable-admin
-        Password:
-        MINOR: CLI Invalid password.
-        *A:HOSTNAME#
-        &#34;&#34;&#34;
-        output = self.send_command_timing(&#34;enable-admin&#34;)
-        if re.search(r&#34;ssword&#34;, output):
-            # Just hit enter as we don&#39;t actually want to enter enable here
-            self.write_channel(self.normalize_cmd(self.RETURN))
-            self.read_until_prompt()
-            return False
-        elif check_string in output:
-            return True
-        raise ValueError(&#34;Unexpected response in check_enable_mode() method&#34;)
-
-    def exit_enable_mode(self, exit_command=&#34;&#34;):
-        &#34;&#34;&#34;No corresponding exit of enable mode on SROS.&#34;&#34;&#34;
-        pass
-
-    def config_mode(self, config_command=&#34;configure&#34;, pattern=&#34;#&#34;):
-        &#34;&#34;&#34; Enter into configuration mode on SROS device.&#34;&#34;&#34;
-        return super(AlcatelSrosSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
-
-    def exit_config_mode(self, exit_config=&#34;exit all&#34;, pattern=&#34;#&#34;):
-        &#34;&#34;&#34; Exit from configuration mode.&#34;&#34;&#34;
-        return super(AlcatelSrosSSH, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
-
-    def check_config_mode(self, check_string=&#34;config&#34;, pattern=&#34;#&#34;):
-        &#34;&#34;&#34; Checks if the device is in configuration mode or not. &#34;&#34;&#34;
-        return super(AlcatelSrosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
-
-    def save_config(self, *args, **kwargs):
-        &#34;&#34;&#34;Not Implemented&#34;&#34;&#34;
-        raise NotImplementedError</code></pre>
-</details>
-<h3>Ancestors</h3>
-<ul class="hlist">
-<li><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></li>
-<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
-<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
-</ul>
-<h3>Methods</h3>
-<dl>
-<dt id="netmiko.alcatel.AlcatelSrosSSH.check_config_mode"><code class="name flex">
-<span>def <span class="ident">check_config_mode</span></span>(<span>self, check_string='config', pattern='#')</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Checks if the device is in configuration mode or not.</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def check_config_mode(self, check_string=&#34;config&#34;, pattern=&#34;#&#34;):
-    &#34;&#34;&#34; Checks if the device is in configuration mode or not. &#34;&#34;&#34;
-    return super(AlcatelSrosSSH, self).check_config_mode(
-        check_string=check_string, pattern=pattern
-    )</code></pre>
-</details>
-</dd>
-<dt id="netmiko.alcatel.AlcatelSrosSSH.check_enable_mode"><code class="name flex">
-<span>def <span class="ident">check_enable_mode</span></span>(<span>self, check_string='CLI Already in admin mode')</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Check whether we are in enable-admin mode.
-SROS requires us to do this:
-<em>A:HOSTNAME# enable-admin
-MINOR: CLI Already in admin mode.
-</em>A:HOSTNAME#
-<em>A:HOSTNAME# enable-admin
-Password:
-MINOR: CLI Invalid password.
-</em>A:HOSTNAME#</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def check_enable_mode(self, check_string=&#34;CLI Already in admin mode&#34;):
-    &#34;&#34;&#34;Check whether we are in enable-admin mode.
-     SROS requires us to do this:
-    *A:HOSTNAME# enable-admin
-    MINOR: CLI Already in admin mode.
-    *A:HOSTNAME#
-    *A:HOSTNAME# enable-admin
-    Password:
-    MINOR: CLI Invalid password.
-    *A:HOSTNAME#
-    &#34;&#34;&#34;
-    output = self.send_command_timing(&#34;enable-admin&#34;)
-    if re.search(r&#34;ssword&#34;, output):
-        # Just hit enter as we don&#39;t actually want to enter enable here
-        self.write_channel(self.normalize_cmd(self.RETURN))
-        self.read_until_prompt()
-        return False
-    elif check_string in output:
-        return True
-    raise ValueError(&#34;Unexpected response in check_enable_mode() method&#34;)</code></pre>
-</details>
-</dd>
-<dt id="netmiko.alcatel.AlcatelSrosSSH.config_mode"><code class="name flex">
-<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='configure', pattern='#')</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Enter into configuration mode on SROS device.</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;, pattern=&#34;#&#34;):
-    &#34;&#34;&#34; Enter into configuration mode on SROS device.&#34;&#34;&#34;
-    return super(AlcatelSrosSSH, self).config_mode(
-        config_command=config_command, pattern=pattern
-    )</code></pre>
-</details>
-</dd>
-<dt id="netmiko.alcatel.AlcatelSrosSSH.exit_enable_mode"><code class="name flex">
-<span>def <span class="ident">exit_enable_mode</span></span>(<span>self, exit_command='')</span>
-</code></dt>
-<dd>
-<section class="desc"><p>No corresponding exit of enable mode on SROS.</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def exit_enable_mode(self, exit_command=&#34;&#34;):
-    &#34;&#34;&#34;No corresponding exit of enable mode on SROS.&#34;&#34;&#34;
-    pass</code></pre>
-</details>
-</dd>
-<dt id="netmiko.alcatel.AlcatelSrosSSH.save_config"><code class="name flex">
-<span>def <span class="ident">save_config</span></span>(<span>self, *args, **kwargs)</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Not Implemented</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def save_config(self, *args, **kwargs):
-    &#34;&#34;&#34;Not Implemented&#34;&#34;&#34;
-    raise NotImplementedError</code></pre>
-</details>
-</dd>
-<dt id="netmiko.alcatel.AlcatelSrosSSH.set_base_prompt"><code class="name flex">
-<span>def <span class="ident">set_base_prompt</span></span>(<span>self, *args, **kwargs)</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Remove the &gt; when navigating into the different config level.</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def set_base_prompt(self, *args, **kwargs):
-    &#34;&#34;&#34;Remove the &gt; when navigating into the different config level.&#34;&#34;&#34;
-    cur_base_prompt = super(AlcatelSrosSSH, self).set_base_prompt(*args, **kwargs)
-    match = re.search(r&#34;(.*)(&gt;.*)*#&#34;, cur_base_prompt)
-    if match:
-        # strip off &gt;... from base_prompt
-        self.base_prompt = match.group(1)
-        return self.base_prompt</code></pre>
-</details>
-</dd>
-</dl>
-<h3>Inherited members</h3>
-<ul class="hlist">
-<li><code><b><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></b></code>:
-<ul class="hlist">
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
-</ul>
-</li>
-</ul>
-</dd>
 </dl>
 </section>
 </article>
@@ -727,7 +370,6 @@ MINOR: CLI Invalid password.
 <li><h3><a href="#header-submodules">Sub-modules</a></h3>
 <ul>
 <li><code><a title="netmiko.alcatel.alcatel_aos_ssh" href="alcatel_aos_ssh.html">netmiko.alcatel.alcatel_aos_ssh</a></code></li>
-<li><code><a title="netmiko.alcatel.alcatel_sros_ssh" href="alcatel_sros_ssh.html">netmiko.alcatel.alcatel_sros_ssh</a></code></li>
 </ul>
 </li>
 <li><h3><a href="#header-classes">Classes</a></h3>
@@ -744,24 +386,13 @@ MINOR: CLI Invalid password.
 <li><code><a title="netmiko.alcatel.AlcatelAosSSH.save_config" href="#netmiko.alcatel.AlcatelAosSSH.save_config">save_config</a></code></li>
 </ul>
 </li>
-<li>
-<h4><code><a title="netmiko.alcatel.AlcatelSrosSSH" href="#netmiko.alcatel.AlcatelSrosSSH">AlcatelSrosSSH</a></code></h4>
-<ul class="two-column">
-<li><code><a title="netmiko.alcatel.AlcatelSrosSSH.check_config_mode" href="#netmiko.alcatel.AlcatelSrosSSH.check_config_mode">check_config_mode</a></code></li>
-<li><code><a title="netmiko.alcatel.AlcatelSrosSSH.check_enable_mode" href="#netmiko.alcatel.AlcatelSrosSSH.check_enable_mode">check_enable_mode</a></code></li>
-<li><code><a title="netmiko.alcatel.AlcatelSrosSSH.config_mode" href="#netmiko.alcatel.AlcatelSrosSSH.config_mode">config_mode</a></code></li>
-<li><code><a title="netmiko.alcatel.AlcatelSrosSSH.exit_enable_mode" href="#netmiko.alcatel.AlcatelSrosSSH.exit_enable_mode">exit_enable_mode</a></code></li>
-<li><code><a title="netmiko.alcatel.AlcatelSrosSSH.save_config" href="#netmiko.alcatel.AlcatelSrosSSH.save_config">save_config</a></code></li>
-<li><code><a title="netmiko.alcatel.AlcatelSrosSSH.set_base_prompt" href="#netmiko.alcatel.AlcatelSrosSSH.set_base_prompt">set_base_prompt</a></code></li>
-</ul>
-</li>
 </ul>
 </li>
 </ul>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/apresia/apresia_aeos.html b/docs/netmiko/apresia/apresia_aeos.html
index 2af2245afa425d4de1615cae0424458b2710e617..71fbdac74e547b931684323e6a8002b1437f72ac 100644
--- a/docs/netmiko/apresia/apresia_aeos.html
+++ b/docs/netmiko/apresia/apresia_aeos.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.apresia.apresia_aeos API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -33,7 +32,6 @@ class ApresiaAeosBase(CiscoSSHConnection):
         self._test_channel_read(pattern=r&#34;[&gt;#]&#34;)
         self.set_base_prompt()
         self.disable_paging()
-        self.set_terminal_width(command=&#34;terminal width 511&#34;)
         # Clear the read buffer
         time.sleep(0.3 * self.global_delay_factor)
         self.clear_buffer()
@@ -47,10 +45,6 @@ class ApresiaAeosBase(CiscoSSHConnection):
             self.send_config_set(&#34;terminal length 0&#34;)
         self.exit_enable_mode()
 
-    def set_terminal_width(self, command=&#34;&#34;, delay_factor=1):
-        &#34;&#34;&#34;No terminal width command mode on AEOS&#34;&#34;&#34;
-        pass
-
 
 class ApresiaAeosSSH(ApresiaAeosBase):
     pass
@@ -60,7 +54,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ApresiaAeosTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 </section>
 <section>
@@ -74,7 +68,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 <dl>
 <dt id="netmiko.apresia.apresia_aeos.ApresiaAeosBase"><code class="flex name class">
 <span>class <span class="ident">ApresiaAeosBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -194,6 +188,10 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -203,7 +201,6 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
         self._test_channel_read(pattern=r&#34;[&gt;#]&#34;)
         self.set_base_prompt()
         self.disable_paging()
-        self.set_terminal_width(command=&#34;terminal width 511&#34;)
         # Clear the read buffer
         time.sleep(0.3 * self.global_delay_factor)
         self.clear_buffer()
@@ -215,11 +212,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 
         if self.allow_auto_change and &#34;terminal length 0&#34; not in output:
             self.send_config_set(&#34;terminal length 0&#34;)
-        self.exit_enable_mode()
-
-    def set_terminal_width(self, command=&#34;&#34;, delay_factor=1):
-        &#34;&#34;&#34;No terminal width command mode on AEOS&#34;&#34;&#34;
-        pass</code></pre>
+        self.exit_enable_mode()</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -246,24 +239,11 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
     self._test_channel_read(pattern=r&#34;[&gt;#]&#34;)
     self.set_base_prompt()
     self.disable_paging()
-    self.set_terminal_width(command=&#34;terminal width 511&#34;)
     # Clear the read buffer
     time.sleep(0.3 * self.global_delay_factor)
     self.clear_buffer()</code></pre>
 </details>
 </dd>
-<dt id="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width"><code class="name flex">
-<span>def <span class="ident">set_terminal_width</span></span>(<span>self, command='', delay_factor=1)</span>
-</code></dt>
-<dd>
-<section class="desc"><p>No terminal width command mode on AEOS</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def set_terminal_width(self, command=&#34;&#34;, delay_factor=1):
-    &#34;&#34;&#34;No terminal width command mode on AEOS&#34;&#34;&#34;
-    pass</code></pre>
-</details>
-</dd>
 </dl>
 <h3>Inherited members</h3>
 <ul class="hlist">
@@ -300,6 +280,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 <li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
 <li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
 <li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
@@ -313,7 +294,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 </dd>
 <dt id="netmiko.apresia.apresia_aeos.ApresiaAeosSSH"><code class="flex name class">
 <span>class <span class="ident">ApresiaAeosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -433,6 +414,10 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -482,7 +467,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation" href="#netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
-<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="#netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
@@ -616,6 +601,10 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -623,7 +612,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ApresiaAeosTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -668,7 +657,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation" href="#netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
-<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="#netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
@@ -700,7 +689,6 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 <h4><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase" href="#netmiko.apresia.apresia_aeos.ApresiaAeosBase">ApresiaAeosBase</a></code></h4>
 <ul class="">
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation" href="#netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation">session_preparation</a></code></li>
-<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="#netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width">set_terminal_width</a></code></li>
 </ul>
 </li>
 <li>
@@ -715,7 +703,7 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/apresia/index.html b/docs/netmiko/apresia/index.html
index 9f38ed5c87839fa3dcb0408914c27d8abdc8e71a..a39c03d167a0a216391f9106dda6891888efcfbc 100644
--- a/docs/netmiko/apresia/index.html
+++ b/docs/netmiko/apresia/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.apresia API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.apresia.apresia_aeos import ApresiaAeosSSH, ApresiaAeosTelnet
+<pre><code class="python">from netmiko.apresia.apresia_aeos import ApresiaAeosSSH, ApresiaAeosTelnet
 
 __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
 <dl>
 <dt id="netmiko.apresia.ApresiaAeosSSH"><code class="flex name class">
 <span>class <span class="ident">ApresiaAeosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -166,6 +165,10 @@ __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -215,7 +218,7 @@ __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation" href="apresia_aeos.html#netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
-<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="apresia_aeos.html#netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
@@ -349,6 +352,10 @@ __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -356,7 +363,7 @@ __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ApresiaAeosTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -401,7 +408,7 @@ __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation" href="apresia_aeos.html#netmiko.apresia.apresia_aeos.ApresiaAeosBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
-<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="apresia_aeos.html#netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
@@ -446,7 +453,7 @@ __all__ = [&#34;ApresiaAeosSSH&#34;, &#34;ApresiaAeosTelnet&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/arista/arista.html b/docs/netmiko/arista/arista.html
index 1aa3705e7bc4b08d5428f7c76e877b6202865046..ae2916f084760927d24d3505a97a2eac0ba04edc 100644
--- a/docs/netmiko/arista/arista.html
+++ b/docs/netmiko/arista/arista.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.arista.arista API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 from netmiko.cisco_base_connection import CiscoFileTransfer
 from netmiko import log
@@ -49,13 +48,13 @@ class AristaBase(CiscoSSHConnection):
 
         Can also be (s2)
         &#34;&#34;&#34;
-        log.debug(&#34;pattern: {0}&#34;.format(pattern))
+        log.debug(f&#34;pattern: {pattern}&#34;)
         self.write_channel(self.RETURN)
         output = self.read_until_pattern(pattern=pattern)
-        log.debug(&#34;check_config_mode: {0}&#34;.format(repr(output)))
+        log.debug(f&#34;check_config_mode: {repr(output)}&#34;)
         output = output.replace(&#34;(s1)&#34;, &#34;&#34;)
         output = output.replace(&#34;(s2)&#34;, &#34;&#34;)
-        log.debug(&#34;check_config_mode: {0}&#34;.format(repr(output)))
+        log.debug(f&#34;check_config_mode: {repr(output)}&#34;)
         return check_string in output
 
     def _enter_shell(self):
@@ -75,7 +74,7 @@ class AristaTelnet(AristaBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(AristaTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
 
 class AristaFileTransfer(CiscoFileTransfer):
@@ -88,13 +87,15 @@ class AristaFileTransfer(CiscoFileTransfer):
         dest_file,
         file_system=&#34;/mnt/flash&#34;,
         direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(AristaFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -117,7 +118,7 @@ class AristaFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} file:{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} file:{self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=4
         )
@@ -142,7 +143,7 @@ class AristaFileTransfer(CiscoFileTransfer):
 <dl>
 <dt id="netmiko.arista.arista.AristaBase"><code class="flex name class">
 <span>class <span class="ident">AristaBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -262,6 +263,10 @@ class AristaFileTransfer(CiscoFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -285,13 +290,13 @@ class AristaFileTransfer(CiscoFileTransfer):
 
         Can also be (s2)
         &#34;&#34;&#34;
-        log.debug(&#34;pattern: {0}&#34;.format(pattern))
+        log.debug(f&#34;pattern: {pattern}&#34;)
         self.write_channel(self.RETURN)
         output = self.read_until_pattern(pattern=pattern)
-        log.debug(&#34;check_config_mode: {0}&#34;.format(repr(output)))
+        log.debug(f&#34;check_config_mode: {repr(output)}&#34;)
         output = output.replace(&#34;(s1)&#34;, &#34;&#34;)
         output = output.replace(&#34;(s2)&#34;, &#34;&#34;)
-        log.debug(&#34;check_config_mode: {0}&#34;.format(repr(output)))
+        log.debug(f&#34;check_config_mode: {repr(output)}&#34;)
         return check_string in output
 
     def _enter_shell(self):
@@ -334,13 +339,13 @@ loc1-core01(s1)#</p>
 
     Can also be (s2)
     &#34;&#34;&#34;
-    log.debug(&#34;pattern: {0}&#34;.format(pattern))
+    log.debug(f&#34;pattern: {pattern}&#34;)
     self.write_channel(self.RETURN)
     output = self.read_until_pattern(pattern=pattern)
-    log.debug(&#34;check_config_mode: {0}&#34;.format(repr(output)))
+    log.debug(f&#34;check_config_mode: {repr(output)}&#34;)
     output = output.replace(&#34;(s1)&#34;, &#34;&#34;)
     output = output.replace(&#34;(s2)&#34;, &#34;&#34;)
-    log.debug(&#34;check_config_mode: {0}&#34;.format(repr(output)))
+    log.debug(f&#34;check_config_mode: {repr(output)}&#34;)
     return check_string in output</code></pre>
 </details>
 </dd>
@@ -411,7 +416,7 @@ loc1-core01(s1)#</p>
 </dd>
 <dt id="netmiko.arista.arista.AristaFileTransfer"><code class="flex name class">
 <span>class <span class="ident">AristaFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/mnt/flash', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/mnt/flash', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Arista SCP File Transfer driver.</p></section>
@@ -427,13 +432,15 @@ loc1-core01(s1)#</p>
         dest_file,
         file_system=&#34;/mnt/flash&#34;,
         direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(AristaFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -456,7 +463,7 @@ loc1-core01(s1)#</p>
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} file:{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} file:{self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=4
         )
@@ -501,7 +508,7 @@ loc1-core01(s1)#</p>
 </dd>
 <dt id="netmiko.arista.arista.AristaSSH"><code class="flex name class">
 <span>class <span class="ident">AristaSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -621,6 +628,10 @@ loc1-core01(s1)#</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -804,6 +815,10 @@ loc1-core01(s1)#</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -811,7 +826,7 @@ loc1-core01(s1)#</p>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(AristaTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -906,7 +921,7 @@ loc1-core01(s1)#</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/arista/index.html b/docs/netmiko/arista/index.html
index e3eee1c80270c52b922b7450a439540e27e638cc..448dd4c9b79eea944356e54f7313adf56ffb4f9f 100644
--- a/docs/netmiko/arista/index.html
+++ b/docs/netmiko/arista/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.arista API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.arista.arista import AristaSSH, AristaTelnet, AristaFileTransfer
+<pre><code class="python">from netmiko.arista.arista import AristaSSH, AristaTelnet, AristaFileTransfer
 
 __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
 <dl>
 <dt id="netmiko.arista.AristaFileTransfer"><code class="flex name class">
 <span>class <span class="ident">AristaFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/mnt/flash', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/mnt/flash', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Arista SCP File Transfer driver.</p></section>
@@ -62,13 +61,15 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
         dest_file,
         file_system=&#34;/mnt/flash&#34;,
         direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(AristaFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -91,7 +92,7 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} file:{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} file:{self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=4
         )
@@ -136,7 +137,7 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
 </dd>
 <dt id="netmiko.arista.AristaSSH"><code class="flex name class">
 <span>class <span class="ident">AristaSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -256,6 +257,10 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -439,6 +444,10 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -446,7 +455,7 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(AristaTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -539,7 +548,7 @@ __all__ = [&#34;AristaSSH&#34;, &#34;AristaTelnet&#34;, &#34;AristaFileTransfer&
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/aruba/aruba_ssh.html b/docs/netmiko/aruba/aruba_ssh.html
index 7235f907d01c74b8c582e74087aa16c6ae351e44..13e378053f474de0c804918960295bed597c91ff 100644
--- a/docs/netmiko/aruba/aruba_ssh.html
+++ b/docs/netmiko/aruba/aruba_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.aruba.aruba_ssh API documentation</title>
 <meta name="description" content="Aruba OS support" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Aruba OS support&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -36,7 +35,7 @@ class ArubaSSH(CiscoSSHConnection):
     def __init__(self, **kwargs):
         if kwargs.get(&#34;default_enter&#34;) is None:
             kwargs[&#34;default_enter&#34;] = &#34;\r&#34;
-        return super(ArubaSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Aruba OS requires enable mode to disable paging.&#34;&#34;&#34;
@@ -58,9 +57,7 @@ class ArubaSSH(CiscoSSHConnection):
         &#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt[:16])
-        return super(ArubaSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )</code></pre>
+        return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 </section>
 <section>
@@ -194,6 +191,10 @@ class ArubaSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -203,7 +204,7 @@ class ArubaSSH(CiscoSSHConnection):
     def __init__(self, **kwargs):
         if kwargs.get(&#34;default_enter&#34;) is None:
             kwargs[&#34;default_enter&#34;] = &#34;\r&#34;
-        return super(ArubaSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Aruba OS requires enable mode to disable paging.&#34;&#34;&#34;
@@ -225,9 +226,7 @@ class ArubaSSH(CiscoSSHConnection):
         &#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt[:16])
-        return super(ArubaSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )</code></pre>
+        return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -253,9 +252,7 @@ class ArubaSSH(CiscoSSHConnection):
     &#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt[:16])
-    return super(ArubaSSH, self).check_config_mode(
-        check_string=check_string, pattern=pattern
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.aruba.aruba_ssh.ArubaSSH.session_preparation"><code class="name flex">
@@ -354,7 +351,7 @@ class ArubaSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/aruba/index.html b/docs/netmiko/aruba/index.html
index bd29b0a1a442d5cba055011c1531e286359ea5ea..b97ccabffcf8bd69628d1cd7ac5ef2efa2ba2ae3 100644
--- a/docs/netmiko/aruba/index.html
+++ b/docs/netmiko/aruba/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.aruba API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.aruba.aruba_ssh import ArubaSSH
+<pre><code class="python">from netmiko.aruba.aruba_ssh import ArubaSSH
 
 __all__ = [&#34;ArubaSSH&#34;]</code></pre>
 </details>
@@ -166,6 +165,10 @@ __all__ = [&#34;ArubaSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -175,7 +178,7 @@ __all__ = [&#34;ArubaSSH&#34;]</code></pre>
     def __init__(self, **kwargs):
         if kwargs.get(&#34;default_enter&#34;) is None:
             kwargs[&#34;default_enter&#34;] = &#34;\r&#34;
-        return super(ArubaSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Aruba OS requires enable mode to disable paging.&#34;&#34;&#34;
@@ -197,9 +200,7 @@ __all__ = [&#34;ArubaSSH&#34;]</code></pre>
         &#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt[:16])
-        return super(ArubaSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )</code></pre>
+        return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -225,9 +226,7 @@ __all__ = [&#34;ArubaSSH&#34;]</code></pre>
     &#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt[:16])
-    return super(ArubaSSH, self).check_config_mode(
-        check_string=check_string, pattern=pattern
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.aruba.ArubaSSH.session_preparation"><code class="name flex">
@@ -331,7 +330,7 @@ __all__ = [&#34;ArubaSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/base_connection.html b/docs/netmiko/base_connection.html
index 339b63788e14ffce8063780e72db57e4f6b39f66..3de01c9b5df388fd82cfd1f48011492a62515503 100644
--- a/docs/netmiko/base_connection.html
+++ b/docs/netmiko/base_connection.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.base_connection API documentation</title>
 <meta name="description" content="Base connection class for netmiko …" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -34,10 +34,6 @@ platforms (Cisco and non-Cisco).
 
 Also defines methods that should generally be supported by child classes
 &#34;&#34;&#34;
-
-from __future__ import print_function
-from __future__ import unicode_literals
-
 import io
 import re
 import socket
@@ -52,10 +48,9 @@ import serial
 
 from netmiko import log
 from netmiko.netmiko_globals import MAX_BUFFER, BACKSPACE_CHAR
-from netmiko.py23_compat import string_types, bufferedio_types, text_type
 from netmiko.ssh_exception import (
-    NetMikoTimeoutException,
-    NetMikoAuthenticationException,
+    NetmikoTimeoutException,
+    NetmikoAuthenticationException,
 )
 from netmiko.utilities import (
     write_bytes,
@@ -96,8 +91,8 @@ class BaseConnection(object):
         timeout=100,
         session_timeout=60,
         auth_timeout=None,
-        blocking_timeout=8,
-        banner_timeout=5,
+        blocking_timeout=20,
+        banner_timeout=15,
         keepalive=0,
         default_enter=None,
         response_return=None,
@@ -108,6 +103,7 @@ class BaseConnection(object):
         session_log_file_mode=&#34;write&#34;,
         allow_auto_change=False,
         encoding=&#34;ascii&#34;,
+        sock=None,
     ):
         &#34;&#34;&#34;
         Initialize attributes for establishing connection to target device.
@@ -224,6 +220,10 @@ class BaseConnection(object):
         :param encoding: Encoding to be used when writing bytes to the output channel.
                 (default: ascii)
         :type encoding: str
+
+        :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+                communication to the target host (default: None).
+        :type sock: socket
         &#34;&#34;&#34;
         self.remote_conn = None
 
@@ -265,6 +265,7 @@ class BaseConnection(object):
         self.keepalive = keepalive
         self.allow_auto_change = allow_auto_change
         self.encoding = encoding
+        self.sock = sock
 
         # Netmiko will close the session_log if we open the file
         self.session_log = None
@@ -273,10 +274,10 @@ class BaseConnection(object):
         # Ensures last write operations prior to disconnect are recorded.
         self._session_log_fin = False
         if session_log is not None:
-            if isinstance(session_log, string_types):
+            if isinstance(session_log, str):
                 # If session_log is a string, open a file corresponding to string name.
                 self.open_session_log(filename=session_log, mode=session_log_file_mode)
-            elif isinstance(session_log, bufferedio_types):
+            elif isinstance(session_log, io.BufferedIOBase):
                 # In-memory buffer or an already open file handle
                 self.session_log = session_log
             else:
@@ -363,7 +364,7 @@ class BaseConnection(object):
         pass
 
     def _timeout_exceeded(self, start, msg=&#34;Timeout exceeded!&#34;):
-        &#34;&#34;&#34;Raise NetMikoTimeoutException if waiting too much in the serving queue.
+        &#34;&#34;&#34;Raise NetmikoTimeoutException if waiting too much in the serving queue.
 
         :param start: Initial start time to see if session lock timeout has been exceeded
         :type start: float (from time.time() call i.e. epoch time)
@@ -376,7 +377,7 @@ class BaseConnection(object):
             return False
         if time.time() - start &gt; self.session_timeout:
             # session_timeout exceeded
-            raise NetMikoTimeoutException(msg)
+            raise NetmikoTimeoutException(msg)
         return False
 
     def _lock_netmiko_session(self, start=None):
@@ -436,7 +437,11 @@ class BaseConnection(object):
                 data = data.replace(self.password, &#34;********&#34;)
             if self.secret:
                 data = data.replace(self.secret, &#34;********&#34;)
-            self.session_log.write(write_bytes(data, encoding=self.encoding))
+            if isinstance(self.session_log, io.BufferedIOBase):
+                data = self.normalize_linefeeds(data)
+                self.session_log.write(write_bytes(data, encoding=self.encoding))
+            else:
+                self.session_log.write(self.normalize_linefeeds(data))
             self.session_log.flush()
 
     def write_channel(self, out_data):
@@ -503,7 +508,9 @@ class BaseConnection(object):
                 output += self.remote_conn.read(self.remote_conn.in_waiting).decode(
                     &#34;utf-8&#34;, &#34;ignore&#34;
                 )
-        log.debug(&#34;read_channel: {}&#34;.format(output))
+        if self.ansi_escape_codes:
+            output = self.strip_ansi_escape_codes(output)
+        log.debug(f&#34;read_channel: {output}&#34;)
         self._write_session_log(output)
         return output
 
@@ -546,7 +553,7 @@ class BaseConnection(object):
         output = &#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        log.debug(&#34;Pattern is: {}&#34;.format(pattern))
+        log.debug(f&#34;Pattern is: {pattern}&#34;)
 
         i = 1
         loop_delay = 0.1
@@ -563,11 +570,13 @@ class BaseConnection(object):
                     if len(new_data) == 0:
                         raise EOFError(&#34;Channel stream closed by remote device.&#34;)
                     new_data = new_data.decode(&#34;utf-8&#34;, &#34;ignore&#34;)
-                    log.debug(&#34;_read_channel_expect read_data: {}&#34;.format(new_data))
+                    if self.ansi_escape_codes:
+                        new_data = self.strip_ansi_escape_codes(new_data)
+                    log.debug(f&#34;_read_channel_expect read_data: {new_data}&#34;)
                     output += new_data
                     self._write_session_log(new_data)
                 except socket.timeout:
-                    raise NetMikoTimeoutException(
+                    raise NetmikoTimeoutException(
                         &#34;Timed-out reading channel, data not available.&#34;
                     )
                 finally:
@@ -575,12 +584,12 @@ class BaseConnection(object):
             elif self.protocol == &#34;telnet&#34; or &#34;serial&#34;:
                 output += self.read_channel()
             if re.search(pattern, output, flags=re_flags):
-                log.debug(&#34;Pattern found: {} {}&#34;.format(pattern, output))
+                log.debug(f&#34;Pattern found: {pattern} {output}&#34;)
                 return output
             time.sleep(loop_delay * self.global_delay_factor)
             i += 1
-        raise NetMikoTimeoutException(
-            &#34;Timed-out reading channel, pattern not found in output: {}&#34;.format(pattern)
+        raise NetmikoTimeoutException(
+            f&#34;Timed-out reading channel, pattern not found in output: {pattern}&#34;
         )
 
     def _read_channel_timing(self, delay_factor=1, max_loops=150):
@@ -738,8 +747,8 @@ class BaseConnection(object):
                 i += 1
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -751,9 +760,9 @@ class BaseConnection(object):
         ):
             return return_msg
 
-        msg = &#34;Login failed: {}&#34;.format(self.host)
+        msg = f&#34;Login failed: {self.host}&#34;
         self.remote_conn.close()
-        raise NetMikoAuthenticationException(msg)
+        raise NetmikoAuthenticationException(msg)
 
     def _try_session_preparation(self):
         &#34;&#34;&#34;
@@ -853,6 +862,7 @@ class BaseConnection(object):
             &#34;timeout&#34;: self.timeout,
             &#34;auth_timeout&#34;: self.auth_timeout,
             &#34;banner_timeout&#34;: self.banner_timeout,
+            &#34;sock&#34;: self.sock,
         }
 
         # Check if using SSH &#39;config&#39; file mainly for SSH proxy support
@@ -871,8 +881,6 @@ class BaseConnection(object):
         :param strip_command:
         :type strip_command:
         &#34;&#34;&#34;
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
         output = self.normalize_linefeeds(output)
         if strip_command and command_string:
             command_string = self.normalize_linefeeds(command_string)
@@ -884,8 +892,8 @@ class BaseConnection(object):
     def establish_connection(self, width=None, height=None):
         &#34;&#34;&#34;Establish SSH connection to the network device
 
-        Timeout will generate a NetMikoTimeoutException
-        Authentication failure will generate a NetMikoAuthenticationException
+        Timeout will generate a NetmikoTimeoutException
+        Authentication failure will generate a NetmikoAuthenticationException
 
         width and height are needed for Fortinet paging setting.
 
@@ -915,19 +923,17 @@ class BaseConnection(object):
                 msg = &#34;Connection to device timed-out: {device_type} {ip}:{port}&#34;.format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                raise NetMikoTimeoutException(msg)
+                raise NetmikoTimeoutException(msg)
             except paramiko.ssh_exception.AuthenticationException as auth_err:
                 self.paramiko_cleanup()
                 msg = &#34;Authentication failure: unable to connect {device_type} {ip}:{port}&#34;.format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                msg += self.RETURN + text_type(auth_err)
-                raise NetMikoAuthenticationException(msg)
+                msg += self.RETURN + str(auth_err)
+                raise NetmikoAuthenticationException(msg)
 
             if self.verbose:
-                print(
-                    &#34;SSH connection established to {}:{}&#34;.format(self.host, self.port)
-                )
+                print(f&#34;SSH connection established to {self.host}:{self.port}&#34;)
 
             # Use invoke_shell to establish an &#39;interactive session&#39;
             if width and height:
@@ -984,7 +990,7 @@ class BaseConnection(object):
         if new_data:
             return new_data
         else:
-            raise NetMikoTimeoutException(&#34;Timed out waiting for data&#34;)
+            raise NetmikoTimeoutException(&#34;Timed out waiting for data&#34;)
 
     def _build_ssh_client(self):
         &#34;&#34;&#34;Prepare for Paramiko SSH connection.&#34;&#34;&#34;
@@ -1038,12 +1044,11 @@ class BaseConnection(object):
         self.clear_buffer()
         command = self.normalize_cmd(command)
         log.debug(&#34;In disable_paging&#34;)
-        log.debug(&#34;Command: {0}&#34;.format(command))
+        log.debug(f&#34;Command: {command}&#34;)
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
-        log.debug(&#34;{0}&#34;.format(output))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
+        log.debug(f&#34;{output}&#34;)
         log.debug(&#34;Exiting disable_paging&#34;)
         return output
 
@@ -1064,9 +1069,8 @@ class BaseConnection(object):
         delay_factor = self.select_delay_factor(delay_factor)
         command = self.normalize_cmd(command)
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
         return output
 
     def set_base_prompt(
@@ -1093,7 +1097,7 @@ class BaseConnection(object):
         &#34;&#34;&#34;
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {0}&#34;.format(repr(prompt)))
+            raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
         # Strip off trailing terminator
         self.base_prompt = prompt[:-1]
         return self.base_prompt
@@ -1107,24 +1111,26 @@ class BaseConnection(object):
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
         self.write_channel(self.RETURN)
-        time.sleep(delay_factor * 0.1)
+        sleep_time = delay_factor * 0.1
+        time.sleep(sleep_time)
 
         # Initial attempt to get prompt
         prompt = self.read_channel()
-        if self.ansi_escape_codes:
-            prompt = self.strip_ansi_escape_codes(prompt)
 
         # Check if the only thing you received was a newline
         count = 0
         prompt = prompt.strip()
-        while count &lt;= 10 and not prompt:
+        while count &lt;= 12 and not prompt:
             prompt = self.read_channel().strip()
-            if prompt:
-                if self.ansi_escape_codes:
-                    prompt = self.strip_ansi_escape_codes(prompt).strip()
-            else:
+            if not prompt:
                 self.write_channel(self.RETURN)
-                time.sleep(delay_factor * 0.1)
+                # log.debug(f&#34;find_prompt sleep time: {sleep_time}&#34;)
+                time.sleep(sleep_time)
+                if sleep_time &lt;= 3:
+                    # Double the sleep_time when it is small
+                    sleep_time *= 2
+                else:
+                    sleep_time += 1
             count += 1
 
         # If multiple lines in the output take the last line
@@ -1132,14 +1138,25 @@ class BaseConnection(object):
         prompt = prompt.split(self.RESPONSE_RETURN)[-1]
         prompt = prompt.strip()
         if not prompt:
-            raise ValueError(&#34;Unable to find prompt: {}&#34;.format(prompt))
+            raise ValueError(f&#34;Unable to find prompt: {prompt}&#34;)
         time.sleep(delay_factor * 0.1)
         self.clear_buffer()
+        log.debug(f&#34;[find_prompt()]: prompt is {prompt}&#34;)
         return prompt
 
-    def clear_buffer(self):
+    def clear_buffer(self, backoff=True):
         &#34;&#34;&#34;Read any data available in the channel.&#34;&#34;&#34;
-        self.read_channel()
+        sleep_time = 0.1 * self.global_delay_factor
+        for _ in range(10):
+            time.sleep(sleep_time)
+            data = self.read_channel()
+            if not data:
+                break
+            # Double sleep time each time we detect data
+            log.debug(&#34;Clear buffer detects data in the channel&#34;)
+            if backoff:
+                sleep_time *= 2
+                sleep_time = 3 if sleep_time &gt;= 3 else sleep_time
 
     def send_command_timing(
         self,
@@ -1150,7 +1167,9 @@ class BaseConnection(object):
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
+        cmd_echo=False,
     ):
         &#34;&#34;&#34;Execute command_string on the SSH channel using a delay-based mechanism. Generally
         used for show commands.
@@ -1175,10 +1194,17 @@ class BaseConnection(object):
         :type normalize: bool
 
         :param use_textfsm: Process command output through TextFSM template (default: False).
-        :type normalize: bool
+        :type use_textfsm: bool
+
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+        :type textfsm_template: str
 
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
-        :type normalize: bool
+        :type use_genie: bool
+
+        :param cmd_echo: Verify command echo before proceeding (default: False).
+        :type cmd_echo: bool
         &#34;&#34;&#34;
         output = &#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
@@ -1187,7 +1213,27 @@ class BaseConnection(object):
             command_string = self.normalize_cmd(command_string)
 
         self.write_channel(command_string)
-        output = self._read_channel_timing(
+
+        cmd = command_string.strip()
+        # if cmd is just an &#34;enter&#34; skip this section
+        if cmd and cmd_echo:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+
+            # Strip off everything before the command echo
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                output = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
+            else:
+                # cmd is in the actual output (not just echoed)
+                output = new_data
+
+        log.debug(f&#34;send_command_timing current output: {output}&#34;)
+
+        output += self._read_channel_timing(
             delay_factor=delay_factor, max_loops=max_loops
         )
         output = self._sanitize_output(
@@ -1196,18 +1242,27 @@ class BaseConnection(object):
             command_string=command_string,
             strip_prompt=strip_prompt,
         )
+
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+
+        log.debug(f&#34;send_command_timing final output: {output}&#34;)
         return output
 
     def strip_prompt(self, a_string):
@@ -1261,6 +1316,7 @@ class BaseConnection(object):
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
     ):
         &#34;&#34;&#34;Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -1294,6 +1350,9 @@ class BaseConnection(object):
         :param use_textfsm: Process command output through TextFSM template (default: False).
         :type normalize: bool
 
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
         :type normalize: bool
         &#34;&#34;&#34;
@@ -1326,6 +1385,20 @@ class BaseConnection(object):
         time.sleep(delay_factor * loop_delay)
         self.clear_buffer()
         self.write_channel(command_string)
+        new_data = &#34;&#34;
+
+        cmd = command_string.strip()
+        # if cmd is just and &#34;enter&#34; skip this section
+        if cmd:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+            # Strip off everything before the command echo (to avoid false positives on the prompt)
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                new_data = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
 
         i = 1
         output = &#34;&#34;
@@ -1334,11 +1407,7 @@ class BaseConnection(object):
 
         # Keep reading data until search_pattern is found or until max_loops is reached.
         while i &lt;= max_loops:
-            new_data = self.read_channel()
             if new_data:
-                if self.ansi_escape_codes:
-                    new_data = self.strip_ansi_escape_codes(new_data)
-
                 output += new_data
                 past_three_reads.append(new_data)
 
@@ -1359,6 +1428,7 @@ class BaseConnection(object):
 
             time.sleep(delay_factor * loop_delay)
             i += 1
+            new_data = self.read_channel()
         else:  # nobreak
             raise IOError(
                 &#34;Search pattern never detected in send_command_expect: {}&#34;.format(
@@ -1374,17 +1444,23 @@ class BaseConnection(object):
         )
 
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
         return output
 
     def send_command_expect(self, *args, **kwargs):
@@ -1425,12 +1501,17 @@ class BaseConnection(object):
         # Check for line wrap (remove backspaces)
         if backspace_char in output:
             output = output.replace(backspace_char, &#34;&#34;)
+
+        # Juniper has a weird case where the echoed command will be &#34; \n&#34;
+        # i.e. there is an extra space there.
+        cmd = command_string.strip()
+        if output.startswith(cmd):
             output_lines = output.split(self.RESPONSE_RETURN)
             new_output = output_lines[1:]
             return self.RESPONSE_RETURN.join(new_output)
         else:
-            command_length = len(command_string)
-            return output[command_length:]
+            # command_string isn&#39;t there; do nothing
+            return output
 
     def normalize_linefeeds(self, a_string):
         &#34;&#34;&#34;Convert `\r\r\n`,`\r\n`, `\n\r` to `\n.`
@@ -1492,7 +1573,7 @@ class BaseConnection(object):
                 )
                 self.write_channel(self.normalize_cmd(self.secret))
                 output += self.read_until_prompt()
-            except NetMikoTimeoutException:
+            except NetmikoTimeoutException:
                 raise ValueError(msg)
             if not self.check_enable_mode():
                 raise ValueError(msg)
@@ -1541,7 +1622,10 @@ class BaseConnection(object):
         output = &#34;&#34;
         if not self.check_config_mode():
             self.write_channel(self.normalize_cmd(config_command))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(config_command.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if not self.check_config_mode():
                 raise ValueError(&#34;Failed to enter configuration mode.&#34;)
         return output
@@ -1558,10 +1642,13 @@ class BaseConnection(object):
         output = &#34;&#34;
         if self.check_config_mode():
             self.write_channel(self.normalize_cmd(exit_config))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(exit_config.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if self.check_config_mode():
                 raise ValueError(&#34;Failed to exit configuration mode&#34;)
-        log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+        log.debug(f&#34;exit_config_mode: {output}&#34;)
         return output
 
     def send_config_from_file(self, config_file=None, **kwargs):
@@ -1591,6 +1678,8 @@ class BaseConnection(object):
         strip_prompt=False,
         strip_command=False,
         config_mode_command=None,
+        cmd_verify=True,
+        enter_config_mode=True,
     ):
         &#34;&#34;&#34;
         Send configuration commands down the SSH channel.
@@ -1620,34 +1709,64 @@ class BaseConnection(object):
 
         :param config_mode_command: The command to enter into config mode
         :type config_mode_command: str
+
+        :param cmd_verify: Whether or not to verify command echo for each command in config_set
+        :type cmd_verify: bool
+
+        :param enter_config_mode: Do you enter config mode before sending config commands
+        :type exit_config_mode: bool
+
         &#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
         if config_commands is None:
             return &#34;&#34;
-        elif isinstance(config_commands, string_types):
+        elif isinstance(config_commands, str):
             config_commands = (config_commands,)
 
         if not hasattr(config_commands, &#34;__iter__&#34;):
             raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
 
         # Send config commands
-        cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
-        output = self.config_mode(*cfg_mode_args)
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            if self.fast_cli:
-                pass
-            else:
+        if enter_config_mode:
+            cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
+            output = self.config_mode(*cfg_mode_args)
+
+        if self.fast_cli:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        elif not cmd_verify:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
                 time.sleep(delay_factor * 0.05)
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        else:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+
+                # Make sure command is echoed
+                new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
+                output += new_output
+
+                # We might capture next prompt in the original read
+                pattern = f&#34;(?:{re.escape(self.base_prompt)}|#)&#34;
+                if not re.search(pattern, new_output):
+                    # Make sure trailing prompt comes back (after command)
+                    # NX-OS has fast-buffering problem where it immediately echoes command
+                    # Even though the device hasn&#39;t caught up with processing command.
+                    new_output = self.read_until_pattern(pattern=pattern)
+                    output += new_output
 
-        # Gather output
-        output += self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
-        )
         if exit_config_mode:
             output += self.exit_config_mode()
         output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
+        log.debug(f&#34;{output}&#34;)
         return output
 
     def strip_ansi_escape_codes(self, string_buffer):
@@ -1681,7 +1800,7 @@ class BaseConnection(object):
         :type string_buffer: str
         &#34;&#34;&#34;  # noqa
         log.debug(&#34;In strip_ansi_escape_codes&#34;)
-        log.debug(&#34;repr = {}&#34;.format(repr(string_buffer)))
+        log.debug(f&#34;repr = {repr(string_buffer)}&#34;)
 
         code_position_cursor = chr(27) + r&#34;\[\d+;\d+H&#34;
         code_show_cursor = chr(27) + r&#34;\[\?25h&#34;
@@ -1737,8 +1856,9 @@ class BaseConnection(object):
         # CODE_NEXT_LINE must substitute with return
         output = re.sub(code_next_line, self.RETURN, output)
 
-        log.debug(&#34;new_output = {0}&#34;.format(output))
-        log.debug(&#34;repr = {0}&#34;.format(repr(output)))
+        log.debug(&#34;Stripping ANSI escape codes&#34;)
+        log.debug(f&#34;new_output = {output}&#34;)
+        log.debug(f&#34;repr = {repr(output)}&#34;)
 
         return output
 
@@ -1780,9 +1900,9 @@ class BaseConnection(object):
     def open_session_log(self, filename, mode=&#34;write&#34;):
         &#34;&#34;&#34;Open the session_log file.&#34;&#34;&#34;
         if mode == &#34;append&#34;:
-            self.session_log = open(filename, mode=&#34;ab&#34;)
+            self.session_log = open(filename, mode=&#34;a&#34;)
         else:
-            self.session_log = open(filename, mode=&#34;wb&#34;)
+            self.session_log = open(filename, mode=&#34;w&#34;)
         self._session_log_close = True
 
     def close_session_log(self):
@@ -1807,7 +1927,7 @@ class TelnetConnection(BaseConnection):
 <dl>
 <dt id="netmiko.base_connection.BaseConnection"><code class="flex name class">
 <span>class <span class="ident">BaseConnection</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -1928,6 +2048,10 @@ class TelnetConnection(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1962,8 +2086,8 @@ class TelnetConnection(BaseConnection):
         timeout=100,
         session_timeout=60,
         auth_timeout=None,
-        blocking_timeout=8,
-        banner_timeout=5,
+        blocking_timeout=20,
+        banner_timeout=15,
         keepalive=0,
         default_enter=None,
         response_return=None,
@@ -1974,6 +2098,7 @@ class TelnetConnection(BaseConnection):
         session_log_file_mode=&#34;write&#34;,
         allow_auto_change=False,
         encoding=&#34;ascii&#34;,
+        sock=None,
     ):
         &#34;&#34;&#34;
         Initialize attributes for establishing connection to target device.
@@ -2090,6 +2215,10 @@ class TelnetConnection(BaseConnection):
         :param encoding: Encoding to be used when writing bytes to the output channel.
                 (default: ascii)
         :type encoding: str
+
+        :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+                communication to the target host (default: None).
+        :type sock: socket
         &#34;&#34;&#34;
         self.remote_conn = None
 
@@ -2131,6 +2260,7 @@ class TelnetConnection(BaseConnection):
         self.keepalive = keepalive
         self.allow_auto_change = allow_auto_change
         self.encoding = encoding
+        self.sock = sock
 
         # Netmiko will close the session_log if we open the file
         self.session_log = None
@@ -2139,10 +2269,10 @@ class TelnetConnection(BaseConnection):
         # Ensures last write operations prior to disconnect are recorded.
         self._session_log_fin = False
         if session_log is not None:
-            if isinstance(session_log, string_types):
+            if isinstance(session_log, str):
                 # If session_log is a string, open a file corresponding to string name.
                 self.open_session_log(filename=session_log, mode=session_log_file_mode)
-            elif isinstance(session_log, bufferedio_types):
+            elif isinstance(session_log, io.BufferedIOBase):
                 # In-memory buffer or an already open file handle
                 self.session_log = session_log
             else:
@@ -2229,7 +2359,7 @@ class TelnetConnection(BaseConnection):
         pass
 
     def _timeout_exceeded(self, start, msg=&#34;Timeout exceeded!&#34;):
-        &#34;&#34;&#34;Raise NetMikoTimeoutException if waiting too much in the serving queue.
+        &#34;&#34;&#34;Raise NetmikoTimeoutException if waiting too much in the serving queue.
 
         :param start: Initial start time to see if session lock timeout has been exceeded
         :type start: float (from time.time() call i.e. epoch time)
@@ -2242,7 +2372,7 @@ class TelnetConnection(BaseConnection):
             return False
         if time.time() - start &gt; self.session_timeout:
             # session_timeout exceeded
-            raise NetMikoTimeoutException(msg)
+            raise NetmikoTimeoutException(msg)
         return False
 
     def _lock_netmiko_session(self, start=None):
@@ -2302,7 +2432,11 @@ class TelnetConnection(BaseConnection):
                 data = data.replace(self.password, &#34;********&#34;)
             if self.secret:
                 data = data.replace(self.secret, &#34;********&#34;)
-            self.session_log.write(write_bytes(data, encoding=self.encoding))
+            if isinstance(self.session_log, io.BufferedIOBase):
+                data = self.normalize_linefeeds(data)
+                self.session_log.write(write_bytes(data, encoding=self.encoding))
+            else:
+                self.session_log.write(self.normalize_linefeeds(data))
             self.session_log.flush()
 
     def write_channel(self, out_data):
@@ -2369,7 +2503,9 @@ class TelnetConnection(BaseConnection):
                 output += self.remote_conn.read(self.remote_conn.in_waiting).decode(
                     &#34;utf-8&#34;, &#34;ignore&#34;
                 )
-        log.debug(&#34;read_channel: {}&#34;.format(output))
+        if self.ansi_escape_codes:
+            output = self.strip_ansi_escape_codes(output)
+        log.debug(f&#34;read_channel: {output}&#34;)
         self._write_session_log(output)
         return output
 
@@ -2412,7 +2548,7 @@ class TelnetConnection(BaseConnection):
         output = &#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        log.debug(&#34;Pattern is: {}&#34;.format(pattern))
+        log.debug(f&#34;Pattern is: {pattern}&#34;)
 
         i = 1
         loop_delay = 0.1
@@ -2429,11 +2565,13 @@ class TelnetConnection(BaseConnection):
                     if len(new_data) == 0:
                         raise EOFError(&#34;Channel stream closed by remote device.&#34;)
                     new_data = new_data.decode(&#34;utf-8&#34;, &#34;ignore&#34;)
-                    log.debug(&#34;_read_channel_expect read_data: {}&#34;.format(new_data))
+                    if self.ansi_escape_codes:
+                        new_data = self.strip_ansi_escape_codes(new_data)
+                    log.debug(f&#34;_read_channel_expect read_data: {new_data}&#34;)
                     output += new_data
                     self._write_session_log(new_data)
                 except socket.timeout:
-                    raise NetMikoTimeoutException(
+                    raise NetmikoTimeoutException(
                         &#34;Timed-out reading channel, data not available.&#34;
                     )
                 finally:
@@ -2441,12 +2579,12 @@ class TelnetConnection(BaseConnection):
             elif self.protocol == &#34;telnet&#34; or &#34;serial&#34;:
                 output += self.read_channel()
             if re.search(pattern, output, flags=re_flags):
-                log.debug(&#34;Pattern found: {} {}&#34;.format(pattern, output))
+                log.debug(f&#34;Pattern found: {pattern} {output}&#34;)
                 return output
             time.sleep(loop_delay * self.global_delay_factor)
             i += 1
-        raise NetMikoTimeoutException(
-            &#34;Timed-out reading channel, pattern not found in output: {}&#34;.format(pattern)
+        raise NetmikoTimeoutException(
+            f&#34;Timed-out reading channel, pattern not found in output: {pattern}&#34;
         )
 
     def _read_channel_timing(self, delay_factor=1, max_loops=150):
@@ -2604,8 +2742,8 @@ class TelnetConnection(BaseConnection):
                 i += 1
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -2617,9 +2755,9 @@ class TelnetConnection(BaseConnection):
         ):
             return return_msg
 
-        msg = &#34;Login failed: {}&#34;.format(self.host)
+        msg = f&#34;Login failed: {self.host}&#34;
         self.remote_conn.close()
-        raise NetMikoAuthenticationException(msg)
+        raise NetmikoAuthenticationException(msg)
 
     def _try_session_preparation(self):
         &#34;&#34;&#34;
@@ -2719,6 +2857,7 @@ class TelnetConnection(BaseConnection):
             &#34;timeout&#34;: self.timeout,
             &#34;auth_timeout&#34;: self.auth_timeout,
             &#34;banner_timeout&#34;: self.banner_timeout,
+            &#34;sock&#34;: self.sock,
         }
 
         # Check if using SSH &#39;config&#39; file mainly for SSH proxy support
@@ -2737,8 +2876,6 @@ class TelnetConnection(BaseConnection):
         :param strip_command:
         :type strip_command:
         &#34;&#34;&#34;
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
         output = self.normalize_linefeeds(output)
         if strip_command and command_string:
             command_string = self.normalize_linefeeds(command_string)
@@ -2750,8 +2887,8 @@ class TelnetConnection(BaseConnection):
     def establish_connection(self, width=None, height=None):
         &#34;&#34;&#34;Establish SSH connection to the network device
 
-        Timeout will generate a NetMikoTimeoutException
-        Authentication failure will generate a NetMikoAuthenticationException
+        Timeout will generate a NetmikoTimeoutException
+        Authentication failure will generate a NetmikoAuthenticationException
 
         width and height are needed for Fortinet paging setting.
 
@@ -2781,19 +2918,17 @@ class TelnetConnection(BaseConnection):
                 msg = &#34;Connection to device timed-out: {device_type} {ip}:{port}&#34;.format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                raise NetMikoTimeoutException(msg)
+                raise NetmikoTimeoutException(msg)
             except paramiko.ssh_exception.AuthenticationException as auth_err:
                 self.paramiko_cleanup()
                 msg = &#34;Authentication failure: unable to connect {device_type} {ip}:{port}&#34;.format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                msg += self.RETURN + text_type(auth_err)
-                raise NetMikoAuthenticationException(msg)
+                msg += self.RETURN + str(auth_err)
+                raise NetmikoAuthenticationException(msg)
 
             if self.verbose:
-                print(
-                    &#34;SSH connection established to {}:{}&#34;.format(self.host, self.port)
-                )
+                print(f&#34;SSH connection established to {self.host}:{self.port}&#34;)
 
             # Use invoke_shell to establish an &#39;interactive session&#39;
             if width and height:
@@ -2850,7 +2985,7 @@ class TelnetConnection(BaseConnection):
         if new_data:
             return new_data
         else:
-            raise NetMikoTimeoutException(&#34;Timed out waiting for data&#34;)
+            raise NetmikoTimeoutException(&#34;Timed out waiting for data&#34;)
 
     def _build_ssh_client(self):
         &#34;&#34;&#34;Prepare for Paramiko SSH connection.&#34;&#34;&#34;
@@ -2904,12 +3039,11 @@ class TelnetConnection(BaseConnection):
         self.clear_buffer()
         command = self.normalize_cmd(command)
         log.debug(&#34;In disable_paging&#34;)
-        log.debug(&#34;Command: {0}&#34;.format(command))
+        log.debug(f&#34;Command: {command}&#34;)
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
-        log.debug(&#34;{0}&#34;.format(output))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
+        log.debug(f&#34;{output}&#34;)
         log.debug(&#34;Exiting disable_paging&#34;)
         return output
 
@@ -2930,9 +3064,8 @@ class TelnetConnection(BaseConnection):
         delay_factor = self.select_delay_factor(delay_factor)
         command = self.normalize_cmd(command)
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
         return output
 
     def set_base_prompt(
@@ -2959,7 +3092,7 @@ class TelnetConnection(BaseConnection):
         &#34;&#34;&#34;
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {0}&#34;.format(repr(prompt)))
+            raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
         # Strip off trailing terminator
         self.base_prompt = prompt[:-1]
         return self.base_prompt
@@ -2973,24 +3106,26 @@ class TelnetConnection(BaseConnection):
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
         self.write_channel(self.RETURN)
-        time.sleep(delay_factor * 0.1)
+        sleep_time = delay_factor * 0.1
+        time.sleep(sleep_time)
 
         # Initial attempt to get prompt
         prompt = self.read_channel()
-        if self.ansi_escape_codes:
-            prompt = self.strip_ansi_escape_codes(prompt)
 
         # Check if the only thing you received was a newline
         count = 0
         prompt = prompt.strip()
-        while count &lt;= 10 and not prompt:
+        while count &lt;= 12 and not prompt:
             prompt = self.read_channel().strip()
-            if prompt:
-                if self.ansi_escape_codes:
-                    prompt = self.strip_ansi_escape_codes(prompt).strip()
-            else:
+            if not prompt:
                 self.write_channel(self.RETURN)
-                time.sleep(delay_factor * 0.1)
+                # log.debug(f&#34;find_prompt sleep time: {sleep_time}&#34;)
+                time.sleep(sleep_time)
+                if sleep_time &lt;= 3:
+                    # Double the sleep_time when it is small
+                    sleep_time *= 2
+                else:
+                    sleep_time += 1
             count += 1
 
         # If multiple lines in the output take the last line
@@ -2998,14 +3133,25 @@ class TelnetConnection(BaseConnection):
         prompt = prompt.split(self.RESPONSE_RETURN)[-1]
         prompt = prompt.strip()
         if not prompt:
-            raise ValueError(&#34;Unable to find prompt: {}&#34;.format(prompt))
+            raise ValueError(f&#34;Unable to find prompt: {prompt}&#34;)
         time.sleep(delay_factor * 0.1)
         self.clear_buffer()
+        log.debug(f&#34;[find_prompt()]: prompt is {prompt}&#34;)
         return prompt
 
-    def clear_buffer(self):
+    def clear_buffer(self, backoff=True):
         &#34;&#34;&#34;Read any data available in the channel.&#34;&#34;&#34;
-        self.read_channel()
+        sleep_time = 0.1 * self.global_delay_factor
+        for _ in range(10):
+            time.sleep(sleep_time)
+            data = self.read_channel()
+            if not data:
+                break
+            # Double sleep time each time we detect data
+            log.debug(&#34;Clear buffer detects data in the channel&#34;)
+            if backoff:
+                sleep_time *= 2
+                sleep_time = 3 if sleep_time &gt;= 3 else sleep_time
 
     def send_command_timing(
         self,
@@ -3016,7 +3162,9 @@ class TelnetConnection(BaseConnection):
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
+        cmd_echo=False,
     ):
         &#34;&#34;&#34;Execute command_string on the SSH channel using a delay-based mechanism. Generally
         used for show commands.
@@ -3041,10 +3189,17 @@ class TelnetConnection(BaseConnection):
         :type normalize: bool
 
         :param use_textfsm: Process command output through TextFSM template (default: False).
-        :type normalize: bool
+        :type use_textfsm: bool
+
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+        :type textfsm_template: str
 
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
-        :type normalize: bool
+        :type use_genie: bool
+
+        :param cmd_echo: Verify command echo before proceeding (default: False).
+        :type cmd_echo: bool
         &#34;&#34;&#34;
         output = &#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
@@ -3053,7 +3208,27 @@ class TelnetConnection(BaseConnection):
             command_string = self.normalize_cmd(command_string)
 
         self.write_channel(command_string)
-        output = self._read_channel_timing(
+
+        cmd = command_string.strip()
+        # if cmd is just an &#34;enter&#34; skip this section
+        if cmd and cmd_echo:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+
+            # Strip off everything before the command echo
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                output = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
+            else:
+                # cmd is in the actual output (not just echoed)
+                output = new_data
+
+        log.debug(f&#34;send_command_timing current output: {output}&#34;)
+
+        output += self._read_channel_timing(
             delay_factor=delay_factor, max_loops=max_loops
         )
         output = self._sanitize_output(
@@ -3062,18 +3237,27 @@ class TelnetConnection(BaseConnection):
             command_string=command_string,
             strip_prompt=strip_prompt,
         )
+
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+
+        log.debug(f&#34;send_command_timing final output: {output}&#34;)
         return output
 
     def strip_prompt(self, a_string):
@@ -3127,6 +3311,7 @@ class TelnetConnection(BaseConnection):
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
     ):
         &#34;&#34;&#34;Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -3160,6 +3345,9 @@ class TelnetConnection(BaseConnection):
         :param use_textfsm: Process command output through TextFSM template (default: False).
         :type normalize: bool
 
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
         :type normalize: bool
         &#34;&#34;&#34;
@@ -3192,6 +3380,20 @@ class TelnetConnection(BaseConnection):
         time.sleep(delay_factor * loop_delay)
         self.clear_buffer()
         self.write_channel(command_string)
+        new_data = &#34;&#34;
+
+        cmd = command_string.strip()
+        # if cmd is just and &#34;enter&#34; skip this section
+        if cmd:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+            # Strip off everything before the command echo (to avoid false positives on the prompt)
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                new_data = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
 
         i = 1
         output = &#34;&#34;
@@ -3200,11 +3402,7 @@ class TelnetConnection(BaseConnection):
 
         # Keep reading data until search_pattern is found or until max_loops is reached.
         while i &lt;= max_loops:
-            new_data = self.read_channel()
             if new_data:
-                if self.ansi_escape_codes:
-                    new_data = self.strip_ansi_escape_codes(new_data)
-
                 output += new_data
                 past_three_reads.append(new_data)
 
@@ -3225,6 +3423,7 @@ class TelnetConnection(BaseConnection):
 
             time.sleep(delay_factor * loop_delay)
             i += 1
+            new_data = self.read_channel()
         else:  # nobreak
             raise IOError(
                 &#34;Search pattern never detected in send_command_expect: {}&#34;.format(
@@ -3240,17 +3439,23 @@ class TelnetConnection(BaseConnection):
         )
 
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
         return output
 
     def send_command_expect(self, *args, **kwargs):
@@ -3291,12 +3496,17 @@ class TelnetConnection(BaseConnection):
         # Check for line wrap (remove backspaces)
         if backspace_char in output:
             output = output.replace(backspace_char, &#34;&#34;)
+
+        # Juniper has a weird case where the echoed command will be &#34; \n&#34;
+        # i.e. there is an extra space there.
+        cmd = command_string.strip()
+        if output.startswith(cmd):
             output_lines = output.split(self.RESPONSE_RETURN)
             new_output = output_lines[1:]
             return self.RESPONSE_RETURN.join(new_output)
         else:
-            command_length = len(command_string)
-            return output[command_length:]
+            # command_string isn&#39;t there; do nothing
+            return output
 
     def normalize_linefeeds(self, a_string):
         &#34;&#34;&#34;Convert `\r\r\n`,`\r\n`, `\n\r` to `\n.`
@@ -3358,7 +3568,7 @@ class TelnetConnection(BaseConnection):
                 )
                 self.write_channel(self.normalize_cmd(self.secret))
                 output += self.read_until_prompt()
-            except NetMikoTimeoutException:
+            except NetmikoTimeoutException:
                 raise ValueError(msg)
             if not self.check_enable_mode():
                 raise ValueError(msg)
@@ -3407,7 +3617,10 @@ class TelnetConnection(BaseConnection):
         output = &#34;&#34;
         if not self.check_config_mode():
             self.write_channel(self.normalize_cmd(config_command))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(config_command.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if not self.check_config_mode():
                 raise ValueError(&#34;Failed to enter configuration mode.&#34;)
         return output
@@ -3424,10 +3637,13 @@ class TelnetConnection(BaseConnection):
         output = &#34;&#34;
         if self.check_config_mode():
             self.write_channel(self.normalize_cmd(exit_config))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(exit_config.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if self.check_config_mode():
                 raise ValueError(&#34;Failed to exit configuration mode&#34;)
-        log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+        log.debug(f&#34;exit_config_mode: {output}&#34;)
         return output
 
     def send_config_from_file(self, config_file=None, **kwargs):
@@ -3457,6 +3673,8 @@ class TelnetConnection(BaseConnection):
         strip_prompt=False,
         strip_command=False,
         config_mode_command=None,
+        cmd_verify=True,
+        enter_config_mode=True,
     ):
         &#34;&#34;&#34;
         Send configuration commands down the SSH channel.
@@ -3486,34 +3704,64 @@ class TelnetConnection(BaseConnection):
 
         :param config_mode_command: The command to enter into config mode
         :type config_mode_command: str
+
+        :param cmd_verify: Whether or not to verify command echo for each command in config_set
+        :type cmd_verify: bool
+
+        :param enter_config_mode: Do you enter config mode before sending config commands
+        :type exit_config_mode: bool
+
         &#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
         if config_commands is None:
             return &#34;&#34;
-        elif isinstance(config_commands, string_types):
+        elif isinstance(config_commands, str):
             config_commands = (config_commands,)
 
         if not hasattr(config_commands, &#34;__iter__&#34;):
             raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
 
         # Send config commands
-        cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
-        output = self.config_mode(*cfg_mode_args)
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            if self.fast_cli:
-                pass
-            else:
+        if enter_config_mode:
+            cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
+            output = self.config_mode(*cfg_mode_args)
+
+        if self.fast_cli:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        elif not cmd_verify:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
                 time.sleep(delay_factor * 0.05)
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        else:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+
+                # Make sure command is echoed
+                new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
+                output += new_output
+
+                # We might capture next prompt in the original read
+                pattern = f&#34;(?:{re.escape(self.base_prompt)}|#)&#34;
+                if not re.search(pattern, new_output):
+                    # Make sure trailing prompt comes back (after command)
+                    # NX-OS has fast-buffering problem where it immediately echoes command
+                    # Even though the device hasn&#39;t caught up with processing command.
+                    new_output = self.read_until_pattern(pattern=pattern)
+                    output += new_output
 
-        # Gather output
-        output += self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
-        )
         if exit_config_mode:
             output += self.exit_config_mode()
         output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
+        log.debug(f&#34;{output}&#34;)
         return output
 
     def strip_ansi_escape_codes(self, string_buffer):
@@ -3547,7 +3795,7 @@ class TelnetConnection(BaseConnection):
         :type string_buffer: str
         &#34;&#34;&#34;  # noqa
         log.debug(&#34;In strip_ansi_escape_codes&#34;)
-        log.debug(&#34;repr = {}&#34;.format(repr(string_buffer)))
+        log.debug(f&#34;repr = {repr(string_buffer)}&#34;)
 
         code_position_cursor = chr(27) + r&#34;\[\d+;\d+H&#34;
         code_show_cursor = chr(27) + r&#34;\[\?25h&#34;
@@ -3603,8 +3851,9 @@ class TelnetConnection(BaseConnection):
         # CODE_NEXT_LINE must substitute with return
         output = re.sub(code_next_line, self.RETURN, output)
 
-        log.debug(&#34;new_output = {0}&#34;.format(output))
-        log.debug(&#34;repr = {0}&#34;.format(repr(output)))
+        log.debug(&#34;Stripping ANSI escape codes&#34;)
+        log.debug(f&#34;new_output = {output}&#34;)
+        log.debug(f&#34;repr = {repr(output)}&#34;)
 
         return output
 
@@ -3646,9 +3895,9 @@ class TelnetConnection(BaseConnection):
     def open_session_log(self, filename, mode=&#34;write&#34;):
         &#34;&#34;&#34;Open the session_log file.&#34;&#34;&#34;
         if mode == &#34;append&#34;:
-            self.session_log = open(filename, mode=&#34;ab&#34;)
+            self.session_log = open(filename, mode=&#34;a&#34;)
         else:
-            self.session_log = open(filename, mode=&#34;wb&#34;)
+            self.session_log = open(filename, mode=&#34;w&#34;)
         self._session_log_close = True
 
     def close_session_log(self):
@@ -3662,13 +3911,16 @@ class TelnetConnection(BaseConnection):
 <li><a title="netmiko.base_connection.TelnetConnection" href="#netmiko.base_connection.TelnetConnection">TelnetConnection</a></li>
 <li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
 <li><a title="netmiko.checkpoint.checkpoint_gaia_ssh.CheckPointGaiaSSH" href="checkpoint/checkpoint_gaia_ssh.html#netmiko.checkpoint.checkpoint_gaia_ssh.CheckPointGaiaSSH">CheckPointGaiaSSH</a></li>
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="ciena/ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></li>
 <li><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH" href="cisco/cisco_wlc_ssh.html#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH">CiscoWlcSSH</a></li>
 <li><a title="netmiko.citrix.netscaler_ssh.NetscalerSSH" href="citrix/netscaler_ssh.html#netmiko.citrix.netscaler_ssh.NetscalerSSH">NetscalerSSH</a></li>
 <li><a title="netmiko.dell.dell_isilon_ssh.DellIsilonSSH" href="dell/dell_isilon_ssh.html#netmiko.dell.dell_isilon_ssh.DellIsilonSSH">DellIsilonSSH</a></li>
 <li><a title="netmiko.f5.f5_tmsh_ssh.F5TmshSSH" href="f5/f5_tmsh_ssh.html#netmiko.f5.f5_tmsh_ssh.F5TmshSSH">F5TmshSSH</a></li>
 <li><a title="netmiko.flexvnf.flexvnf_ssh.FlexvnfSSH" href="flexvnf/flexvnf_ssh.html#netmiko.flexvnf.flexvnf_ssh.FlexvnfSSH">FlexvnfSSH</a></li>
 <li><a title="netmiko.juniper.juniper.JuniperBase" href="juniper/juniper.html#netmiko.juniper.juniper.JuniperBase">JuniperBase</a></li>
+<li><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH" href="juniper/juniper_screenos.html#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH">JuniperScreenOsSSH</a></li>
 <li><a title="netmiko.netapp.netapp_cdot_ssh.NetAppcDotSSH" href="netapp/netapp_cdot_ssh.html#netmiko.netapp.netapp_cdot_ssh.NetAppcDotSSH">NetAppcDotSSH</a></li>
+<li><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH" href="nokia/nokia_sros_ssh.html#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH">NokiaSrosSSH</a></li>
 <li><a title="netmiko.paloalto.paloalto_panos.PaloAltoPanosBase" href="paloalto/paloalto_panos.html#netmiko.paloalto.paloalto_panos.PaloAltoPanosBase">PaloAltoPanosBase</a></li>
 <li><a title="netmiko.pluribus.pluribus_ssh.PluribusSSH" href="pluribus/pluribus_ssh.html#netmiko.pluribus.pluribus_ssh.PluribusSSH">PluribusSSH</a></li>
 <li><a title="netmiko.rad.rad_etx.RadETXBase" href="rad/rad_etx.html#netmiko.rad.rad_etx.RadETXBase">RadETXBase</a></li>
@@ -3761,15 +4013,25 @@ def strip_backspaces(output):
 </details>
 </dd>
 <dt id="netmiko.base_connection.BaseConnection.clear_buffer"><code class="name flex">
-<span>def <span class="ident">clear_buffer</span></span>(<span>self)</span>
+<span>def <span class="ident">clear_buffer</span></span>(<span>self, backoff=True)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Read any data available in the channel.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def clear_buffer(self):
+<pre><code class="python">def clear_buffer(self, backoff=True):
     &#34;&#34;&#34;Read any data available in the channel.&#34;&#34;&#34;
-    self.read_channel()</code></pre>
+    sleep_time = 0.1 * self.global_delay_factor
+    for _ in range(10):
+        time.sleep(sleep_time)
+        data = self.read_channel()
+        if not data:
+            break
+        # Double sleep time each time we detect data
+        log.debug(&#34;Clear buffer detects data in the channel&#34;)
+        if backoff:
+            sleep_time *= 2
+            sleep_time = 3 if sleep_time &gt;= 3 else sleep_time</code></pre>
 </details>
 </dd>
 <dt id="netmiko.base_connection.BaseConnection.close_session_log"><code class="name flex">
@@ -3821,7 +4083,10 @@ def strip_backspaces(output):
     output = &#34;&#34;
     if not self.check_config_mode():
         self.write_channel(self.normalize_cmd(config_command))
-        output = self.read_until_pattern(pattern=pattern)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output += self.read_until_pattern(pattern=re.escape(config_command.strip()))
+        if not re.search(pattern, output, flags=re.M):
+            output += self.read_until_pattern(pattern=pattern)
         if not self.check_config_mode():
             raise ValueError(&#34;Failed to enter configuration mode.&#34;)
     return output</code></pre>
@@ -3852,12 +4117,11 @@ def strip_backspaces(output):
     self.clear_buffer()
     command = self.normalize_cmd(command)
     log.debug(&#34;In disable_paging&#34;)
-    log.debug(&#34;Command: {0}&#34;.format(command))
+    log.debug(f&#34;Command: {command}&#34;)
     self.write_channel(command)
-    output = self.read_until_prompt()
-    if self.ansi_escape_codes:
-        output = self.strip_ansi_escape_codes(output)
-    log.debug(&#34;{0}&#34;.format(output))
+    # Make sure you read until you detect the command echo (avoid getting out of sync)
+    output = self.read_until_pattern(pattern=re.escape(command.strip()))
+    log.debug(f&#34;{output}&#34;)
     log.debug(&#34;Exiting disable_paging&#34;)
     return output</code></pre>
 </details>
@@ -3926,7 +4190,7 @@ def strip_backspaces(output):
             )
             self.write_channel(self.normalize_cmd(self.secret))
             output += self.read_until_prompt()
-        except NetMikoTimeoutException:
+        except NetmikoTimeoutException:
             raise ValueError(msg)
         if not self.check_enable_mode():
             raise ValueError(msg)
@@ -3938,8 +4202,8 @@ def strip_backspaces(output):
 </code></dt>
 <dd>
 <section class="desc"><p>Establish SSH connection to the network device</p>
-<p>Timeout will generate a NetMikoTimeoutException
-Authentication failure will generate a NetMikoAuthenticationException</p>
+<p>Timeout will generate a NetmikoTimeoutException
+Authentication failure will generate a NetmikoAuthenticationException</p>
 <p>width and height are needed for Fortinet paging setting.</p>
 <p>:param width: Specified width of the VT100 terminal window
 :type width: int</p>
@@ -3950,8 +4214,8 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
 <pre><code class="python">def establish_connection(self, width=None, height=None):
     &#34;&#34;&#34;Establish SSH connection to the network device
 
-    Timeout will generate a NetMikoTimeoutException
-    Authentication failure will generate a NetMikoAuthenticationException
+    Timeout will generate a NetmikoTimeoutException
+    Authentication failure will generate a NetmikoAuthenticationException
 
     width and height are needed for Fortinet paging setting.
 
@@ -3981,19 +4245,17 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
             msg = &#34;Connection to device timed-out: {device_type} {ip}:{port}&#34;.format(
                 device_type=self.device_type, ip=self.host, port=self.port
             )
-            raise NetMikoTimeoutException(msg)
+            raise NetmikoTimeoutException(msg)
         except paramiko.ssh_exception.AuthenticationException as auth_err:
             self.paramiko_cleanup()
             msg = &#34;Authentication failure: unable to connect {device_type} {ip}:{port}&#34;.format(
                 device_type=self.device_type, ip=self.host, port=self.port
             )
-            msg += self.RETURN + text_type(auth_err)
-            raise NetMikoAuthenticationException(msg)
+            msg += self.RETURN + str(auth_err)
+            raise NetmikoAuthenticationException(msg)
 
         if self.verbose:
-            print(
-                &#34;SSH connection established to {}:{}&#34;.format(self.host, self.port)
-            )
+            print(f&#34;SSH connection established to {self.host}:{self.port}&#34;)
 
         # Use invoke_shell to establish an &#39;interactive session&#39;
         if width and height:
@@ -4035,10 +4297,13 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
     output = &#34;&#34;
     if self.check_config_mode():
         self.write_channel(self.normalize_cmd(exit_config))
-        output = self.read_until_pattern(pattern=pattern)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output += self.read_until_pattern(pattern=re.escape(exit_config.strip()))
+        if not re.search(pattern, output, flags=re.M):
+            output += self.read_until_pattern(pattern=pattern)
         if self.check_config_mode():
             raise ValueError(&#34;Failed to exit configuration mode&#34;)
-    log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+    log.debug(f&#34;exit_config_mode: {output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -4084,24 +4349,26 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
     delay_factor = self.select_delay_factor(delay_factor)
     self.clear_buffer()
     self.write_channel(self.RETURN)
-    time.sleep(delay_factor * 0.1)
+    sleep_time = delay_factor * 0.1
+    time.sleep(sleep_time)
 
     # Initial attempt to get prompt
     prompt = self.read_channel()
-    if self.ansi_escape_codes:
-        prompt = self.strip_ansi_escape_codes(prompt)
 
     # Check if the only thing you received was a newline
     count = 0
     prompt = prompt.strip()
-    while count &lt;= 10 and not prompt:
+    while count &lt;= 12 and not prompt:
         prompt = self.read_channel().strip()
-        if prompt:
-            if self.ansi_escape_codes:
-                prompt = self.strip_ansi_escape_codes(prompt).strip()
-        else:
+        if not prompt:
             self.write_channel(self.RETURN)
-            time.sleep(delay_factor * 0.1)
+            # log.debug(f&#34;find_prompt sleep time: {sleep_time}&#34;)
+            time.sleep(sleep_time)
+            if sleep_time &lt;= 3:
+                # Double the sleep_time when it is small
+                sleep_time *= 2
+            else:
+                sleep_time += 1
         count += 1
 
     # If multiple lines in the output take the last line
@@ -4109,9 +4376,10 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
     prompt = prompt.split(self.RESPONSE_RETURN)[-1]
     prompt = prompt.strip()
     if not prompt:
-        raise ValueError(&#34;Unable to find prompt: {}&#34;.format(prompt))
+        raise ValueError(f&#34;Unable to find prompt: {prompt}&#34;)
     time.sleep(delay_factor * 0.1)
     self.clear_buffer()
+    log.debug(f&#34;[find_prompt()]: prompt is {prompt}&#34;)
     return prompt</code></pre>
 </details>
 </dd>
@@ -4215,9 +4483,9 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
 <pre><code class="python">def open_session_log(self, filename, mode=&#34;write&#34;):
     &#34;&#34;&#34;Open the session_log file.&#34;&#34;&#34;
     if mode == &#34;append&#34;:
-        self.session_log = open(filename, mode=&#34;ab&#34;)
+        self.session_log = open(filename, mode=&#34;a&#34;)
     else:
-        self.session_log = open(filename, mode=&#34;wb&#34;)
+        self.session_log = open(filename, mode=&#34;w&#34;)
     self._session_log_close = True</code></pre>
 </details>
 </dd>
@@ -4353,7 +4621,7 @@ In fast_cli choose the lesser of delay_factor of self.global_delay_factor.</p>
 </details>
 </dd>
 <dt id="netmiko.base_connection.BaseConnection.send_command"><code class="name flex">
-<span>def <span class="ident">send_command</span></span>(<span>self, command_string, expect_string=None, delay_factor=1, max_loops=500, auto_find_prompt=True, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, use_genie=False)</span>
+<span>def <span class="ident">send_command</span></span>(<span>self, command_string, expect_string=None, delay_factor=1, max_loops=500, auto_find_prompt=True, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, textfsm_template=None, use_genie=False)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -4378,6 +4646,8 @@ based upon self.timeout.
 :type normalize: bool</p>
 <p>:param use_textfsm: Process command output through TextFSM template (default: False).
 :type normalize: bool</p>
+<p>:param textfsm_template: Name of template to parse output with; can be fully qualified
+path, relative path, or name of file in current directory. (default: None).</p>
 <p>:param use_genie: Process command output through PyATS/Genie parser (default: False).
 :type normalize: bool</p></section>
 <details class="source">
@@ -4393,6 +4663,7 @@ based upon self.timeout.
     strip_command=True,
     normalize=True,
     use_textfsm=False,
+    textfsm_template=None,
     use_genie=False,
 ):
     &#34;&#34;&#34;Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -4426,6 +4697,9 @@ based upon self.timeout.
     :param use_textfsm: Process command output through TextFSM template (default: False).
     :type normalize: bool
 
+    :param textfsm_template: Name of template to parse output with; can be fully qualified
+        path, relative path, or name of file in current directory. (default: None).
+
     :param use_genie: Process command output through PyATS/Genie parser (default: False).
     :type normalize: bool
     &#34;&#34;&#34;
@@ -4458,6 +4732,20 @@ based upon self.timeout.
     time.sleep(delay_factor * loop_delay)
     self.clear_buffer()
     self.write_channel(command_string)
+    new_data = &#34;&#34;
+
+    cmd = command_string.strip()
+    # if cmd is just and &#34;enter&#34; skip this section
+    if cmd:
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        new_data = self.read_until_pattern(pattern=re.escape(cmd))
+        new_data = self.normalize_linefeeds(new_data)
+        # Strip off everything before the command echo (to avoid false positives on the prompt)
+        if new_data.count(cmd) == 1:
+            new_data = new_data.split(cmd)[1:]
+            new_data = self.RESPONSE_RETURN.join(new_data)
+            new_data = new_data.lstrip()
+            new_data = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
 
     i = 1
     output = &#34;&#34;
@@ -4466,11 +4754,7 @@ based upon self.timeout.
 
     # Keep reading data until search_pattern is found or until max_loops is reached.
     while i &lt;= max_loops:
-        new_data = self.read_channel()
         if new_data:
-            if self.ansi_escape_codes:
-                new_data = self.strip_ansi_escape_codes(new_data)
-
             output += new_data
             past_three_reads.append(new_data)
 
@@ -4491,6 +4775,7 @@ based upon self.timeout.
 
         time.sleep(delay_factor * loop_delay)
         i += 1
+        new_data = self.read_channel()
     else:  # nobreak
         raise IOError(
             &#34;Search pattern never detected in send_command_expect: {}&#34;.format(
@@ -4506,17 +4791,23 @@ based upon self.timeout.
     )
 
     # If both TextFSM and Genie are set, try TextFSM then Genie
-    for parser_flag, parser_func in (
-        (use_textfsm, get_structured_data),
-        (use_genie, get_structured_data_genie),
-    ):
-        if parser_flag:
-            structured_output = parser_func(
-                output, platform=self.device_type, command=command_string.strip()
-            )
-            # If we have structured data; return it.
-            if not isinstance(structured_output, string_types):
-                return structured_output
+    if use_textfsm:
+        structured_output = get_structured_data(
+            output,
+            platform=self.device_type,
+            command=command_string.strip(),
+            template=textfsm_template,
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
+    if use_genie:
+        structured_output = get_structured_data_genie(
+            output, platform=self.device_type, command=command_string.strip()
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
     return output</code></pre>
 </details>
 </dd>
@@ -4544,7 +4835,7 @@ based upon self.timeout.
 </details>
 </dd>
 <dt id="netmiko.base_connection.BaseConnection.send_command_timing"><code class="name flex">
-<span>def <span class="ident">send_command_timing</span></span>(<span>self, command_string, delay_factor=1, max_loops=150, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, use_genie=False)</span>
+<span>def <span class="ident">send_command_timing</span></span>(<span>self, command_string, delay_factor=1, max_loops=150, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, textfsm_template=None, use_genie=False, cmd_echo=False)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Execute command_string on the SSH channel using a delay-based mechanism. Generally
@@ -4563,9 +4854,14 @@ based upon self.timeout.
 <p>:param normalize: Ensure the proper enter is sent at end of command (default: True).
 :type normalize: bool</p>
 <p>:param use_textfsm: Process command output through TextFSM template (default: False).
-:type normalize: bool</p>
+:type use_textfsm: bool</p>
+<p>:param textfsm_template: Name of template to parse output with; can be fully qualified
+path, relative path, or name of file in current directory. (default: None).
+:type textfsm_template: str</p>
 <p>:param use_genie: Process command output through PyATS/Genie parser (default: False).
-:type normalize: bool</p></section>
+:type use_genie: bool</p>
+<p>:param cmd_echo: Verify command echo before proceeding (default: False).
+:type cmd_echo: bool</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def send_command_timing(
@@ -4577,7 +4873,9 @@ based upon self.timeout.
     strip_command=True,
     normalize=True,
     use_textfsm=False,
+    textfsm_template=None,
     use_genie=False,
+    cmd_echo=False,
 ):
     &#34;&#34;&#34;Execute command_string on the SSH channel using a delay-based mechanism. Generally
     used for show commands.
@@ -4602,10 +4900,17 @@ based upon self.timeout.
     :type normalize: bool
 
     :param use_textfsm: Process command output through TextFSM template (default: False).
-    :type normalize: bool
+    :type use_textfsm: bool
+
+    :param textfsm_template: Name of template to parse output with; can be fully qualified
+        path, relative path, or name of file in current directory. (default: None).
+    :type textfsm_template: str
 
     :param use_genie: Process command output through PyATS/Genie parser (default: False).
-    :type normalize: bool
+    :type use_genie: bool
+
+    :param cmd_echo: Verify command echo before proceeding (default: False).
+    :type cmd_echo: bool
     &#34;&#34;&#34;
     output = &#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor)
@@ -4614,7 +4919,27 @@ based upon self.timeout.
         command_string = self.normalize_cmd(command_string)
 
     self.write_channel(command_string)
-    output = self._read_channel_timing(
+
+    cmd = command_string.strip()
+    # if cmd is just an &#34;enter&#34; skip this section
+    if cmd and cmd_echo:
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        new_data = self.read_until_pattern(pattern=re.escape(cmd))
+        new_data = self.normalize_linefeeds(new_data)
+
+        # Strip off everything before the command echo
+        if new_data.count(cmd) == 1:
+            new_data = new_data.split(cmd)[1:]
+            new_data = self.RESPONSE_RETURN.join(new_data)
+            new_data = new_data.lstrip()
+            output = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
+        else:
+            # cmd is in the actual output (not just echoed)
+            output = new_data
+
+    log.debug(f&#34;send_command_timing current output: {output}&#34;)
+
+    output += self._read_channel_timing(
         delay_factor=delay_factor, max_loops=max_loops
     )
     output = self._sanitize_output(
@@ -4623,18 +4948,27 @@ based upon self.timeout.
         command_string=command_string,
         strip_prompt=strip_prompt,
     )
+
     # If both TextFSM and Genie are set, try TextFSM then Genie
-    for parser_flag, parser_func in (
-        (use_textfsm, get_structured_data),
-        (use_genie, get_structured_data_genie),
-    ):
-        if parser_flag:
-            structured_output = parser_func(
-                output, platform=self.device_type, command=command_string.strip()
-            )
-            # If we have structured data; return it.
-            if not isinstance(structured_output, string_types):
-                return structured_output
+    if use_textfsm:
+        structured_output = get_structured_data(
+            output,
+            platform=self.device_type,
+            command=command_string.strip(),
+            template=textfsm_template,
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
+    if use_genie:
+        structured_output = get_structured_data_genie(
+            output, platform=self.device_type, command=command_string.strip()
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
+
+    log.debug(f&#34;send_command_timing final output: {output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -4672,7 +5006,7 @@ SSH channel.</p>
 </details>
 </dd>
 <dt id="netmiko.base_connection.BaseConnection.send_config_set"><code class="name flex">
-<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=True, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None)</span>
+<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=True, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None, cmd_verify=True, enter_config_mode=True)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Send configuration commands down the SSH channel.</p>
@@ -4692,7 +5026,11 @@ The commands will be executed one after the other.</p>
 <p>:param strip_command: Determines whether or not to strip the command
 :type strip_command: bool</p>
 <p>:param config_mode_command: The command to enter into config mode
-:type config_mode_command: str</p></section>
+:type config_mode_command: str</p>
+<p>:param cmd_verify: Whether or not to verify command echo for each command in config_set
+:type cmd_verify: bool</p>
+<p>:param enter_config_mode: Do you enter config mode before sending config commands
+:type exit_config_mode: bool</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def send_config_set(
@@ -4704,6 +5042,8 @@ The commands will be executed one after the other.</p>
     strip_prompt=False,
     strip_command=False,
     config_mode_command=None,
+    cmd_verify=True,
+    enter_config_mode=True,
 ):
     &#34;&#34;&#34;
     Send configuration commands down the SSH channel.
@@ -4733,34 +5073,64 @@ The commands will be executed one after the other.</p>
 
     :param config_mode_command: The command to enter into config mode
     :type config_mode_command: str
+
+    :param cmd_verify: Whether or not to verify command echo for each command in config_set
+    :type cmd_verify: bool
+
+    :param enter_config_mode: Do you enter config mode before sending config commands
+    :type exit_config_mode: bool
+
     &#34;&#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor)
     if config_commands is None:
         return &#34;&#34;
-    elif isinstance(config_commands, string_types):
+    elif isinstance(config_commands, str):
         config_commands = (config_commands,)
 
     if not hasattr(config_commands, &#34;__iter__&#34;):
         raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
 
     # Send config commands
-    cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
-    output = self.config_mode(*cfg_mode_args)
-    for cmd in config_commands:
-        self.write_channel(self.normalize_cmd(cmd))
-        if self.fast_cli:
-            pass
-        else:
+    if enter_config_mode:
+        cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
+        output = self.config_mode(*cfg_mode_args)
+
+    if self.fast_cli:
+        for cmd in config_commands:
+            self.write_channel(self.normalize_cmd(cmd))
+        # Gather output
+        output += self._read_channel_timing(
+            delay_factor=delay_factor, max_loops=max_loops
+        )
+    elif not cmd_verify:
+        for cmd in config_commands:
+            self.write_channel(self.normalize_cmd(cmd))
             time.sleep(delay_factor * 0.05)
+        # Gather output
+        output += self._read_channel_timing(
+            delay_factor=delay_factor, max_loops=max_loops
+        )
+    else:
+        for cmd in config_commands:
+            self.write_channel(self.normalize_cmd(cmd))
+
+            # Make sure command is echoed
+            new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
+            output += new_output
+
+            # We might capture next prompt in the original read
+            pattern = f&#34;(?:{re.escape(self.base_prompt)}|#)&#34;
+            if not re.search(pattern, new_output):
+                # Make sure trailing prompt comes back (after command)
+                # NX-OS has fast-buffering problem where it immediately echoes command
+                # Even though the device hasn&#39;t caught up with processing command.
+                new_output = self.read_until_pattern(pattern=pattern)
+                output += new_output
 
-    # Gather output
-    output += self._read_channel_timing(
-        delay_factor=delay_factor, max_loops=max_loops
-    )
     if exit_config_mode:
         output += self.exit_config_mode()
     output = self._sanitize_output(output)
-    log.debug(&#34;{}&#34;.format(output))
+    log.debug(f&#34;{output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -4871,7 +5241,7 @@ entering/exiting config mode.</p>
     &#34;&#34;&#34;
     prompt = self.find_prompt(delay_factor=delay_factor)
     if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-        raise ValueError(&#34;Router prompt not found: {0}&#34;.format(repr(prompt)))
+        raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
     # Strip off trailing terminator
     self.base_prompt = prompt[:-1]
     return self.base_prompt</code></pre>
@@ -4907,9 +5277,8 @@ This causes the output to get distorted when accessed programmatically.</p>
     delay_factor = self.select_delay_factor(delay_factor)
     command = self.normalize_cmd(command)
     self.write_channel(command)
-    output = self.read_until_prompt()
-    if self.ansi_escape_codes:
-        output = self.strip_ansi_escape_codes(output)
+    # Make sure you read until you detect the command echo (avoid getting out of sync)
+    output = self.read_until_pattern(pattern=re.escape(command.strip()))
     return output</code></pre>
 </details>
 </dd>
@@ -4995,7 +5364,7 @@ Get cursor position</p>
     :type string_buffer: str
     &#34;&#34;&#34;  # noqa
     log.debug(&#34;In strip_ansi_escape_codes&#34;)
-    log.debug(&#34;repr = {}&#34;.format(repr(string_buffer)))
+    log.debug(f&#34;repr = {repr(string_buffer)}&#34;)
 
     code_position_cursor = chr(27) + r&#34;\[\d+;\d+H&#34;
     code_show_cursor = chr(27) + r&#34;\[\?25h&#34;
@@ -5051,8 +5420,9 @@ Get cursor position</p>
     # CODE_NEXT_LINE must substitute with return
     output = re.sub(code_next_line, self.RETURN, output)
 
-    log.debug(&#34;new_output = {0}&#34;.format(output))
-    log.debug(&#34;repr = {0}&#34;.format(repr(output)))
+    log.debug(&#34;Stripping ANSI escape codes&#34;)
+    log.debug(f&#34;new_output = {output}&#34;)
+    log.debug(f&#34;repr = {repr(output)}&#34;)
 
     return output</code></pre>
 </details>
@@ -5086,12 +5456,17 @@ Get cursor position</p>
     # Check for line wrap (remove backspaces)
     if backspace_char in output:
         output = output.replace(backspace_char, &#34;&#34;)
+
+    # Juniper has a weird case where the echoed command will be &#34; \n&#34;
+    # i.e. there is an extra space there.
+    cmd = command_string.strip()
+    if output.startswith(cmd):
         output_lines = output.split(self.RESPONSE_RETURN)
         new_output = output_lines[1:]
         return self.RESPONSE_RETURN.join(new_output)
     else:
-        command_length = len(command_string)
-        return output[command_length:]</code></pre>
+        # command_string isn&#39;t there; do nothing
+        return output</code></pre>
 </details>
 </dd>
 <dt id="netmiko.base_connection.BaseConnection.strip_prompt"><code class="name flex">
@@ -5200,8 +5575,8 @@ Get cursor position</p>
             i += 1
         except EOFError:
             self.remote_conn.close()
-            msg = &#34;Login failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Login failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
     # Last try to see if we already logged in
     self.write_channel(self.TELNET_RETURN)
@@ -5213,9 +5588,9 @@ Get cursor position</p>
     ):
         return return_msg
 
-    msg = &#34;Login failed: {}&#34;.format(self.host)
+    msg = f&#34;Login failed: {self.host}&#34;
     self.remote_conn.close()
-    raise NetMikoAuthenticationException(msg)</code></pre>
+    raise NetmikoAuthenticationException(msg)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.base_connection.BaseConnection.write_channel"><code class="name flex">
@@ -5245,7 +5620,7 @@ Get cursor position</p>
 </dd>
 <dt id="netmiko.base_connection.TelnetConnection"><code class="flex name class">
 <span>class <span class="ident">TelnetConnection</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -5366,6 +5741,10 @@ Get cursor position</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -5495,7 +5874,7 @@ Get cursor position</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/calix/calix_b6.html b/docs/netmiko/calix/calix_b6.html
index 0894e32f344e38f19c737cc6b977ed586b479701..774f5325660053520aebfb22d63a20ae9a29f94c 100644
--- a/docs/netmiko/calix/calix_b6.html
+++ b/docs/netmiko/calix/calix_b6.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.calix.calix_b6 API documentation</title>
 <meta name="description" content="Calix B6 SSH Driver for Netmiko" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,8 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Calix B6 SSH Driver for Netmiko&#34;&#34;&#34;
-from __future__ import unicode_literals
-
 import time
 from os import path
 
@@ -48,7 +46,7 @@ class CalixB6Base(CiscoSSHConnection):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(CalixB6Base, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -88,10 +86,10 @@ class CalixB6Base(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-        return super(CalixB6Base, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def save_config(self, cmd=&#34;copy run start&#34;, confirm=False, confirm_response=&#34;&#34;):
-        return super(CalixB6Base, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -260,6 +258,10 @@ class CalixB6Telnet(CalixB6Base):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -269,7 +271,7 @@ class CalixB6Telnet(CalixB6Base):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(CalixB6Base, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -309,10 +311,10 @@ class CalixB6Telnet(CalixB6Base):
 
     def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-        return super(CalixB6Base, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def save_config(self, cmd=&#34;copy run start&#34;, confirm=False, confirm_response=&#34;&#34;):
-        return super(CalixB6Base, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -338,7 +340,7 @@ class CalixB6Telnet(CalixB6Base):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-    return super(CalixB6Base, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.calix.calix_b6.CalixB6Base.session_preparation"><code class="name flex">
@@ -565,6 +567,10 @@ the username/password.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -771,6 +777,10 @@ the username/password.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -894,7 +904,7 @@ the username/password.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/calix/index.html b/docs/netmiko/calix/index.html
index a95f1b0cc1738426b63beb723b26840140448064..44e99ab2230e1978ee3d7891acdc170c6da34480 100644
--- a/docs/netmiko/calix/index.html
+++ b/docs/netmiko/calix/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.calix API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.calix.calix_b6 import CalixB6SSH, CalixB6Telnet
+<pre><code class="python">from netmiko.calix.calix_b6 import CalixB6SSH, CalixB6Telnet
 
 __all__ = [&#34;CalixB6SSH&#34;, &#34;CalixB6Telnet&#34;]</code></pre>
 </details>
@@ -168,6 +167,10 @@ the username/password.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -374,6 +377,10 @@ the username/password.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -470,7 +477,7 @@ the username/password.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/checkpoint/checkpoint_gaia_ssh.html b/docs/netmiko/checkpoint/checkpoint_gaia_ssh.html
index 76b0c314c8d78d4b925da48e73fe378ac9217244..8827c1899f992f6ac19542f1a9b235b37936bda6 100644
--- a/docs/netmiko/checkpoint/checkpoint_gaia_ssh.html
+++ b/docs/netmiko/checkpoint/checkpoint_gaia_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.checkpoint.checkpoint_gaia_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.base_connection import BaseConnection
 
 
@@ -70,7 +69,7 @@ class CheckPointGaiaSSH(BaseConnection):
 <dl>
 <dt id="netmiko.checkpoint.checkpoint_gaia_ssh.CheckPointGaiaSSH"><code class="flex name class">
 <span>class <span class="ident">CheckPointGaiaSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implements methods for communicating with Check Point Gaia
@@ -191,6 +190,10 @@ firewalls.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -353,7 +356,7 @@ firewalls.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/checkpoint/index.html b/docs/netmiko/checkpoint/index.html
index 80a88842c7e0e04de6efa8c206efd2b0d2a7b6ce..5df6431087c4476a856a47e06513a68f213ff278 100644
--- a/docs/netmiko/checkpoint/index.html
+++ b/docs/netmiko/checkpoint/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.checkpoint API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.checkpoint.checkpoint_gaia_ssh import CheckPointGaiaSSH
+<pre><code class="python">from netmiko.checkpoint.checkpoint_gaia_ssh import CheckPointGaiaSSH
 
 __all__ = [&#34;CheckPointGaiaSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;CheckPointGaiaSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.checkpoint.CheckPointGaiaSSH"><code class="flex name class">
 <span>class <span class="ident">CheckPointGaiaSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implements methods for communicating with Check Point Gaia
@@ -167,6 +166,10 @@ firewalls.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -334,7 +337,7 @@ firewalls.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ciena/ciena_saos.html b/docs/netmiko/ciena/ciena_saos.html
new file mode 100644
index 0000000000000000000000000000000000000000..1bdf1ed22d664c439aa08cd68018399528cca8e5
--- /dev/null
+++ b/docs/netmiko/ciena/ciena_saos.html
@@ -0,0 +1,1245 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.6.3" />
+<title>netmiko.ciena.ciena_saos API documentation</title>
+<meta name="description" content="Ciena SAOS support." />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>netmiko.ciena.ciena_saos</code></h1>
+</header>
+<section id="section-intro">
+<p>Ciena SAOS support.</p>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">&#34;&#34;&#34;Ciena SAOS support.&#34;&#34;&#34;
+import time
+import re
+import os
+from netmiko.base_connection import BaseConnection
+from netmiko.scp_handler import BaseFileTransfer
+
+
+class CienaSaosBase(BaseConnection):
+    &#34;&#34;&#34;
+    Ciena SAOS support.
+
+    Implements methods for interacting Ciena Saos devices.
+
+    Disables enable(), check_enable_mode(), config_mode() and
+    check_config_mode()
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;system shell session set more off&#34;)
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def _enter_shell(self):
+        &#34;&#34;&#34;Enter the Bourne Shell.&#34;&#34;&#34;
+        output = self.send_command(&#34;diag shell&#34;, expect_string=r&#34;[$#&gt;]&#34;)
+        if &#34;SHELL PARSER FAILURE&#34; in output:
+            msg = &#34;SCP support on Ciena SAOS requires &#39;diag shell&#39; permissions&#34;
+            raise ValueError(msg)
+        return output
+
+    def _return_cli(self):
+        &#34;&#34;&#34;Return to the Ciena SAOS CLI.&#34;&#34;&#34;
+        return self.send_command(&#34;exit&#34;, expect_string=r&#34;[&gt;]&#34;)
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+        return True
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_config_mode(self, check_string=&#34;&gt;&#34;, pattern=&#34;&#34;):
+        &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+        return False
+
+    def config_mode(self, config_command=&#34;&#34;):
+        &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_config_mode(self, exit_config=&#34;&#34;):
+        &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def save_config(self, cmd=&#34;configuration save&#34;, confirm=False, confirm_response=&#34;&#34;):
+        &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
+        return self.send_command(command_string=cmd)
+
+
+class CienaSaosSSH(CienaSaosBase):
+    pass
+
+
+class CienaSaosTelnet(CienaSaosBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get(&#34;default_enter&#34;)
+        kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)
+
+
+class CienaSaosFileTransfer(BaseFileTransfer):
+    &#34;&#34;&#34;Ciena SAOS SCP File Transfer driver.&#34;&#34;&#34;
+
+    def __init__(
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
+    ):
+        if file_system == &#34;&#34;:
+            file_system = f&#34;/tmp/users/{ssh_conn.username}&#34;
+        return super().__init__(
+            ssh_conn=ssh_conn,
+            source_file=source_file,
+            dest_file=dest_file,
+            file_system=file_system,
+            direction=direction,
+            **kwargs,
+        )
+
+    def remote_space_available(self, search_pattern=&#34;&#34;):
+        &#34;&#34;&#34;
+        Return space available on Ciena SAOS
+
+        Output should only have the file-system that matches {self.file_system}
+
+        Filesystem           1K-blocks      Used Available Use% Mounted on
+        tmpfs                  1048576       648   1047928   0% /tmp
+        &#34;&#34;&#34;
+        remote_cmd = f&#34;file vols -P {self.file_system}&#34;
+        remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+        remote_output = remote_output.strip()
+        err_msg = (
+            f&#34;Parsing error, unexpected output from {remote_cmd}:\n{remote_output}&#34;
+        )
+
+        # First line is the header; file_system_line is the output we care about
+        header_line, filesystem_line = remote_output.splitlines()
+
+        filesystem, _, _, space_avail, *_ = header_line.split()
+        if &#34;Filesystem&#34; != filesystem or &#34;Avail&#34; not in space_avail:
+            # Filesystem 1K-blocks Used Available Use% Mounted on
+            raise ValueError(err_msg)
+
+        # Normalize output - in certain outputs ciena will line wrap (this fixes that)
+        # Strip the extra newline
+        # /dev/mapper/EN--VOL-config
+        #                  4096      1476      2620  36% /etc/hosts
+        filesystem_line = re.sub(r&#34;(^\S+$)\n&#34;, r&#34;\1&#34;, filesystem_line, flags=re.M)
+
+        # Checks to make sure what was returned is what we expect
+        _, k_blocks, used, space_avail, _, _ = filesystem_line.split()
+        for integer_check in (k_blocks, used, space_avail):
+            try:
+                int(integer_check)
+            except ValueError:
+                raise ValueError(err_msg)
+
+        return int(space_avail) * 1024
+
+    def check_file_exists(self, remote_cmd=&#34;&#34;):
+        &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
+        if self.direction == &#34;put&#34;:
+            if not remote_cmd:
+                remote_cmd = f&#34;file ls {self.file_system}/{self.dest_file}&#34;
+            remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+            search_string = re.escape(f&#34;{self.file_system}/{self.dest_file}&#34;)
+            if &#34;ERROR&#34; in remote_out:
+                return False
+            elif re.search(search_string, remote_out):
+                return True
+            else:
+                raise ValueError(&#34;Unexpected output from check_file_exists&#34;)
+        elif self.direction == &#34;get&#34;:
+            return os.path.exists(self.dest_file)
+
+    def remote_file_size(self, remote_cmd=&#34;&#34;, remote_file=None):
+        &#34;&#34;&#34;Get the file size of the remote file.&#34;&#34;&#34;
+        if remote_file is None:
+            if self.direction == &#34;put&#34;:
+                remote_file = self.dest_file
+            elif self.direction == &#34;get&#34;:
+                remote_file = self.source_file
+
+        remote_file = f&#34;{self.file_system}/{remote_file}&#34;
+
+        if not remote_cmd:
+            remote_cmd = f&#34;file ls -l {remote_file}&#34;
+
+        remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+
+        if &#34;No such file or directory&#34; in remote_out:
+            raise IOError(&#34;Unable to find file on remote system&#34;)
+
+        escape_file_name = re.escape(remote_file)
+        pattern = r&#34;^.* ({}).*$&#34;.format(escape_file_name)
+        match = re.search(pattern, remote_out, flags=re.M)
+        if match:
+            # Format: -rw-r--r--  1 pyclass  wheel  12 Nov  5 19:07 /var/tmp/test3.txt
+            line = match.group(0)
+            file_size = line.split()[4]
+            return int(file_size)
+
+        raise ValueError(
+            &#34;Search pattern not found for remote file size during SCP transfer.&#34;
+        )
+
+    def remote_md5(self, base_cmd=&#34;&#34;, remote_file=None):
+        &#34;&#34;&#34;Calculate remote MD5 and returns the hash.
+
+        This command can be CPU intensive on the remote device.
+        &#34;&#34;&#34;
+        if base_cmd == &#34;&#34;:
+            base_cmd = &#34;md5sum&#34;
+        if remote_file is None:
+            if self.direction == &#34;put&#34;:
+                remote_file = self.dest_file
+            elif self.direction == &#34;get&#34;:
+                remote_file = self.source_file
+
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
+
+        self.ssh_ctl_chan._enter_shell()
+        dest_md5 = self.ssh_ctl_chan.send_command(
+            remote_md5_cmd, expect_string=r&#34;[$#&gt;]&#34;
+        )
+        self.ssh_ctl_chan._return_cli()
+        dest_md5 = self.process_md5(dest_md5, pattern=r&#34;([0-9a-f]+)\s+&#34;)
+        return dest_md5
+
+    def enable_scp(self, cmd=&#34;system server scp enable&#34;):
+        return super().enable_scp(cmd=cmd)
+
+    def disable_scp(self, cmd=&#34;system server scp disable&#34;):
+        return super().disable_scp(cmd=cmd)</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase"><code class="flex name class">
+<span>class <span class="ident">CienaSaosBase</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Ciena SAOS support.</p>
+<p>Implements methods for interacting Ciena Saos devices.</p>
+<p>Disables enable(), check_enable_mode(), config_mode() and
+check_config_mode()</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class CienaSaosBase(BaseConnection):
+    &#34;&#34;&#34;
+    Ciena SAOS support.
+
+    Implements methods for interacting Ciena Saos devices.
+
+    Disables enable(), check_enable_mode(), config_mode() and
+    check_config_mode()
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;system shell session set more off&#34;)
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def _enter_shell(self):
+        &#34;&#34;&#34;Enter the Bourne Shell.&#34;&#34;&#34;
+        output = self.send_command(&#34;diag shell&#34;, expect_string=r&#34;[$#&gt;]&#34;)
+        if &#34;SHELL PARSER FAILURE&#34; in output:
+            msg = &#34;SCP support on Ciena SAOS requires &#39;diag shell&#39; permissions&#34;
+            raise ValueError(msg)
+        return output
+
+    def _return_cli(self):
+        &#34;&#34;&#34;Return to the Ciena SAOS CLI.&#34;&#34;&#34;
+        return self.send_command(&#34;exit&#34;, expect_string=r&#34;[&gt;]&#34;)
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+        return True
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_config_mode(self, check_string=&#34;&gt;&#34;, pattern=&#34;&#34;):
+        &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+        return False
+
+    def config_mode(self, config_command=&#34;&#34;):
+        &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_config_mode(self, exit_config=&#34;&#34;):
+        &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def save_config(self, cmd=&#34;configuration save&#34;, confirm=False, confirm_response=&#34;&#34;):
+        &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
+        return self.send_command(command_string=cmd)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Subclasses</h3>
+<ul class="hlist">
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosSSH" href="#netmiko.ciena.ciena_saos.CienaSaosSSH">CienaSaosSSH</a></li>
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosTelnet" href="#netmiko.ciena.ciena_saos.CienaSaosTelnet">CienaSaosTelnet</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode"><code class="name flex">
+<span>def <span class="ident">check_config_mode</span></span>(<span>self, check_string='>', pattern='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No config mode on Ciena SAOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_config_mode(self, check_string=&#34;&gt;&#34;, pattern=&#34;&#34;):
+    &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+    return False</code></pre>
+</details>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode"><code class="name flex">
+<span>def <span class="ident">check_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Ciena SAOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+    return True</code></pre>
+</details>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase.config_mode"><code class="name flex">
+<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No config mode on Ciena SAOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def config_mode(self, config_command=&#34;&#34;):
+    &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase.enable"><code class="name flex">
+<span>def <span class="ident">enable</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Ciena SAOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def enable(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode"><code class="name flex">
+<span>def <span class="ident">exit_config_mode</span></span>(<span>self, exit_config='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No config mode on Ciena SAOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_config_mode(self, exit_config=&#34;&#34;):
+    &#34;&#34;&#34;No config mode on Ciena SAOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode"><code class="name flex">
+<span>def <span class="ident">exit_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Ciena SAOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Ciena SAOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosBase.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, cmd='configuration save', confirm=False, confirm_response='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Saves Config.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, cmd=&#34;configuration save&#34;, confirm=False, confirm_response=&#34;&#34;):
+    &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
+    return self.send_command(command_string=cmd)</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.base_connection.BaseConnection.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosFileTransfer"><code class="flex name class">
+<span>class <span class="ident">CienaSaosFileTransfer</span></span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='', direction='put', **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Ciena SAOS SCP File Transfer driver.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class CienaSaosFileTransfer(BaseFileTransfer):
+    &#34;&#34;&#34;Ciena SAOS SCP File Transfer driver.&#34;&#34;&#34;
+
+    def __init__(
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
+    ):
+        if file_system == &#34;&#34;:
+            file_system = f&#34;/tmp/users/{ssh_conn.username}&#34;
+        return super().__init__(
+            ssh_conn=ssh_conn,
+            source_file=source_file,
+            dest_file=dest_file,
+            file_system=file_system,
+            direction=direction,
+            **kwargs,
+        )
+
+    def remote_space_available(self, search_pattern=&#34;&#34;):
+        &#34;&#34;&#34;
+        Return space available on Ciena SAOS
+
+        Output should only have the file-system that matches {self.file_system}
+
+        Filesystem           1K-blocks      Used Available Use% Mounted on
+        tmpfs                  1048576       648   1047928   0% /tmp
+        &#34;&#34;&#34;
+        remote_cmd = f&#34;file vols -P {self.file_system}&#34;
+        remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+        remote_output = remote_output.strip()
+        err_msg = (
+            f&#34;Parsing error, unexpected output from {remote_cmd}:\n{remote_output}&#34;
+        )
+
+        # First line is the header; file_system_line is the output we care about
+        header_line, filesystem_line = remote_output.splitlines()
+
+        filesystem, _, _, space_avail, *_ = header_line.split()
+        if &#34;Filesystem&#34; != filesystem or &#34;Avail&#34; not in space_avail:
+            # Filesystem 1K-blocks Used Available Use% Mounted on
+            raise ValueError(err_msg)
+
+        # Normalize output - in certain outputs ciena will line wrap (this fixes that)
+        # Strip the extra newline
+        # /dev/mapper/EN--VOL-config
+        #                  4096      1476      2620  36% /etc/hosts
+        filesystem_line = re.sub(r&#34;(^\S+$)\n&#34;, r&#34;\1&#34;, filesystem_line, flags=re.M)
+
+        # Checks to make sure what was returned is what we expect
+        _, k_blocks, used, space_avail, _, _ = filesystem_line.split()
+        for integer_check in (k_blocks, used, space_avail):
+            try:
+                int(integer_check)
+            except ValueError:
+                raise ValueError(err_msg)
+
+        return int(space_avail) * 1024
+
+    def check_file_exists(self, remote_cmd=&#34;&#34;):
+        &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
+        if self.direction == &#34;put&#34;:
+            if not remote_cmd:
+                remote_cmd = f&#34;file ls {self.file_system}/{self.dest_file}&#34;
+            remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+            search_string = re.escape(f&#34;{self.file_system}/{self.dest_file}&#34;)
+            if &#34;ERROR&#34; in remote_out:
+                return False
+            elif re.search(search_string, remote_out):
+                return True
+            else:
+                raise ValueError(&#34;Unexpected output from check_file_exists&#34;)
+        elif self.direction == &#34;get&#34;:
+            return os.path.exists(self.dest_file)
+
+    def remote_file_size(self, remote_cmd=&#34;&#34;, remote_file=None):
+        &#34;&#34;&#34;Get the file size of the remote file.&#34;&#34;&#34;
+        if remote_file is None:
+            if self.direction == &#34;put&#34;:
+                remote_file = self.dest_file
+            elif self.direction == &#34;get&#34;:
+                remote_file = self.source_file
+
+        remote_file = f&#34;{self.file_system}/{remote_file}&#34;
+
+        if not remote_cmd:
+            remote_cmd = f&#34;file ls -l {remote_file}&#34;
+
+        remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+
+        if &#34;No such file or directory&#34; in remote_out:
+            raise IOError(&#34;Unable to find file on remote system&#34;)
+
+        escape_file_name = re.escape(remote_file)
+        pattern = r&#34;^.* ({}).*$&#34;.format(escape_file_name)
+        match = re.search(pattern, remote_out, flags=re.M)
+        if match:
+            # Format: -rw-r--r--  1 pyclass  wheel  12 Nov  5 19:07 /var/tmp/test3.txt
+            line = match.group(0)
+            file_size = line.split()[4]
+            return int(file_size)
+
+        raise ValueError(
+            &#34;Search pattern not found for remote file size during SCP transfer.&#34;
+        )
+
+    def remote_md5(self, base_cmd=&#34;&#34;, remote_file=None):
+        &#34;&#34;&#34;Calculate remote MD5 and returns the hash.
+
+        This command can be CPU intensive on the remote device.
+        &#34;&#34;&#34;
+        if base_cmd == &#34;&#34;:
+            base_cmd = &#34;md5sum&#34;
+        if remote_file is None:
+            if self.direction == &#34;put&#34;:
+                remote_file = self.dest_file
+            elif self.direction == &#34;get&#34;:
+                remote_file = self.source_file
+
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
+
+        self.ssh_ctl_chan._enter_shell()
+        dest_md5 = self.ssh_ctl_chan.send_command(
+            remote_md5_cmd, expect_string=r&#34;[$#&gt;]&#34;
+        )
+        self.ssh_ctl_chan._return_cli()
+        dest_md5 = self.process_md5(dest_md5, pattern=r&#34;([0-9a-f]+)\s+&#34;)
+        return dest_md5
+
+    def enable_scp(self, cmd=&#34;system server scp enable&#34;):
+        return super().enable_scp(cmd=cmd)
+
+    def disable_scp(self, cmd=&#34;system server scp disable&#34;):
+        return super().disable_scp(cmd=cmd)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.scp_handler.BaseFileTransfer" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer">BaseFileTransfer</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosFileTransfer.remote_space_available"><code class="name flex">
+<span>def <span class="ident">remote_space_available</span></span>(<span>self, search_pattern='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Return space available on Ciena SAOS</p>
+<p>Output should only have the file-system that matches {self.file_system}</p>
+<p>Filesystem
+1K-blocks
+Used Available Use% Mounted on
+tmpfs
+1048576
+648
+1047928
+0% /tmp</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def remote_space_available(self, search_pattern=&#34;&#34;):
+    &#34;&#34;&#34;
+    Return space available on Ciena SAOS
+
+    Output should only have the file-system that matches {self.file_system}
+
+    Filesystem           1K-blocks      Used Available Use% Mounted on
+    tmpfs                  1048576       648   1047928   0% /tmp
+    &#34;&#34;&#34;
+    remote_cmd = f&#34;file vols -P {self.file_system}&#34;
+    remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+    remote_output = remote_output.strip()
+    err_msg = (
+        f&#34;Parsing error, unexpected output from {remote_cmd}:\n{remote_output}&#34;
+    )
+
+    # First line is the header; file_system_line is the output we care about
+    header_line, filesystem_line = remote_output.splitlines()
+
+    filesystem, _, _, space_avail, *_ = header_line.split()
+    if &#34;Filesystem&#34; != filesystem or &#34;Avail&#34; not in space_avail:
+        # Filesystem 1K-blocks Used Available Use% Mounted on
+        raise ValueError(err_msg)
+
+    # Normalize output - in certain outputs ciena will line wrap (this fixes that)
+    # Strip the extra newline
+    # /dev/mapper/EN--VOL-config
+    #                  4096      1476      2620  36% /etc/hosts
+    filesystem_line = re.sub(r&#34;(^\S+$)\n&#34;, r&#34;\1&#34;, filesystem_line, flags=re.M)
+
+    # Checks to make sure what was returned is what we expect
+    _, k_blocks, used, space_avail, _, _ = filesystem_line.split()
+    for integer_check in (k_blocks, used, space_avail):
+        try:
+            int(integer_check)
+        except ValueError:
+            raise ValueError(err_msg)
+
+    return int(space_avail) * 1024</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.scp_handler.BaseFileTransfer" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer">BaseFileTransfer</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.check_file_exists" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.check_file_exists">check_file_exists</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.close_scp_chan" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.close_scp_chan">close_scp_chan</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.compare_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.compare_md5">compare_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.disable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.disable_scp">disable_scp</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.enable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.enable_scp">enable_scp</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.establish_scp_conn" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.establish_scp_conn">establish_scp_conn</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.file_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.file_md5">file_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.get_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.get_file">get_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.local_space_available" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.local_space_available">local_space_available</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.process_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.process_md5">process_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.put_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.put_file">put_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.remote_file_size" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.remote_file_size">remote_file_size</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.remote_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.remote_md5">remote_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.transfer_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.transfer_file">transfer_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.verify_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.verify_file">verify_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.verify_space_available" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.verify_space_available">verify_space_available</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosSSH"><code class="flex name class">
+<span>class <span class="ident">CienaSaosSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Ciena SAOS support.</p>
+<p>Implements methods for interacting Ciena Saos devices.</p>
+<p>Disables enable(), check_enable_mode(), config_mode() and
+check_config_mode()</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class CienaSaosSSH(CienaSaosBase):
+    pass</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.enable" href="#netmiko.ciena.ciena_saos.CienaSaosBase.enable">enable</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.save_config" href="#netmiko.ciena.ciena_saos.CienaSaosBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+<dt id="netmiko.ciena.ciena_saos.CienaSaosTelnet"><code class="flex name class">
+<span>class <span class="ident">CienaSaosTelnet</span></span>
+<span>(</span><span>*args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Ciena SAOS support.</p>
+<p>Implements methods for interacting Ciena Saos devices.</p>
+<p>Disables enable(), check_enable_mode(), config_mode() and
+check_config_mode()</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class CienaSaosTelnet(CienaSaosBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get(&#34;default_enter&#34;)
+        kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.enable" href="#netmiko.ciena.ciena_saos.CienaSaosBase.enable">enable</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.save_config" href="#netmiko.ciena.ciena_saos.CienaSaosBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="netmiko.ciena" href="index.html">netmiko.ciena</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></code></h4>
+<ul class="two-column">
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.enable" href="#netmiko.ciena.ciena_saos.CienaSaosBase.enable">enable</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode" href="#netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.save_config" href="#netmiko.ciena.ciena_saos.CienaSaosBase.save_config">save_config</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="netmiko.ciena.ciena_saos.CienaSaosFileTransfer" href="#netmiko.ciena.ciena_saos.CienaSaosFileTransfer">CienaSaosFileTransfer</a></code></h4>
+<ul class="">
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosFileTransfer.remote_space_available" href="#netmiko.ciena.ciena_saos.CienaSaosFileTransfer.remote_space_available">remote_space_available</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="netmiko.ciena.ciena_saos.CienaSaosSSH" href="#netmiko.ciena.ciena_saos.CienaSaosSSH">CienaSaosSSH</a></code></h4>
+</li>
+<li>
+<h4><code><a title="netmiko.ciena.ciena_saos.CienaSaosTelnet" href="#netmiko.ciena.ciena_saos.CienaSaosTelnet">CienaSaosTelnet</a></code></h4>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/netmiko/ciena/index.html b/docs/netmiko/ciena/index.html
index 5e555ed2966d20663330ec6f673539e80f8a4c85..d020689673d53c9c8e0981833fe1451bd4edc84b 100644
--- a/docs/netmiko/ciena/index.html
+++ b/docs/netmiko/ciena/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ciena API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,16 +22,19 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.ciena.ciena_saos_ssh import CienaSaosSSH
+<pre><code class="python">from netmiko.ciena.ciena_saos import (
+    CienaSaosSSH,
+    CienaSaosTelnet,
+    CienaSaosFileTransfer,
+)
 
-__all__ = [&#34;CienaSaosSSH&#34;]</code></pre>
+__all__ = [&#34;CienaSaosSSH&#34;, &#34;CienaSaosTelnet&#34;, &#34;CienaSaosFileTransfer&#34;]</code></pre>
 </details>
 </section>
 <section>
 <h2 class="section-title" id="header-submodules">Sub-modules</h2>
 <dl>
-<dt><code class="name"><a title="netmiko.ciena.ciena_saos_ssh" href="ciena_saos_ssh.html">netmiko.ciena.ciena_saos_ssh</a></code></dt>
+<dt><code class="name"><a title="netmiko.ciena.ciena_saos" href="ciena_saos.html">netmiko.ciena.ciena_saos</a></code></dt>
 <dd>
 <section class="desc"><p>Ciena SAOS support.</p></section>
 </dd>
@@ -44,12 +47,250 @@ __all__ = [&#34;CienaSaosSSH&#34;]</code></pre>
 <section>
 <h2 class="section-title" id="header-classes">Classes</h2>
 <dl>
+<dt id="netmiko.ciena.CienaSaosFileTransfer"><code class="flex name class">
+<span>class <span class="ident">CienaSaosFileTransfer</span></span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='', direction='put', **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Ciena SAOS SCP File Transfer driver.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class CienaSaosFileTransfer(BaseFileTransfer):
+    &#34;&#34;&#34;Ciena SAOS SCP File Transfer driver.&#34;&#34;&#34;
+
+    def __init__(
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
+    ):
+        if file_system == &#34;&#34;:
+            file_system = f&#34;/tmp/users/{ssh_conn.username}&#34;
+        return super().__init__(
+            ssh_conn=ssh_conn,
+            source_file=source_file,
+            dest_file=dest_file,
+            file_system=file_system,
+            direction=direction,
+            **kwargs,
+        )
+
+    def remote_space_available(self, search_pattern=&#34;&#34;):
+        &#34;&#34;&#34;
+        Return space available on Ciena SAOS
+
+        Output should only have the file-system that matches {self.file_system}
+
+        Filesystem           1K-blocks      Used Available Use% Mounted on
+        tmpfs                  1048576       648   1047928   0% /tmp
+        &#34;&#34;&#34;
+        remote_cmd = f&#34;file vols -P {self.file_system}&#34;
+        remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+        remote_output = remote_output.strip()
+        err_msg = (
+            f&#34;Parsing error, unexpected output from {remote_cmd}:\n{remote_output}&#34;
+        )
+
+        # First line is the header; file_system_line is the output we care about
+        header_line, filesystem_line = remote_output.splitlines()
+
+        filesystem, _, _, space_avail, *_ = header_line.split()
+        if &#34;Filesystem&#34; != filesystem or &#34;Avail&#34; not in space_avail:
+            # Filesystem 1K-blocks Used Available Use% Mounted on
+            raise ValueError(err_msg)
+
+        # Normalize output - in certain outputs ciena will line wrap (this fixes that)
+        # Strip the extra newline
+        # /dev/mapper/EN--VOL-config
+        #                  4096      1476      2620  36% /etc/hosts
+        filesystem_line = re.sub(r&#34;(^\S+$)\n&#34;, r&#34;\1&#34;, filesystem_line, flags=re.M)
+
+        # Checks to make sure what was returned is what we expect
+        _, k_blocks, used, space_avail, _, _ = filesystem_line.split()
+        for integer_check in (k_blocks, used, space_avail):
+            try:
+                int(integer_check)
+            except ValueError:
+                raise ValueError(err_msg)
+
+        return int(space_avail) * 1024
+
+    def check_file_exists(self, remote_cmd=&#34;&#34;):
+        &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
+        if self.direction == &#34;put&#34;:
+            if not remote_cmd:
+                remote_cmd = f&#34;file ls {self.file_system}/{self.dest_file}&#34;
+            remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+            search_string = re.escape(f&#34;{self.file_system}/{self.dest_file}&#34;)
+            if &#34;ERROR&#34; in remote_out:
+                return False
+            elif re.search(search_string, remote_out):
+                return True
+            else:
+                raise ValueError(&#34;Unexpected output from check_file_exists&#34;)
+        elif self.direction == &#34;get&#34;:
+            return os.path.exists(self.dest_file)
+
+    def remote_file_size(self, remote_cmd=&#34;&#34;, remote_file=None):
+        &#34;&#34;&#34;Get the file size of the remote file.&#34;&#34;&#34;
+        if remote_file is None:
+            if self.direction == &#34;put&#34;:
+                remote_file = self.dest_file
+            elif self.direction == &#34;get&#34;:
+                remote_file = self.source_file
+
+        remote_file = f&#34;{self.file_system}/{remote_file}&#34;
+
+        if not remote_cmd:
+            remote_cmd = f&#34;file ls -l {remote_file}&#34;
+
+        remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+
+        if &#34;No such file or directory&#34; in remote_out:
+            raise IOError(&#34;Unable to find file on remote system&#34;)
+
+        escape_file_name = re.escape(remote_file)
+        pattern = r&#34;^.* ({}).*$&#34;.format(escape_file_name)
+        match = re.search(pattern, remote_out, flags=re.M)
+        if match:
+            # Format: -rw-r--r--  1 pyclass  wheel  12 Nov  5 19:07 /var/tmp/test3.txt
+            line = match.group(0)
+            file_size = line.split()[4]
+            return int(file_size)
+
+        raise ValueError(
+            &#34;Search pattern not found for remote file size during SCP transfer.&#34;
+        )
+
+    def remote_md5(self, base_cmd=&#34;&#34;, remote_file=None):
+        &#34;&#34;&#34;Calculate remote MD5 and returns the hash.
+
+        This command can be CPU intensive on the remote device.
+        &#34;&#34;&#34;
+        if base_cmd == &#34;&#34;:
+            base_cmd = &#34;md5sum&#34;
+        if remote_file is None:
+            if self.direction == &#34;put&#34;:
+                remote_file = self.dest_file
+            elif self.direction == &#34;get&#34;:
+                remote_file = self.source_file
+
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
+
+        self.ssh_ctl_chan._enter_shell()
+        dest_md5 = self.ssh_ctl_chan.send_command(
+            remote_md5_cmd, expect_string=r&#34;[$#&gt;]&#34;
+        )
+        self.ssh_ctl_chan._return_cli()
+        dest_md5 = self.process_md5(dest_md5, pattern=r&#34;([0-9a-f]+)\s+&#34;)
+        return dest_md5
+
+    def enable_scp(self, cmd=&#34;system server scp enable&#34;):
+        return super().enable_scp(cmd=cmd)
+
+    def disable_scp(self, cmd=&#34;system server scp disable&#34;):
+        return super().disable_scp(cmd=cmd)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.scp_handler.BaseFileTransfer" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer">BaseFileTransfer</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.ciena.CienaSaosFileTransfer.remote_space_available"><code class="name flex">
+<span>def <span class="ident">remote_space_available</span></span>(<span>self, search_pattern='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Return space available on Ciena SAOS</p>
+<p>Output should only have the file-system that matches {self.file_system}</p>
+<p>Filesystem
+1K-blocks
+Used Available Use% Mounted on
+tmpfs
+1048576
+648
+1047928
+0% /tmp</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def remote_space_available(self, search_pattern=&#34;&#34;):
+    &#34;&#34;&#34;
+    Return space available on Ciena SAOS
+
+    Output should only have the file-system that matches {self.file_system}
+
+    Filesystem           1K-blocks      Used Available Use% Mounted on
+    tmpfs                  1048576       648   1047928   0% /tmp
+    &#34;&#34;&#34;
+    remote_cmd = f&#34;file vols -P {self.file_system}&#34;
+    remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+    remote_output = remote_output.strip()
+    err_msg = (
+        f&#34;Parsing error, unexpected output from {remote_cmd}:\n{remote_output}&#34;
+    )
+
+    # First line is the header; file_system_line is the output we care about
+    header_line, filesystem_line = remote_output.splitlines()
+
+    filesystem, _, _, space_avail, *_ = header_line.split()
+    if &#34;Filesystem&#34; != filesystem or &#34;Avail&#34; not in space_avail:
+        # Filesystem 1K-blocks Used Available Use% Mounted on
+        raise ValueError(err_msg)
+
+    # Normalize output - in certain outputs ciena will line wrap (this fixes that)
+    # Strip the extra newline
+    # /dev/mapper/EN--VOL-config
+    #                  4096      1476      2620  36% /etc/hosts
+    filesystem_line = re.sub(r&#34;(^\S+$)\n&#34;, r&#34;\1&#34;, filesystem_line, flags=re.M)
+
+    # Checks to make sure what was returned is what we expect
+    _, k_blocks, used, space_avail, _, _ = filesystem_line.split()
+    for integer_check in (k_blocks, used, space_avail):
+        try:
+            int(integer_check)
+        except ValueError:
+            raise ValueError(err_msg)
+
+    return int(space_avail) * 1024</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.scp_handler.BaseFileTransfer" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer">BaseFileTransfer</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.check_file_exists" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.check_file_exists">check_file_exists</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.close_scp_chan" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.close_scp_chan">close_scp_chan</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.compare_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.compare_md5">compare_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.disable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.disable_scp">disable_scp</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.enable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.enable_scp">enable_scp</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.establish_scp_conn" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.establish_scp_conn">establish_scp_conn</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.file_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.file_md5">file_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.get_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.get_file">get_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.local_space_available" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.local_space_available">local_space_available</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.process_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.process_md5">process_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.put_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.put_file">put_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.remote_file_size" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.remote_file_size">remote_file_size</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.remote_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.remote_md5">remote_md5</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.transfer_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.transfer_file">transfer_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.verify_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.verify_file">verify_file</a></code></li>
+<li><code><a title="netmiko.scp_handler.BaseFileTransfer.verify_space_available" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.verify_space_available">verify_space_available</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
 <dt id="netmiko.ciena.CienaSaosSSH"><code class="flex name class">
 <span>class <span class="ident">CienaSaosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Ciena SAOS support.</p>
+<p>Implements methods for interacting Ciena Saos devices.</p>
+<p>Disables enable(), check_enable_mode(), config_mode() and
+check_config_mode()</p>
 <pre><code>    Initialize attributes for establishing connection to target device.
 
     :param ip: IP address of target device. Not required if `host` is
@@ -166,91 +407,256 @@ __all__ = [&#34;CienaSaosSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">class CienaSaosSSH(CiscoSSHConnection):
-    &#34;&#34;&#34;Ciena SAOS support.&#34;&#34;&#34;
-
-    def session_preparation(self):
-        self._test_channel_read()
-        self.set_base_prompt()
-        self.disable_paging(command=&#34;system shell session set more off&#34;)
-        # Clear the read buffer
-        time.sleep(0.3 * self.global_delay_factor)
-        self.clear_buffer()
-
-    def enable(self, *args, **kwargs):
-        pass
-
-    def save_config(self, *args, **kwargs):
-        &#34;&#34;&#34;Not Implemented&#34;&#34;&#34;
-        raise NotImplementedError</code></pre>
+<pre><code class="python">class CienaSaosSSH(CienaSaosBase):
+    pass</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
-<li><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></li>
-<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></li>
 <li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
 </ul>
-<h3>Methods</h3>
-<dl>
-<dt id="netmiko.ciena.CienaSaosSSH.save_config"><code class="name flex">
-<span>def <span class="ident">save_config</span></span>(<span>self, *args, **kwargs)</span>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.config_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.enable" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.enable">enable</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.save_config" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+<dt id="netmiko.ciena.CienaSaosTelnet"><code class="flex name class">
+<span>class <span class="ident">CienaSaosTelnet</span></span>
+<span>(</span><span>*args, **kwargs)</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Not Implemented</p></section>
+<section class="desc"><p>Ciena SAOS support.</p>
+<p>Implements methods for interacting Ciena Saos devices.</p>
+<p>Disables enable(), check_enable_mode(), config_mode() and
+check_config_mode()</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def save_config(self, *args, **kwargs):
-    &#34;&#34;&#34;Not Implemented&#34;&#34;&#34;
-    raise NotImplementedError</code></pre>
+<pre><code class="python">class CienaSaosTelnet(CienaSaosBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get(&#34;default_enter&#34;)
+        kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
-</dd>
-</dl>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
 <h3>Inherited members</h3>
 <ul class="hlist">
-<li><code><b><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></b></code>:
+<li><code><b><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></b></code>:
 <ul class="hlist">
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.check_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_config_mode">check_config_mode</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.config_mode">config_mode</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
-<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.config_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.enable" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.enable">enable</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.save_config" href="ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos.CienaSaosBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
 </ul>
 </li>
 </ul>
@@ -271,24 +677,30 @@ __all__ = [&#34;CienaSaosSSH&#34;]</code></pre>
 </li>
 <li><h3><a href="#header-submodules">Sub-modules</a></h3>
 <ul>
-<li><code><a title="netmiko.ciena.ciena_saos_ssh" href="ciena_saos_ssh.html">netmiko.ciena.ciena_saos_ssh</a></code></li>
+<li><code><a title="netmiko.ciena.ciena_saos" href="ciena_saos.html">netmiko.ciena.ciena_saos</a></code></li>
 </ul>
 </li>
 <li><h3><a href="#header-classes">Classes</a></h3>
 <ul>
 <li>
-<h4><code><a title="netmiko.ciena.CienaSaosSSH" href="#netmiko.ciena.CienaSaosSSH">CienaSaosSSH</a></code></h4>
+<h4><code><a title="netmiko.ciena.CienaSaosFileTransfer" href="#netmiko.ciena.CienaSaosFileTransfer">CienaSaosFileTransfer</a></code></h4>
 <ul class="">
-<li><code><a title="netmiko.ciena.CienaSaosSSH.save_config" href="#netmiko.ciena.CienaSaosSSH.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ciena.CienaSaosFileTransfer.remote_space_available" href="#netmiko.ciena.CienaSaosFileTransfer.remote_space_available">remote_space_available</a></code></li>
 </ul>
 </li>
+<li>
+<h4><code><a title="netmiko.ciena.CienaSaosSSH" href="#netmiko.ciena.CienaSaosSSH">CienaSaosSSH</a></code></h4>
+</li>
+<li>
+<h4><code><a title="netmiko.ciena.CienaSaosTelnet" href="#netmiko.ciena.CienaSaosTelnet">CienaSaosTelnet</a></code></h4>
+</li>
 </ul>
 </li>
 </ul>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/cisco_asa_ssh.html b/docs/netmiko/cisco/cisco_asa_ssh.html
index 9235d12768af53b873d5371e14dab282bf1b9da5..ebcc4ad88aace6d8e0c0e2d821a698af3473ee33 100644
--- a/docs/netmiko/cisco/cisco_asa_ssh.html
+++ b/docs/netmiko/cisco/cisco_asa_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco.cisco_asa_ssh API documentation</title>
 <meta name="description" content="Subclass specific to Cisco ASA." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,8 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Subclass specific to Cisco ASA.&#34;&#34;&#34;
-
-from __future__ import unicode_literals
 import re
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection, CiscoFileTransfer
@@ -59,7 +57,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
         If the ASA is in multi-context mode, then the base_prompt needs to be
         updated after each context change.
         &#34;&#34;&#34;
-        output = super(CiscoAsaSSH, self).send_command_timing(*args, **kwargs)
+        output = super().send_command_timing(*args, **kwargs)
         if len(args) &gt;= 1:
             command_string = args[0]
         else:
@@ -83,7 +81,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
             if len(args) &lt;= 1:
                 expect_string = kwargs.get(&#34;expect_string&#34;, &#34;#&#34;)
                 kwargs[&#34;expect_string&#34;] = expect_string
-        output = super(CiscoAsaSSH, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
 
         if &#34;changeto&#34; in command_string:
             self.set_base_prompt()
@@ -102,7 +100,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
         This switch of ASA contexts can occur in configuration mode. If this
         happens the trailing &#39;(config*&#39; needs stripped off.
         &#34;&#34;&#34;
-        cur_base_prompt = super(CiscoAsaSSH, self).set_base_prompt(*args, **kwargs)
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
         match = re.search(r&#34;(.*)\(conf.*&#34;, cur_base_prompt)
         if match:
             # strip off (conf.* from base_prompt
@@ -137,7 +135,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(CiscoAsaSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -159,7 +157,7 @@ class CiscoAsaFileTransfer(CiscoFileTransfer):
 <dl>
 <dt id="netmiko.cisco.cisco_asa_ssh.CiscoAsaFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoAsaFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco ASA SCP File Transfer driver.</p></section>
@@ -202,7 +200,7 @@ class CiscoAsaFileTransfer(CiscoFileTransfer):
 </dd>
 <dt id="netmiko.cisco.cisco_asa_ssh.CiscoAsaSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoAsaSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Subclass specific to Cisco ASA.</p>
@@ -322,6 +320,10 @@ class CiscoAsaFileTransfer(CiscoFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -353,7 +355,7 @@ class CiscoAsaFileTransfer(CiscoFileTransfer):
         If the ASA is in multi-context mode, then the base_prompt needs to be
         updated after each context change.
         &#34;&#34;&#34;
-        output = super(CiscoAsaSSH, self).send_command_timing(*args, **kwargs)
+        output = super().send_command_timing(*args, **kwargs)
         if len(args) &gt;= 1:
             command_string = args[0]
         else:
@@ -377,7 +379,7 @@ class CiscoAsaFileTransfer(CiscoFileTransfer):
             if len(args) &lt;= 1:
                 expect_string = kwargs.get(&#34;expect_string&#34;, &#34;#&#34;)
                 kwargs[&#34;expect_string&#34;] = expect_string
-        output = super(CiscoAsaSSH, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
 
         if &#34;changeto&#34; in command_string:
             self.set_base_prompt()
@@ -396,7 +398,7 @@ class CiscoAsaFileTransfer(CiscoFileTransfer):
         This switch of ASA contexts can occur in configuration mode. If this
         happens the trailing &#39;(config*&#39; needs stripped off.
         &#34;&#34;&#34;
-        cur_base_prompt = super(CiscoAsaSSH, self).set_base_prompt(*args, **kwargs)
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
         match = re.search(r&#34;(.*)\(conf.*&#34;, cur_base_prompt)
         if match:
             # strip off (conf.* from base_prompt
@@ -431,7 +433,7 @@ class CiscoAsaFileTransfer(CiscoFileTransfer):
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(CiscoAsaSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -489,7 +491,7 @@ Password: <strong><em>*</em></strong><strong>*</strong></p></section>
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(CiscoAsaSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -517,7 +519,7 @@ updated after each context change.</p></section>
         if len(args) &lt;= 1:
             expect_string = kwargs.get(&#34;expect_string&#34;, &#34;#&#34;)
             kwargs[&#34;expect_string&#34;] = expect_string
-    output = super(CiscoAsaSSH, self).send_command(*args, **kwargs)
+    output = super().send_command(*args, **kwargs)
 
     if &#34;changeto&#34; in command_string:
         self.set_base_prompt()
@@ -550,7 +552,7 @@ updated after each context change.</p></section>
     If the ASA is in multi-context mode, then the base_prompt needs to be
     updated after each context change.
     &#34;&#34;&#34;
-    output = super(CiscoAsaSSH, self).send_command_timing(*args, **kwargs)
+    output = super().send_command_timing(*args, **kwargs)
     if len(args) &gt;= 1:
         command_string = args[0]
     else:
@@ -606,7 +608,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
     This switch of ASA contexts can occur in configuration mode. If this
     happens the trailing &#39;(config*&#39; needs stripped off.
     &#34;&#34;&#34;
-    cur_base_prompt = super(CiscoAsaSSH, self).set_base_prompt(*args, **kwargs)
+    cur_base_prompt = super().set_base_prompt(*args, **kwargs)
     match = re.search(r&#34;(.*)\(conf.*&#34;, cur_base_prompt)
     if match:
         # strip off (conf.* from base_prompt
@@ -694,7 +696,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/cisco_ios.html b/docs/netmiko/cisco/cisco_ios.html
index 5b9340dad627d5a8e7f5d1d725ff172d57ff85c7..8b05a4d87e52b2595a5f62278c8aa2440bbf2dd6 100644
--- a/docs/netmiko/cisco/cisco_ios.html
+++ b/docs/netmiko/cisco/cisco_ios.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco.cisco_ios API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-import time
+<pre><code class="python">import time
 import re
 import os
 import hashlib
@@ -52,13 +50,11 @@ class CiscoIosBase(CiscoBaseConnection):
 
         Cisco IOS devices abbreviate the prompt at 20 chars in config mode
         &#34;&#34;&#34;
-        return super(CiscoIosBase, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config Using Copy Run Start&#34;&#34;&#34;
-        return super(CiscoIosBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -98,6 +94,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         file_system=None,
         direction=&#34;put&#34;,
         source_config=None,
+        socket_timeout=10.0,
     ):
         if source_file and source_config:
             msg = &#34;Invalid call to InLineTransfer both source_file and source_config specified.&#34;
@@ -124,6 +121,8 @@ class InLineTransfer(CiscoIosFileTransfer):
         else:
             self.file_system = file_system
 
+        self.socket_timeout = socket_timeout
+
     @staticmethod
     def _read_file(file_name):
         with io.open(file_name, &#34;rt&#34;, encoding=&#34;utf-8&#34;) as f:
@@ -131,7 +130,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 
     @staticmethod
     def _tcl_newline_rationalize(tcl_string):
-        &#34;&#34;&#34;
+        r&#34;&#34;&#34;
         When using put inside a TCL {} section the newline is considered a new TCL
         statement and causes a missing curly-brace message. Convert &#34;\n&#34; to &#34;\r&#34;. TCL
         will convert the &#34;\r&#34; to a &#34;\n&#34; i.e. you will see a &#34;\n&#34; inside the file on the
@@ -163,9 +162,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         )
         for pattern in cmd_failed:
             if pattern in output:
-                raise ValueError(
-                    &#34;Failed to enter tclsh mode on router: {}&#34;.format(output)
-                )
+                raise ValueError(f&#34;Failed to enter tclsh mode on router: {output}&#34;)
         return output
 
     def _exit_tcl_mode(self):
@@ -196,10 +193,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         return hashlib.md5(file_contents).hexdigest()
 
     def config_md5(self, source_config):
-        &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
-        file_contents = source_config + &#34;\n&#34;  # Cisco IOS automatically adds this
-        file_contents = file_contents.encode(&#34;UTF-8&#34;)
-        return hashlib.md5(file_contents).hexdigest()
+        return super().file_md5(source_config, add_newline=True)
 
     def put_file(self):
         curlybrace = r&#34;{&#34;
@@ -270,7 +264,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 <dl>
 <dt id="netmiko.cisco.cisco_ios.CiscoIosBase"><code class="flex name class">
 <span>class <span class="ident">CiscoIosBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Common Methods for IOS (both SSH and telnet).</p>
@@ -390,6 +384,10 @@ class InLineTransfer(CiscoIosFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -412,13 +410,11 @@ class InLineTransfer(CiscoIosFileTransfer):
 
         Cisco IOS devices abbreviate the prompt at 20 chars in config mode
         &#34;&#34;&#34;
-        return super(CiscoIosBase, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config Using Copy Run Start&#34;&#34;&#34;
-        return super(CiscoIosBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -446,7 +442,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves Config Using Copy Run Start&#34;&#34;&#34;
-    return super(CiscoIosBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -518,7 +514,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 </dd>
 <dt id="netmiko.cisco.cisco_ios.CiscoIosFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoIosFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS SCP File Transfer driver.</p></section>
@@ -565,7 +561,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 </dd>
 <dt id="netmiko.cisco.cisco_ios.CiscoIosSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoIosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS SSH driver.</p>
@@ -685,6 +681,10 @@ class InLineTransfer(CiscoIosFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -749,7 +749,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 </dd>
 <dt id="netmiko.cisco.cisco_ios.CiscoIosSerial"><code class="flex name class">
 <span>class <span class="ident">CiscoIosSerial</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS Serial driver.</p>
@@ -869,6 +869,10 @@ class InLineTransfer(CiscoIosFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -933,7 +937,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 </dd>
 <dt id="netmiko.cisco.cisco_ios.CiscoIosTelnet"><code class="flex name class">
 <span>class <span class="ident">CiscoIosTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS Telnet driver.</p>
@@ -1053,6 +1057,10 @@ class InLineTransfer(CiscoIosFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1117,7 +1125,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 </dd>
 <dt id="netmiko.cisco.cisco_ios.InLineTransfer"><code class="flex name class">
 <span>class <span class="ident">InLineTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file=None, dest_file=None, file_system=None, direction='put', source_config=None)</span>
+<span>(</span><span>ssh_conn, source_file=None, dest_file=None, file_system=None, direction='put', source_config=None, socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Use TCL on Cisco IOS to directly transfer file.</p></section>
@@ -1134,6 +1142,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         file_system=None,
         direction=&#34;put&#34;,
         source_config=None,
+        socket_timeout=10.0,
     ):
         if source_file and source_config:
             msg = &#34;Invalid call to InLineTransfer both source_file and source_config specified.&#34;
@@ -1160,6 +1169,8 @@ class InLineTransfer(CiscoIosFileTransfer):
         else:
             self.file_system = file_system
 
+        self.socket_timeout = socket_timeout
+
     @staticmethod
     def _read_file(file_name):
         with io.open(file_name, &#34;rt&#34;, encoding=&#34;utf-8&#34;) as f:
@@ -1167,7 +1178,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 
     @staticmethod
     def _tcl_newline_rationalize(tcl_string):
-        &#34;&#34;&#34;
+        r&#34;&#34;&#34;
         When using put inside a TCL {} section the newline is considered a new TCL
         statement and causes a missing curly-brace message. Convert &#34;\n&#34; to &#34;\r&#34;. TCL
         will convert the &#34;\r&#34; to a &#34;\n&#34; i.e. you will see a &#34;\n&#34; inside the file on the
@@ -1199,9 +1210,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         )
         for pattern in cmd_failed:
             if pattern in output:
-                raise ValueError(
-                    &#34;Failed to enter tclsh mode on router: {}&#34;.format(output)
-                )
+                raise ValueError(f&#34;Failed to enter tclsh mode on router: {output}&#34;)
         return output
 
     def _exit_tcl_mode(self):
@@ -1232,10 +1241,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         return hashlib.md5(file_contents).hexdigest()
 
     def config_md5(self, source_config):
-        &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
-        file_contents = source_config + &#34;\n&#34;  # Cisco IOS automatically adds this
-        file_contents = file_contents.encode(&#34;UTF-8&#34;)
-        return hashlib.md5(file_contents).hexdigest()
+        return super().file_md5(source_config, add_newline=True)
 
     def put_file(self):
         curlybrace = r&#34;{&#34;
@@ -1306,12 +1312,24 @@ class InLineTransfer(CiscoIosFileTransfer):
 <span>def <span class="ident">config_md5</span></span>(<span>self, source_config)</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Compute MD5 hash of file.</p></section>
+<section class="desc"></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def config_md5(self, source_config):
+    return super().file_md5(source_config, add_newline=True)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.cisco.cisco_ios.InLineTransfer.file_md5"><code class="name flex">
+<span>def <span class="ident">file_md5</span></span>(<span>self, file_name)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Compute MD5 hash of file.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def file_md5(self, file_name):
     &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
-    file_contents = source_config + &#34;\n&#34;  # Cisco IOS automatically adds this
+    file_contents = self._read_file(file_name)
+    file_contents = file_contents + &#34;\n&#34;  # Cisco IOS automatically adds this
     file_contents = file_contents.encode(&#34;UTF-8&#34;)
     return hashlib.md5(file_contents).hexdigest()</code></pre>
 </details>
@@ -1327,7 +1345,6 @@ class InLineTransfer(CiscoIosFileTransfer):
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.disable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.disable_scp">disable_scp</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.enable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.enable_scp">enable_scp</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.establish_scp_conn" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.establish_scp_conn">establish_scp_conn</a></code></li>
-<li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.file_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.file_md5">file_md5</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.get_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.get_file">get_file</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.local_space_available" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.local_space_available">local_space_available</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.process_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.process_md5">process_md5</a></code></li>
@@ -1381,6 +1398,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 <h4><code><a title="netmiko.cisco.cisco_ios.InLineTransfer" href="#netmiko.cisco.cisco_ios.InLineTransfer">InLineTransfer</a></code></h4>
 <ul class="">
 <li><code><a title="netmiko.cisco.cisco_ios.InLineTransfer.config_md5" href="#netmiko.cisco.cisco_ios.InLineTransfer.config_md5">config_md5</a></code></li>
+<li><code><a title="netmiko.cisco.cisco_ios.InLineTransfer.file_md5" href="#netmiko.cisco.cisco_ios.InLineTransfer.file_md5">file_md5</a></code></li>
 </ul>
 </li>
 </ul>
@@ -1389,7 +1407,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/cisco_nxos_ssh.html b/docs/netmiko/cisco/cisco_nxos_ssh.html
index 1a0573f22e794abbcafb5de21415024925a701aa..4bd1e31829528143e1e8b61fa55c07d703026a52 100644
--- a/docs/netmiko/cisco/cisco_nxos_ssh.html
+++ b/docs/netmiko/cisco/cisco_nxos_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco.cisco_nxos_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import print_function
-from __future__ import unicode_literals
-import re
+<pre><code class="python">import re
 import time
 import os
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -50,9 +48,7 @@ class CiscoNxosSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(CiscoNxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
 
 class CiscoNxosFileTransfer(CiscoFileTransfer):
@@ -65,6 +61,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
         dest_file,
         file_system=&#34;bootflash:&#34;,
         direction=&#34;put&#34;,
+        socket_timeout=10.0,
     ):
         self.ssh_ctl_chan = ssh_conn
         self.source_file = source_file
@@ -85,11 +82,13 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
         else:
             raise ValueError(&#34;Invalid direction specified&#34;)
 
+        self.socket_timeout = socket_timeout
+
     def check_file_exists(self, remote_cmd=&#34;&#34;):
         &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
         if self.direction == &#34;put&#34;:
             if not remote_cmd:
-                remote_cmd = &#34;dir {}{}&#34;.format(self.file_system, self.dest_file)
+                remote_cmd = f&#34;dir {self.file_system}{self.dest_file}&#34;
             remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
             search_string = r&#34;{}.*Usage for&#34;.format(self.dest_file)
             if &#34;No such file or directory&#34; in remote_out:
@@ -110,7 +109,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
                 remote_file = self.source_file
 
         if not remote_cmd:
-            remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, remote_file)
+            remote_cmd = f&#34;dir {self.file_system}/{remote_file}&#34;
 
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         # Match line containing file name
@@ -137,9 +136,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}{} md5sum&#34;.format(
-            base_cmd, self.file_system, remote_file
-        )
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}{remote_file} md5sum&#34;
         return self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500).strip()
 
     def enable_scp(self, cmd=None):
@@ -160,7 +157,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
 <dl>
 <dt id="netmiko.cisco.cisco_nxos_ssh.CiscoNxosFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoNxosFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='bootflash:', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='bootflash:', direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco NXOS SCP File Transfer driver.</p></section>
@@ -176,6 +173,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
         dest_file,
         file_system=&#34;bootflash:&#34;,
         direction=&#34;put&#34;,
+        socket_timeout=10.0,
     ):
         self.ssh_ctl_chan = ssh_conn
         self.source_file = source_file
@@ -196,11 +194,13 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
         else:
             raise ValueError(&#34;Invalid direction specified&#34;)
 
+        self.socket_timeout = socket_timeout
+
     def check_file_exists(self, remote_cmd=&#34;&#34;):
         &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
         if self.direction == &#34;put&#34;:
             if not remote_cmd:
-                remote_cmd = &#34;dir {}{}&#34;.format(self.file_system, self.dest_file)
+                remote_cmd = f&#34;dir {self.file_system}{self.dest_file}&#34;
             remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
             search_string = r&#34;{}.*Usage for&#34;.format(self.dest_file)
             if &#34;No such file or directory&#34; in remote_out:
@@ -221,7 +221,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
                 remote_file = self.source_file
 
         if not remote_cmd:
-            remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, remote_file)
+            remote_cmd = f&#34;dir {self.file_system}/{remote_file}&#34;
 
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         # Match line containing file name
@@ -248,9 +248,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}{} md5sum&#34;.format(
-            base_cmd, self.file_system, remote_file
-        )
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}{remote_file} md5sum&#34;
         return self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500).strip()
 
     def enable_scp(self, cmd=None):
@@ -306,7 +304,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 </dd>
 <dt id="netmiko.cisco.cisco_nxos_ssh.CiscoNxosSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoNxosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -426,6 +424,10 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -448,9 +450,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 
     def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(CiscoNxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )</code></pre>
+        return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -469,9 +469,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;#&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(CiscoNxosSSH, self).check_config_mode(
-        check_string=check_string, pattern=pattern
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.cisco_nxos_ssh.CiscoNxosSSH.normalize_linefeeds"><code class="name flex">
@@ -592,7 +590,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/cisco_s300.html b/docs/netmiko/cisco/cisco_s300.html
index bad074fc02aaa5935254781238f4e4ed7815a528..9d6c9f17558c844e1c866d603e7c904095740ef0 100644
--- a/docs/netmiko/cisco/cisco_s300.html
+++ b/docs/netmiko/cisco/cisco_s300.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco.cisco_s300 API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -48,7 +47,7 @@ class CiscoS300SSH(CiscoSSHConnection):
         time.sleep(0.3 * self.global_delay_factor)
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=True, confirm_response=&#34;Y&#34;):
-        return super(CiscoS300SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -64,7 +63,7 @@ class CiscoS300SSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.cisco.cisco_s300.CiscoS300SSH"><code class="flex name class">
 <span>class <span class="ident">CiscoS300SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Support for Cisco SG300 series of devices.</p>
@@ -187,6 +186,10 @@ ip ssh password-auth</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -211,7 +214,7 @@ ip ssh password-auth</p>
         time.sleep(0.3 * self.global_delay_factor)
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=True, confirm_response=&#34;Y&#34;):
-        return super(CiscoS300SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -317,7 +320,7 @@ ip ssh password-auth</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/cisco_tp_tcce.html b/docs/netmiko/cisco/cisco_tp_tcce.html
index d79b3fd2fef6af732efad9c9c5e71910077b7619..bc4605632f69eafc7be6711f35d9326f1a74c4a0 100644
--- a/docs/netmiko/cisco/cisco_tp_tcce.html
+++ b/docs/netmiko/cisco/cisco_tp_tcce.html
@@ -3,7 +3,7 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco.cisco_tp_tcce API documentation</title>
 <meta name="description" content="CiscoTpTcCeSSH Class
 Class to manage Cisco Telepresence Endpoint on TC/CE software release. Also working for Cisco
@@ -11,7 +11,7 @@ Expressway/VCS …" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -35,7 +35,6 @@ Expressway/VCS
 
 Written by Ahmad Barrin
 &#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -45,7 +44,7 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(CiscoTpTcCeSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def disable_paging(self, *args, **kwargs):
         &#34;&#34;&#34;Paging is disabled by default.&#34;&#34;&#34;
@@ -96,13 +95,6 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
 
         By default this method will keep waiting to receive data until the network device prompt is
         detected. The current network device prompt will be determined automatically.
-
-        command_string = command to execute
-        expect_string = pattern to search for uses re.search (use raw strings)
-        delay_factor = decrease the initial delay before we start looking for data
-        max_loops = number of iterations before we give up and raise an exception
-        strip_prompt = strip the trailing prompt from the output
-        strip_command = strip the leading command from the output
         &#34;&#34;&#34;
         if len(args) &gt;= 2:
             expect_string = args[1]
@@ -113,7 +105,7 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
                 expect_string = self.RETURN + expect_string + self.RETURN
                 kwargs.setdefault(&#34;expect_string&#34;, expect_string)
 
-        output = super(CiscoSSHConnection, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
         return output
 
     def save_config(self, *args, **kwargs):
@@ -252,6 +244,10 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -259,7 +255,7 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(CiscoTpTcCeSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def disable_paging(self, *args, **kwargs):
         &#34;&#34;&#34;Paging is disabled by default.&#34;&#34;&#34;
@@ -310,13 +306,6 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
 
         By default this method will keep waiting to receive data until the network device prompt is
         detected. The current network device prompt will be determined automatically.
-
-        command_string = command to execute
-        expect_string = pattern to search for uses re.search (use raw strings)
-        delay_factor = decrease the initial delay before we start looking for data
-        max_loops = number of iterations before we give up and raise an exception
-        strip_prompt = strip the trailing prompt from the output
-        strip_command = strip the leading command from the output
         &#34;&#34;&#34;
         if len(args) &gt;= 2:
             expect_string = args[1]
@@ -327,7 +316,7 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
                 expect_string = self.RETURN + expect_string + self.RETURN
                 kwargs.setdefault(&#34;expect_string&#34;, expect_string)
 
-        output = super(CiscoSSHConnection, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
         return output
 
     def save_config(self, *args, **kwargs):
@@ -384,13 +373,7 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
 <dd>
 <section class="desc"><p>Send command to network device retrieve output until router_prompt or expect_string</p>
 <p>By default this method will keep waiting to receive data until the network device prompt is
-detected. The current network device prompt will be determined automatically.</p>
-<p>command_string = command to execute
-expect_string = pattern to search for uses re.search (use raw strings)
-delay_factor = decrease the initial delay before we start looking for data
-max_loops = number of iterations before we give up and raise an exception
-strip_prompt = strip the trailing prompt from the output
-strip_command = strip the leading command from the output</p></section>
+detected. The current network device prompt will be determined automatically.</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def send_command(self, *args, **kwargs):
@@ -399,13 +382,6 @@ strip_command = strip the leading command from the output</p></section>
 
     By default this method will keep waiting to receive data until the network device prompt is
     detected. The current network device prompt will be determined automatically.
-
-    command_string = command to execute
-    expect_string = pattern to search for uses re.search (use raw strings)
-    delay_factor = decrease the initial delay before we start looking for data
-    max_loops = number of iterations before we give up and raise an exception
-    strip_prompt = strip the trailing prompt from the output
-    strip_command = strip the leading command from the output
     &#34;&#34;&#34;
     if len(args) &gt;= 2:
         expect_string = args[1]
@@ -416,7 +392,7 @@ strip_command = strip the leading command from the output</p></section>
             expect_string = self.RETURN + expect_string + self.RETURN
             kwargs.setdefault(&#34;expect_string&#34;, expect_string)
 
-    output = super(CiscoSSHConnection, self).send_command(*args, **kwargs)
+    output = super().send_command(*args, **kwargs)
     return output</code></pre>
 </details>
 </dd>
@@ -561,7 +537,7 @@ self.set_terminal_width()</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/cisco_wlc_ssh.html b/docs/netmiko/cisco/cisco_wlc_ssh.html
index 041812b98333d3e7f6a063a611ade8755bed916a..9d31011aea381e5600995bcf29530ea8e26e39ea 100644
--- a/docs/netmiko/cisco/cisco_wlc_ssh.html
+++ b/docs/netmiko/cisco/cisco_wlc_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco.cisco_wlc_ssh API documentation</title>
 <meta name="description" content="Netmiko Cisco WLC support." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,15 +24,11 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Netmiko Cisco WLC support.&#34;&#34;&#34;
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 import re
 
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 from netmiko.base_connection import BaseConnection
-from netmiko.py23_compat import string_types
-from netmiko import log
 
 
 class CiscoWlcSSH(BaseConnection):
@@ -130,8 +126,8 @@ class CiscoWlcSSH(BaseConnection):
         try:
             self.set_base_prompt()
         except ValueError:
-            msg = &#34;Authentication failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Authentication failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
         self.disable_paging(command=&#34;config paging disable&#34;)
         # Clear the read buffer
@@ -146,59 +142,33 @@ class CiscoWlcSSH(BaseConnection):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).check_config_mode(check_string, pattern)
+        return super().check_config_mode(check_string, pattern)
 
     def config_mode(self, config_command=&#34;config&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Enter into config_mode.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).config_mode(config_command, pattern)
+        return super().config_mode(config_command, pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Exit config_mode.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).exit_config_mode(exit_config, pattern)
+        return super().exit_config_mode(exit_config, pattern)
 
     def send_config_set(
         self,
         config_commands=None,
-        exit_config_mode=True,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
+        exit_config_mode=False,
+        enter_config_mode=False,
+        **kwargs,
     ):
-        &#34;&#34;&#34;
-        Send configuration commands down the SSH channel.
-
-        config_commands is an iterable containing all of the configuration commands.
-        The commands will be executed one after the other.
-
-        Does not automatically exit/enter configuration mode.
-        &#34;&#34;&#34;
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return &#34;&#34;
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, &#34;__iter__&#34;):
-            raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-        # Send config commands
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            time.sleep(delay_factor * 0.5)
-
-        # Gather output
-        output = self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
+        return super().send_config_set(
+            config_commands=config_commands,
+            exit_config_mode=exit_config_mode,
+            enter_config_mode=enter_config_mode,
+            **kwargs,
         )
-        output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
-        return output
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=True, confirm_response=&#34;y&#34;):
         &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
@@ -227,7 +197,7 @@ class CiscoWlcSSH(BaseConnection):
 <dl>
 <dt id="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoWlcSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Netmiko Cisco WLC support.</p>
@@ -347,6 +317,10 @@ class CiscoWlcSSH(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -445,8 +419,8 @@ class CiscoWlcSSH(BaseConnection):
         try:
             self.set_base_prompt()
         except ValueError:
-            msg = &#34;Authentication failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Authentication failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
         self.disable_paging(command=&#34;config paging disable&#34;)
         # Clear the read buffer
@@ -461,59 +435,33 @@ class CiscoWlcSSH(BaseConnection):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).check_config_mode(check_string, pattern)
+        return super().check_config_mode(check_string, pattern)
 
     def config_mode(self, config_command=&#34;config&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Enter into config_mode.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).config_mode(config_command, pattern)
+        return super().config_mode(config_command, pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Exit config_mode.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).exit_config_mode(exit_config, pattern)
+        return super().exit_config_mode(exit_config, pattern)
 
     def send_config_set(
         self,
         config_commands=None,
-        exit_config_mode=True,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
+        exit_config_mode=False,
+        enter_config_mode=False,
+        **kwargs,
     ):
-        &#34;&#34;&#34;
-        Send configuration commands down the SSH channel.
-
-        config_commands is an iterable containing all of the configuration commands.
-        The commands will be executed one after the other.
-
-        Does not automatically exit/enter configuration mode.
-        &#34;&#34;&#34;
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return &#34;&#34;
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, &#34;__iter__&#34;):
-            raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-        # Send config commands
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            time.sleep(delay_factor * 0.5)
-
-        # Gather output
-        output = self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
+        return super().send_config_set(
+            config_commands=config_commands,
+            exit_config_mode=exit_config_mode,
+            enter_config_mode=enter_config_mode,
+            **kwargs,
         )
-        output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
-        return output
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=True, confirm_response=&#34;y&#34;):
         &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
@@ -547,7 +495,7 @@ class CiscoWlcSSH(BaseConnection):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt)
-    return super(CiscoWlcSSH, self).check_config_mode(check_string, pattern)</code></pre>
+    return super().check_config_mode(check_string, pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.cleanup"><code class="name flex">
@@ -573,7 +521,7 @@ class CiscoWlcSSH(BaseConnection):
     &#34;&#34;&#34;Enter into config_mode.&#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt)
-    return super(CiscoWlcSSH, self).config_mode(config_command, pattern)</code></pre>
+    return super().config_mode(config_command, pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.exit_config_mode"><code class="name flex">
@@ -587,7 +535,7 @@ class CiscoWlcSSH(BaseConnection):
     &#34;&#34;&#34;Exit config_mode.&#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt)
-    return super(CiscoWlcSSH, self).exit_config_mode(exit_config, pattern)</code></pre>
+    return super().exit_config_mode(exit_config, pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.save_config"><code class="name flex">
@@ -677,57 +625,6 @@ Arguments are the same as send_command_timing() method</p></section>
     return output</code></pre>
 </details>
 </dd>
-<dt id="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.send_config_set"><code class="name flex">
-<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=True, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None)</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Send configuration commands down the SSH channel.</p>
-<p>config_commands is an iterable containing all of the configuration commands.
-The commands will be executed one after the other.</p>
-<p>Does not automatically exit/enter configuration mode.</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def send_config_set(
-    self,
-    config_commands=None,
-    exit_config_mode=True,
-    delay_factor=1,
-    max_loops=150,
-    strip_prompt=False,
-    strip_command=False,
-    config_mode_command=None,
-):
-    &#34;&#34;&#34;
-    Send configuration commands down the SSH channel.
-
-    config_commands is an iterable containing all of the configuration commands.
-    The commands will be executed one after the other.
-
-    Does not automatically exit/enter configuration mode.
-    &#34;&#34;&#34;
-    delay_factor = self.select_delay_factor(delay_factor)
-    if config_commands is None:
-        return &#34;&#34;
-    elif isinstance(config_commands, string_types):
-        config_commands = (config_commands,)
-
-    if not hasattr(config_commands, &#34;__iter__&#34;):
-        raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-    # Send config commands
-    for cmd in config_commands:
-        self.write_channel(self.normalize_cmd(cmd))
-        time.sleep(delay_factor * 0.5)
-
-    # Gather output
-    output = self._read_channel_timing(
-        delay_factor=delay_factor, max_loops=max_loops
-    )
-    output = self._sanitize_output(output)
-    log.debug(&#34;{}&#34;.format(output))
-    return output</code></pre>
-</details>
-</dd>
 <dt id="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.session_preparation"><code class="name flex">
 <span>def <span class="ident">session_preparation</span></span>(<span>self)</span>
 </code></dt>
@@ -747,8 +644,8 @@ The commands will be executed one after the other.</p>
     try:
         self.set_base_prompt()
     except ValueError:
-        msg = &#34;Authentication failed: {}&#34;.format(self.host)
-        raise NetMikoAuthenticationException(msg)
+        msg = f&#34;Authentication failed: {self.host}&#34;
+        raise NetmikoAuthenticationException(msg)
 
     self.disable_paging(command=&#34;config paging disable&#34;)
     # Clear the read buffer
@@ -826,6 +723,7 @@ The commands will be executed one after the other.</p>
 <li><code><a title="netmiko.base_connection.BaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
@@ -863,7 +761,6 @@ The commands will be executed one after the other.</p>
 <li><code><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.exit_config_mode" href="#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.exit_config_mode">exit_config_mode</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.save_config" href="#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.save_config">save_config</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.send_command_w_enter" href="#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.send_command_w_enter">send_command_w_enter</a></code></li>
-<li><code><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.send_config_set" href="#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.session_preparation" href="#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.special_login_handler" href="#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH.special_login_handler">special_login_handler</a></code></li>
 </ul>
@@ -874,7 +771,7 @@ The commands will be executed one after the other.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/cisco_xr.html b/docs/netmiko/cisco/cisco_xr.html
index 24746979b7151825ac4022aaec1fbaf8a0622816..268905888d92bb8f5ab1608c881c011983a8af2b 100644
--- a/docs/netmiko/cisco/cisco_xr.html
+++ b/docs/netmiko/cisco/cisco_xr.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco.cisco_xr API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,12 +22,9 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import print_function
-from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 import re
 from netmiko.cisco_base_connection import CiscoBaseConnection, CiscoFileTransfer
-from netmiko.py23_compat import text_type
 
 
 class CiscoXrBase(CiscoBaseConnection):
@@ -41,10 +38,10 @@ class CiscoXrBase(CiscoBaseConnection):
         time.sleep(0.3 * self.global_delay_factor)
         self.clear_buffer()
 
-    def send_config_set(self, config_commands=None, exit_config_mode=True, **kwargs):
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
         &#34;&#34;&#34;IOS-XR requires you not exit from configuration mode.&#34;&#34;&#34;
-        return super(CiscoXrBase, self).send_config_set(
-            config_commands=config_commands, exit_config_mode=False, **kwargs
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
     def commit(
@@ -95,26 +92,26 @@ class CiscoXrBase(CiscoBaseConnection):
         if comment:
             if &#39;&#34;&#39; in comment:
                 raise ValueError(&#34;Invalid comment contains double quote&#34;)
-            comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+            comment = f&#39;&#34;{comment}&#34;&#39;
 
-        label = text_type(label)
+        label = str(label)
         error_marker = &#34;Failed to&#34;
         alt_error_marker = &#34;One or more commits have occurred from other&#34;
 
         # Select proper command string based on arguments provided
         if label:
             if comment:
-                command_string = &#34;commit label {} comment {}&#34;.format(label, comment)
+                command_string = f&#34;commit label {label} comment {comment}&#34;
             elif confirm:
                 command_string = &#34;commit label {} confirmed {}&#34;.format(
-                    label, text_type(confirm_delay)
+                    label, str(confirm_delay)
                 )
             else:
-                command_string = &#34;commit label {}&#34;.format(label)
+                command_string = f&#34;commit label {label}&#34;
         elif confirm:
-            command_string = &#34;commit confirmed {}&#34;.format(text_type(confirm_delay))
+            command_string = f&#34;commit confirmed {str(confirm_delay)}&#34;
         elif comment:
-            command_string = &#34;commit comment {}&#34;.format(comment)
+            command_string = f&#34;commit comment {comment}&#34;
         else:
             command_string = &#34;commit&#34;
 
@@ -127,17 +124,13 @@ class CiscoXrBase(CiscoBaseConnection):
             delay_factor=delay_factor,
         )
         if error_marker in output:
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
         if alt_error_marker in output:
             # Other commits occurred, don&#39;t proceed with commit
             output += self.send_command_timing(
                 &#34;no&#34;, strip_prompt=False, strip_command=False, delay_factor=delay_factor
             )
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
         return output
 
@@ -201,7 +194,7 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
         if match:
             return match.group(1)
         else:
-            raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))
+            raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)
 
     def remote_md5(self, base_cmd=&#34;show md5 file&#34;, remote_file=None):
         &#34;&#34;&#34;
@@ -215,7 +208,7 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
         # IOS-XR requires both the leading slash and the slash between file-system and file here
-        remote_md5_cmd = &#34;{} /{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} /{self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5
@@ -238,7 +231,7 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
 <dl>
 <dt id="netmiko.cisco.cisco_xr.CiscoXrBase"><code class="flex name class">
 <span>class <span class="ident">CiscoXrBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -358,6 +351,10 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -372,10 +369,10 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
         time.sleep(0.3 * self.global_delay_factor)
         self.clear_buffer()
 
-    def send_config_set(self, config_commands=None, exit_config_mode=True, **kwargs):
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
         &#34;&#34;&#34;IOS-XR requires you not exit from configuration mode.&#34;&#34;&#34;
-        return super(CiscoXrBase, self).send_config_set(
-            config_commands=config_commands, exit_config_mode=False, **kwargs
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
     def commit(
@@ -426,26 +423,26 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
         if comment:
             if &#39;&#34;&#39; in comment:
                 raise ValueError(&#34;Invalid comment contains double quote&#34;)
-            comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+            comment = f&#39;&#34;{comment}&#34;&#39;
 
-        label = text_type(label)
+        label = str(label)
         error_marker = &#34;Failed to&#34;
         alt_error_marker = &#34;One or more commits have occurred from other&#34;
 
         # Select proper command string based on arguments provided
         if label:
             if comment:
-                command_string = &#34;commit label {} comment {}&#34;.format(label, comment)
+                command_string = f&#34;commit label {label} comment {comment}&#34;
             elif confirm:
                 command_string = &#34;commit label {} confirmed {}&#34;.format(
-                    label, text_type(confirm_delay)
+                    label, str(confirm_delay)
                 )
             else:
-                command_string = &#34;commit label {}&#34;.format(label)
+                command_string = f&#34;commit label {label}&#34;
         elif confirm:
-            command_string = &#34;commit confirmed {}&#34;.format(text_type(confirm_delay))
+            command_string = f&#34;commit confirmed {str(confirm_delay)}&#34;
         elif comment:
-            command_string = &#34;commit comment {}&#34;.format(comment)
+            command_string = f&#34;commit comment {comment}&#34;
         else:
             command_string = &#34;commit&#34;
 
@@ -458,17 +455,13 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
             delay_factor=delay_factor,
         )
         if error_marker in output:
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
         if alt_error_marker in output:
             # Other commits occurred, don&#39;t proceed with commit
             output += self.send_command_timing(
                 &#34;no&#34;, strip_prompt=False, strip_command=False, delay_factor=delay_factor
             )
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
         return output
 
@@ -618,26 +611,26 @@ an exception to be generated.</p></section>
     if comment:
         if &#39;&#34;&#39; in comment:
             raise ValueError(&#34;Invalid comment contains double quote&#34;)
-        comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+        comment = f&#39;&#34;{comment}&#34;&#39;
 
-    label = text_type(label)
+    label = str(label)
     error_marker = &#34;Failed to&#34;
     alt_error_marker = &#34;One or more commits have occurred from other&#34;
 
     # Select proper command string based on arguments provided
     if label:
         if comment:
-            command_string = &#34;commit label {} comment {}&#34;.format(label, comment)
+            command_string = f&#34;commit label {label} comment {comment}&#34;
         elif confirm:
             command_string = &#34;commit label {} confirmed {}&#34;.format(
-                label, text_type(confirm_delay)
+                label, str(confirm_delay)
             )
         else:
-            command_string = &#34;commit label {}&#34;.format(label)
+            command_string = f&#34;commit label {label}&#34;
     elif confirm:
-        command_string = &#34;commit confirmed {}&#34;.format(text_type(confirm_delay))
+        command_string = f&#34;commit confirmed {str(confirm_delay)}&#34;
     elif comment:
-        command_string = &#34;commit comment {}&#34;.format(comment)
+        command_string = f&#34;commit comment {comment}&#34;
     else:
         command_string = &#34;commit&#34;
 
@@ -650,17 +643,13 @@ an exception to be generated.</p></section>
         delay_factor=delay_factor,
     )
     if error_marker in output:
-        raise ValueError(
-            &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
     if alt_error_marker in output:
         # Other commits occurred, don&#39;t proceed with commit
         output += self.send_command_timing(
             &#34;no&#34;, strip_prompt=False, strip_command=False, delay_factor=delay_factor
         )
-        raise ValueError(
-            &#34;Commit failed with the following errors:\n\n{}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
     return output</code></pre>
 </details>
@@ -701,16 +690,16 @@ an exception to be generated.</p></section>
 </details>
 </dd>
 <dt id="netmiko.cisco.cisco_xr.CiscoXrBase.send_config_set"><code class="name flex">
-<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=True, **kwargs)</span>
+<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=False, **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>IOS-XR requires you not exit from configuration mode.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def send_config_set(self, config_commands=None, exit_config_mode=True, **kwargs):
+<pre><code class="python">def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
     &#34;&#34;&#34;IOS-XR requires you not exit from configuration mode.&#34;&#34;&#34;
-    return super(CiscoXrBase, self).send_config_set(
-        config_commands=config_commands, exit_config_mode=False, **kwargs
+    return super().send_config_set(
+        config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
     )</code></pre>
 </details>
 </dd>
@@ -777,7 +766,7 @@ an exception to be generated.</p></section>
 </dd>
 <dt id="netmiko.cisco.cisco_xr.CiscoXrFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoXrFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS-XR SCP File Transfer driver.</p></section>
@@ -798,7 +787,7 @@ an exception to be generated.</p></section>
         if match:
             return match.group(1)
         else:
-            raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))
+            raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)
 
     def remote_md5(self, base_cmd=&#34;show md5 file&#34;, remote_file=None):
         &#34;&#34;&#34;
@@ -812,7 +801,7 @@ an exception to be generated.</p></section>
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
         # IOS-XR requires both the leading slash and the slash between file-system and file here
-        remote_md5_cmd = &#34;{} /{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} /{self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5
@@ -853,7 +842,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
     if match:
         return match.group(1)
     else:
-        raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))</code></pre>
+        raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.cisco_xr.CiscoXrFileTransfer.remote_md5"><code class="name flex">
@@ -876,7 +865,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
         elif self.direction == &#34;get&#34;:
             remote_file = self.source_file
     # IOS-XR requires both the leading slash and the slash between file-system and file here
-    remote_md5_cmd = &#34;{} /{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+    remote_md5_cmd = f&#34;{base_cmd} /{self.file_system}/{remote_file}&#34;
     dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
     dest_md5 = self.process_md5(dest_md5)
     return dest_md5</code></pre>
@@ -908,7 +897,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 </dd>
 <dt id="netmiko.cisco.cisco_xr.CiscoXrSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoXrSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco XR SSH driver.</p>
@@ -1028,6 +1017,10 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1092,7 +1085,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 </dd>
 <dt id="netmiko.cisco.cisco_xr.CiscoXrTelnet"><code class="flex name class">
 <span>class <span class="ident">CiscoXrTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco XR Telnet driver.</p>
@@ -1212,6 +1205,10 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1320,7 +1317,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco/index.html b/docs/netmiko/cisco/index.html
index 6a61fb1240d1c01b15083f1407e27db51d63f34e..d92757e57b5b176094e00a6a1e773173102cd754 100644
--- a/docs/netmiko/cisco/index.html
+++ b/docs/netmiko/cisco/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.cisco.cisco_ios import (
+<pre><code class="python">from netmiko.cisco.cisco_ios import (
     CiscoIosBase,
     CiscoIosSSH,
     CiscoIosTelnet,
@@ -102,7 +101,7 @@ Expressway/VCS …</p></section>
 <dl>
 <dt id="netmiko.cisco.CiscoAsaFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoAsaFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco ASA SCP File Transfer driver.</p></section>
@@ -145,7 +144,7 @@ Expressway/VCS …</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoAsaSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoAsaSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Subclass specific to Cisco ASA.</p>
@@ -265,6 +264,10 @@ Expressway/VCS …</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -296,7 +299,7 @@ Expressway/VCS …</p></section>
         If the ASA is in multi-context mode, then the base_prompt needs to be
         updated after each context change.
         &#34;&#34;&#34;
-        output = super(CiscoAsaSSH, self).send_command_timing(*args, **kwargs)
+        output = super().send_command_timing(*args, **kwargs)
         if len(args) &gt;= 1:
             command_string = args[0]
         else:
@@ -320,7 +323,7 @@ Expressway/VCS …</p></section>
             if len(args) &lt;= 1:
                 expect_string = kwargs.get(&#34;expect_string&#34;, &#34;#&#34;)
                 kwargs[&#34;expect_string&#34;] = expect_string
-        output = super(CiscoAsaSSH, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
 
         if &#34;changeto&#34; in command_string:
             self.set_base_prompt()
@@ -339,7 +342,7 @@ Expressway/VCS …</p></section>
         This switch of ASA contexts can occur in configuration mode. If this
         happens the trailing &#39;(config*&#39; needs stripped off.
         &#34;&#34;&#34;
-        cur_base_prompt = super(CiscoAsaSSH, self).set_base_prompt(*args, **kwargs)
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
         match = re.search(r&#34;(.*)\(conf.*&#34;, cur_base_prompt)
         if match:
             # strip off (conf.* from base_prompt
@@ -374,7 +377,7 @@ Expressway/VCS …</p></section>
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(CiscoAsaSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -432,7 +435,7 @@ Password: <strong><em>*</em></strong><strong>*</strong></p></section>
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(CiscoAsaSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -460,7 +463,7 @@ updated after each context change.</p></section>
         if len(args) &lt;= 1:
             expect_string = kwargs.get(&#34;expect_string&#34;, &#34;#&#34;)
             kwargs[&#34;expect_string&#34;] = expect_string
-    output = super(CiscoAsaSSH, self).send_command(*args, **kwargs)
+    output = super().send_command(*args, **kwargs)
 
     if &#34;changeto&#34; in command_string:
         self.set_base_prompt()
@@ -493,7 +496,7 @@ updated after each context change.</p></section>
     If the ASA is in multi-context mode, then the base_prompt needs to be
     updated after each context change.
     &#34;&#34;&#34;
-    output = super(CiscoAsaSSH, self).send_command_timing(*args, **kwargs)
+    output = super().send_command_timing(*args, **kwargs)
     if len(args) &gt;= 1:
         command_string = args[0]
     else:
@@ -549,7 +552,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
     This switch of ASA contexts can occur in configuration mode. If this
     happens the trailing &#39;(config*&#39; needs stripped off.
     &#34;&#34;&#34;
-    cur_base_prompt = super(CiscoAsaSSH, self).set_base_prompt(*args, **kwargs)
+    cur_base_prompt = super().set_base_prompt(*args, **kwargs)
     match = re.search(r&#34;(.*)\(conf.*&#34;, cur_base_prompt)
     if match:
         # strip off (conf.* from base_prompt
@@ -602,7 +605,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoIosBase"><code class="flex name class">
 <span>class <span class="ident">CiscoIosBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Common Methods for IOS (both SSH and telnet).</p>
@@ -722,6 +725,10 @@ happens the trailing '(config*' needs stripped off.</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -744,13 +751,11 @@ happens the trailing '(config*' needs stripped off.</p></section>
 
         Cisco IOS devices abbreviate the prompt at 20 chars in config mode
         &#34;&#34;&#34;
-        return super(CiscoIosBase, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config Using Copy Run Start&#34;&#34;&#34;
-        return super(CiscoIosBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -778,7 +783,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves Config Using Copy Run Start&#34;&#34;&#34;
-    return super(CiscoIosBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -850,7 +855,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoIosFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoIosFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS SCP File Transfer driver.</p></section>
@@ -897,7 +902,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoIosSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoIosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS SSH driver.</p>
@@ -1017,6 +1022,10 @@ happens the trailing '(config*' needs stripped off.</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1081,7 +1090,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoIosSerial"><code class="flex name class">
 <span>class <span class="ident">CiscoIosSerial</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS Serial driver.</p>
@@ -1201,6 +1210,10 @@ happens the trailing '(config*' needs stripped off.</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1265,7 +1278,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoIosTelnet"><code class="flex name class">
 <span>class <span class="ident">CiscoIosTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS Telnet driver.</p>
@@ -1385,6 +1398,10 @@ happens the trailing '(config*' needs stripped off.</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1449,7 +1466,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoNxosFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoNxosFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='bootflash:', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='bootflash:', direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco NXOS SCP File Transfer driver.</p></section>
@@ -1465,6 +1482,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
         dest_file,
         file_system=&#34;bootflash:&#34;,
         direction=&#34;put&#34;,
+        socket_timeout=10.0,
     ):
         self.ssh_ctl_chan = ssh_conn
         self.source_file = source_file
@@ -1485,11 +1503,13 @@ happens the trailing '(config*' needs stripped off.</p></section>
         else:
             raise ValueError(&#34;Invalid direction specified&#34;)
 
+        self.socket_timeout = socket_timeout
+
     def check_file_exists(self, remote_cmd=&#34;&#34;):
         &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
         if self.direction == &#34;put&#34;:
             if not remote_cmd:
-                remote_cmd = &#34;dir {}{}&#34;.format(self.file_system, self.dest_file)
+                remote_cmd = f&#34;dir {self.file_system}{self.dest_file}&#34;
             remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
             search_string = r&#34;{}.*Usage for&#34;.format(self.dest_file)
             if &#34;No such file or directory&#34; in remote_out:
@@ -1510,7 +1530,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
                 remote_file = self.source_file
 
         if not remote_cmd:
-            remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, remote_file)
+            remote_cmd = f&#34;dir {self.file_system}/{remote_file}&#34;
 
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         # Match line containing file name
@@ -1537,9 +1557,7 @@ happens the trailing '(config*' needs stripped off.</p></section>
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}{} md5sum&#34;.format(
-            base_cmd, self.file_system, remote_file
-        )
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}{remote_file} md5sum&#34;
         return self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500).strip()
 
     def enable_scp(self, cmd=None):
@@ -1595,7 +1613,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 </dd>
 <dt id="netmiko.cisco.CiscoNxosSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoNxosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -1715,6 +1733,10 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1737,9 +1759,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 
     def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(CiscoNxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )</code></pre>
+        return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -1758,9 +1778,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;#&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(CiscoNxosSSH, self).check_config_mode(
-        check_string=check_string, pattern=pattern
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.CiscoNxosSSH.normalize_linefeeds"><code class="name flex">
@@ -1847,7 +1865,7 @@ def process_md5(md5_output, pattern=r&#34;= (.*)&#34;):
 </dd>
 <dt id="netmiko.cisco.CiscoS300SSH"><code class="flex name class">
 <span>class <span class="ident">CiscoS300SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Support for Cisco SG300 series of devices.</p>
@@ -1970,6 +1988,10 @@ ip ssh password-auth</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1994,7 +2016,7 @@ ip ssh password-auth</p>
         time.sleep(0.3 * self.global_delay_factor)
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=True, confirm_response=&#34;Y&#34;):
-        return super(CiscoS300SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -2194,6 +2216,10 @@ ip ssh password-auth</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -2201,7 +2227,7 @@ ip ssh password-auth</p>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(CiscoTpTcCeSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def disable_paging(self, *args, **kwargs):
         &#34;&#34;&#34;Paging is disabled by default.&#34;&#34;&#34;
@@ -2252,13 +2278,6 @@ ip ssh password-auth</p>
 
         By default this method will keep waiting to receive data until the network device prompt is
         detected. The current network device prompt will be determined automatically.
-
-        command_string = command to execute
-        expect_string = pattern to search for uses re.search (use raw strings)
-        delay_factor = decrease the initial delay before we start looking for data
-        max_loops = number of iterations before we give up and raise an exception
-        strip_prompt = strip the trailing prompt from the output
-        strip_command = strip the leading command from the output
         &#34;&#34;&#34;
         if len(args) &gt;= 2:
             expect_string = args[1]
@@ -2269,7 +2288,7 @@ ip ssh password-auth</p>
                 expect_string = self.RETURN + expect_string + self.RETURN
                 kwargs.setdefault(&#34;expect_string&#34;, expect_string)
 
-        output = super(CiscoSSHConnection, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
         return output
 
     def save_config(self, *args, **kwargs):
@@ -2326,13 +2345,7 @@ ip ssh password-auth</p>
 <dd>
 <section class="desc"><p>Send command to network device retrieve output until router_prompt or expect_string</p>
 <p>By default this method will keep waiting to receive data until the network device prompt is
-detected. The current network device prompt will be determined automatically.</p>
-<p>command_string = command to execute
-expect_string = pattern to search for uses re.search (use raw strings)
-delay_factor = decrease the initial delay before we start looking for data
-max_loops = number of iterations before we give up and raise an exception
-strip_prompt = strip the trailing prompt from the output
-strip_command = strip the leading command from the output</p></section>
+detected. The current network device prompt will be determined automatically.</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def send_command(self, *args, **kwargs):
@@ -2341,13 +2354,6 @@ strip_command = strip the leading command from the output</p></section>
 
     By default this method will keep waiting to receive data until the network device prompt is
     detected. The current network device prompt will be determined automatically.
-
-    command_string = command to execute
-    expect_string = pattern to search for uses re.search (use raw strings)
-    delay_factor = decrease the initial delay before we start looking for data
-    max_loops = number of iterations before we give up and raise an exception
-    strip_prompt = strip the trailing prompt from the output
-    strip_command = strip the leading command from the output
     &#34;&#34;&#34;
     if len(args) &gt;= 2:
         expect_string = args[1]
@@ -2358,7 +2364,7 @@ strip_command = strip the leading command from the output</p></section>
             expect_string = self.RETURN + expect_string + self.RETURN
             kwargs.setdefault(&#34;expect_string&#34;, expect_string)
 
-    output = super(CiscoSSHConnection, self).send_command(*args, **kwargs)
+    output = super().send_command(*args, **kwargs)
     return output</code></pre>
 </details>
 </dd>
@@ -2471,7 +2477,7 @@ self.set_terminal_width()</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoWlcSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoWlcSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Netmiko Cisco WLC support.</p>
@@ -2591,6 +2597,10 @@ self.set_terminal_width()</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -2689,8 +2699,8 @@ self.set_terminal_width()</p></section>
         try:
             self.set_base_prompt()
         except ValueError:
-            msg = &#34;Authentication failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Authentication failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
         self.disable_paging(command=&#34;config paging disable&#34;)
         # Clear the read buffer
@@ -2705,59 +2715,33 @@ self.set_terminal_width()</p></section>
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).check_config_mode(check_string, pattern)
+        return super().check_config_mode(check_string, pattern)
 
     def config_mode(self, config_command=&#34;config&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Enter into config_mode.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).config_mode(config_command, pattern)
+        return super().config_mode(config_command, pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;Exit config_mode.&#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).exit_config_mode(exit_config, pattern)
+        return super().exit_config_mode(exit_config, pattern)
 
     def send_config_set(
         self,
         config_commands=None,
-        exit_config_mode=True,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
+        exit_config_mode=False,
+        enter_config_mode=False,
+        **kwargs,
     ):
-        &#34;&#34;&#34;
-        Send configuration commands down the SSH channel.
-
-        config_commands is an iterable containing all of the configuration commands.
-        The commands will be executed one after the other.
-
-        Does not automatically exit/enter configuration mode.
-        &#34;&#34;&#34;
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return &#34;&#34;
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, &#34;__iter__&#34;):
-            raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-        # Send config commands
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            time.sleep(delay_factor * 0.5)
-
-        # Gather output
-        output = self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
+        return super().send_config_set(
+            config_commands=config_commands,
+            exit_config_mode=exit_config_mode,
+            enter_config_mode=enter_config_mode,
+            **kwargs,
         )
-        output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
-        return output
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=True, confirm_response=&#34;y&#34;):
         &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
@@ -2791,7 +2775,7 @@ self.set_terminal_width()</p></section>
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt)
-    return super(CiscoWlcSSH, self).check_config_mode(check_string, pattern)</code></pre>
+    return super().check_config_mode(check_string, pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.CiscoWlcSSH.cleanup"><code class="name flex">
@@ -2817,7 +2801,7 @@ self.set_terminal_width()</p></section>
     &#34;&#34;&#34;Enter into config_mode.&#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt)
-    return super(CiscoWlcSSH, self).config_mode(config_command, pattern)</code></pre>
+    return super().config_mode(config_command, pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.CiscoWlcSSH.exit_config_mode"><code class="name flex">
@@ -2831,7 +2815,7 @@ self.set_terminal_width()</p></section>
     &#34;&#34;&#34;Exit config_mode.&#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt)
-    return super(CiscoWlcSSH, self).exit_config_mode(exit_config, pattern)</code></pre>
+    return super().exit_config_mode(exit_config, pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.CiscoWlcSSH.save_config"><code class="name flex">
@@ -2921,57 +2905,6 @@ Arguments are the same as send_command_timing() method</p></section>
     return output</code></pre>
 </details>
 </dd>
-<dt id="netmiko.cisco.CiscoWlcSSH.send_config_set"><code class="name flex">
-<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=True, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None)</span>
-</code></dt>
-<dd>
-<section class="desc"><p>Send configuration commands down the SSH channel.</p>
-<p>config_commands is an iterable containing all of the configuration commands.
-The commands will be executed one after the other.</p>
-<p>Does not automatically exit/enter configuration mode.</p></section>
-<details class="source">
-<summary>Source code</summary>
-<pre><code class="python">def send_config_set(
-    self,
-    config_commands=None,
-    exit_config_mode=True,
-    delay_factor=1,
-    max_loops=150,
-    strip_prompt=False,
-    strip_command=False,
-    config_mode_command=None,
-):
-    &#34;&#34;&#34;
-    Send configuration commands down the SSH channel.
-
-    config_commands is an iterable containing all of the configuration commands.
-    The commands will be executed one after the other.
-
-    Does not automatically exit/enter configuration mode.
-    &#34;&#34;&#34;
-    delay_factor = self.select_delay_factor(delay_factor)
-    if config_commands is None:
-        return &#34;&#34;
-    elif isinstance(config_commands, string_types):
-        config_commands = (config_commands,)
-
-    if not hasattr(config_commands, &#34;__iter__&#34;):
-        raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-    # Send config commands
-    for cmd in config_commands:
-        self.write_channel(self.normalize_cmd(cmd))
-        time.sleep(delay_factor * 0.5)
-
-    # Gather output
-    output = self._read_channel_timing(
-        delay_factor=delay_factor, max_loops=max_loops
-    )
-    output = self._sanitize_output(output)
-    log.debug(&#34;{}&#34;.format(output))
-    return output</code></pre>
-</details>
-</dd>
 <dt id="netmiko.cisco.CiscoWlcSSH.session_preparation"><code class="name flex">
 <span>def <span class="ident">session_preparation</span></span>(<span>self)</span>
 </code></dt>
@@ -2991,8 +2924,8 @@ The commands will be executed one after the other.</p>
     try:
         self.set_base_prompt()
     except ValueError:
-        msg = &#34;Authentication failed: {}&#34;.format(self.host)
-        raise NetMikoAuthenticationException(msg)
+        msg = f&#34;Authentication failed: {self.host}&#34;
+        raise NetmikoAuthenticationException(msg)
 
     self.disable_paging(command=&#34;config paging disable&#34;)
     # Clear the read buffer
@@ -3070,6 +3003,7 @@ The commands will be executed one after the other.</p>
 <li><code><a title="netmiko.base_connection.BaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
 <li><code><a title="netmiko.base_connection.BaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
@@ -3084,7 +3018,7 @@ The commands will be executed one after the other.</p>
 </dd>
 <dt id="netmiko.cisco.CiscoXrFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoXrFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco IOS-XR SCP File Transfer driver.</p></section>
@@ -3105,7 +3039,7 @@ The commands will be executed one after the other.</p>
         if match:
             return match.group(1)
         else:
-            raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))
+            raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)
 
     def remote_md5(self, base_cmd=&#34;show md5 file&#34;, remote_file=None):
         &#34;&#34;&#34;
@@ -3119,7 +3053,7 @@ The commands will be executed one after the other.</p>
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
         # IOS-XR requires both the leading slash and the slash between file-system and file here
-        remote_md5_cmd = &#34;{} /{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} /{self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5
@@ -3160,7 +3094,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
     if match:
         return match.group(1)
     else:
-        raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))</code></pre>
+        raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco.CiscoXrFileTransfer.remote_md5"><code class="name flex">
@@ -3183,7 +3117,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
         elif self.direction == &#34;get&#34;:
             remote_file = self.source_file
     # IOS-XR requires both the leading slash and the slash between file-system and file here
-    remote_md5_cmd = &#34;{} /{}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+    remote_md5_cmd = f&#34;{base_cmd} /{self.file_system}/{remote_file}&#34;
     dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
     dest_md5 = self.process_md5(dest_md5)
     return dest_md5</code></pre>
@@ -3215,7 +3149,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoXrSSH"><code class="flex name class">
 <span>class <span class="ident">CiscoXrSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco XR SSH driver.</p>
@@ -3335,6 +3269,10 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -3399,7 +3337,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 </dd>
 <dt id="netmiko.cisco.CiscoXrTelnet"><code class="flex name class">
 <span>class <span class="ident">CiscoXrTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Cisco XR Telnet driver.</p>
@@ -3519,6 +3457,10 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -3583,7 +3525,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 </dd>
 <dt id="netmiko.cisco.InLineTransfer"><code class="flex name class">
 <span>class <span class="ident">InLineTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file=None, dest_file=None, file_system=None, direction='put', source_config=None)</span>
+<span>(</span><span>ssh_conn, source_file=None, dest_file=None, file_system=None, direction='put', source_config=None, socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Use TCL on Cisco IOS to directly transfer file.</p></section>
@@ -3600,6 +3542,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
         file_system=None,
         direction=&#34;put&#34;,
         source_config=None,
+        socket_timeout=10.0,
     ):
         if source_file and source_config:
             msg = &#34;Invalid call to InLineTransfer both source_file and source_config specified.&#34;
@@ -3626,6 +3569,8 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
         else:
             self.file_system = file_system
 
+        self.socket_timeout = socket_timeout
+
     @staticmethod
     def _read_file(file_name):
         with io.open(file_name, &#34;rt&#34;, encoding=&#34;utf-8&#34;) as f:
@@ -3633,7 +3578,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 
     @staticmethod
     def _tcl_newline_rationalize(tcl_string):
-        &#34;&#34;&#34;
+        r&#34;&#34;&#34;
         When using put inside a TCL {} section the newline is considered a new TCL
         statement and causes a missing curly-brace message. Convert &#34;\n&#34; to &#34;\r&#34;. TCL
         will convert the &#34;\r&#34; to a &#34;\n&#34; i.e. you will see a &#34;\n&#34; inside the file on the
@@ -3665,9 +3610,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
         )
         for pattern in cmd_failed:
             if pattern in output:
-                raise ValueError(
-                    &#34;Failed to enter tclsh mode on router: {}&#34;.format(output)
-                )
+                raise ValueError(f&#34;Failed to enter tclsh mode on router: {output}&#34;)
         return output
 
     def _exit_tcl_mode(self):
@@ -3698,10 +3641,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
         return hashlib.md5(file_contents).hexdigest()
 
     def config_md5(self, source_config):
-        &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
-        file_contents = source_config + &#34;\n&#34;  # Cisco IOS automatically adds this
-        file_contents = file_contents.encode(&#34;UTF-8&#34;)
-        return hashlib.md5(file_contents).hexdigest()
+        return super().file_md5(source_config, add_newline=True)
 
     def put_file(self):
         curlybrace = r&#34;{&#34;
@@ -3772,12 +3712,24 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 <span>def <span class="ident">config_md5</span></span>(<span>self, source_config)</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Compute MD5 hash of file.</p></section>
+<section class="desc"></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def config_md5(self, source_config):
+    return super().file_md5(source_config, add_newline=True)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.cisco.InLineTransfer.file_md5"><code class="name flex">
+<span>def <span class="ident">file_md5</span></span>(<span>self, file_name)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Compute MD5 hash of file.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def file_md5(self, file_name):
     &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
-    file_contents = source_config + &#34;\n&#34;  # Cisco IOS automatically adds this
+    file_contents = self._read_file(file_name)
+    file_contents = file_contents + &#34;\n&#34;  # Cisco IOS automatically adds this
     file_contents = file_contents.encode(&#34;UTF-8&#34;)
     return hashlib.md5(file_contents).hexdigest()</code></pre>
 </details>
@@ -3793,7 +3745,6 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.disable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.disable_scp">disable_scp</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.enable_scp" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.enable_scp">enable_scp</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.establish_scp_conn" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.establish_scp_conn">establish_scp_conn</a></code></li>
-<li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.file_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.file_md5">file_md5</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.get_file" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.get_file">get_file</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.local_space_available" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.local_space_available">local_space_available</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.process_md5" href="../scp_handler.html#netmiko.scp_handler.BaseFileTransfer.process_md5">process_md5</a></code></li>
@@ -3910,7 +3861,6 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 <li><code><a title="netmiko.cisco.CiscoWlcSSH.exit_config_mode" href="#netmiko.cisco.CiscoWlcSSH.exit_config_mode">exit_config_mode</a></code></li>
 <li><code><a title="netmiko.cisco.CiscoWlcSSH.save_config" href="#netmiko.cisco.CiscoWlcSSH.save_config">save_config</a></code></li>
 <li><code><a title="netmiko.cisco.CiscoWlcSSH.send_command_w_enter" href="#netmiko.cisco.CiscoWlcSSH.send_command_w_enter">send_command_w_enter</a></code></li>
-<li><code><a title="netmiko.cisco.CiscoWlcSSH.send_config_set" href="#netmiko.cisco.CiscoWlcSSH.send_config_set">send_config_set</a></code></li>
 <li><code><a title="netmiko.cisco.CiscoWlcSSH.session_preparation" href="#netmiko.cisco.CiscoWlcSSH.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.cisco.CiscoWlcSSH.special_login_handler" href="#netmiko.cisco.CiscoWlcSSH.special_login_handler">special_login_handler</a></code></li>
 </ul>
@@ -3932,6 +3882,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 <h4><code><a title="netmiko.cisco.InLineTransfer" href="#netmiko.cisco.InLineTransfer">InLineTransfer</a></code></h4>
 <ul class="">
 <li><code><a title="netmiko.cisco.InLineTransfer.config_md5" href="#netmiko.cisco.InLineTransfer.config_md5">config_md5</a></code></li>
+<li><code><a title="netmiko.cisco.InLineTransfer.file_md5" href="#netmiko.cisco.InLineTransfer.file_md5">file_md5</a></code></li>
 </ul>
 </li>
 </ul>
@@ -3940,7 +3891,7 @@ c84843f0030efd44b01343fdb8c2e801</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cisco_base_connection.html b/docs/netmiko/cisco_base_connection.html
index 38baba94006f7444965120303e7f98dc426ffca2..b7a472ecf2c1ff434e7457e12f28a87bbe6b37c8 100644
--- a/docs/netmiko/cisco_base_connection.html
+++ b/docs/netmiko/cisco_base_connection.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cisco_base_connection API documentation</title>
 <meta name="description" content="CiscoBaseConnection is netmiko SSH class for Cisco and Cisco-like platforms." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,10 +24,9 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;CiscoBaseConnection is netmiko SSH class for Cisco and Cisco-like platforms.&#34;&#34;&#34;
-from __future__ import unicode_literals
 from netmiko.base_connection import BaseConnection
 from netmiko.scp_handler import BaseFileTransfer
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 import re
 import time
 
@@ -37,21 +36,15 @@ class CiscoBaseConnection(BaseConnection):
 
     def check_enable_mode(self, check_string=&#34;#&#34;):
         &#34;&#34;&#34;Check if in enable mode. Return boolean.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).check_enable_mode(
-            check_string=check_string
-        )
+        return super().check_enable_mode(check_string=check_string)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Enter enable mode.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def exit_enable_mode(self, exit_command=&#34;disable&#34;):
         &#34;&#34;&#34;Exits enable (privileged exec) mode.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).exit_enable_mode(
-            exit_command=exit_command
-        )
+        return super().exit_enable_mode(exit_command=exit_command)
 
     def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;
@@ -59,9 +52,7 @@ class CiscoBaseConnection(BaseConnection):
 
         Cisco IOS devices abbreviate the prompt at 20 chars in config mode
         &#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def config_mode(self, config_command=&#34;config term&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;
@@ -71,15 +62,11 @@ class CiscoBaseConnection(BaseConnection):
         &#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt[:16])
-        return super(CiscoBaseConnection, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def exit_config_mode(self, exit_config=&#34;end&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Exit from configuration mode.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def serial_login(
         self,
@@ -165,7 +152,7 @@ class CiscoBaseConnection(BaseConnection):
                     msg = &#34;Login failed - Password required, but none set: {}&#34;.format(
                         self.host
                     )
-                    raise NetMikoAuthenticationException(msg)
+                    raise NetmikoAuthenticationException(msg)
 
                 # Check if proper data received
                 if re.search(pri_prompt_terminator, output, flags=re.M) or re.search(
@@ -178,8 +165,8 @@ class CiscoBaseConnection(BaseConnection):
                 i += 1
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -192,8 +179,8 @@ class CiscoBaseConnection(BaseConnection):
             return return_msg
 
         self.remote_conn.close()
-        msg = &#34;Login failed: {}&#34;.format(self.host)
-        raise NetMikoAuthenticationException(msg)
+        msg = f&#34;Login failed: {self.host}&#34;
+        raise NetmikoAuthenticationException(msg)
 
     def cleanup(self):
         &#34;&#34;&#34;Gracefully exit the SSH session.&#34;&#34;&#34;
@@ -214,7 +201,7 @@ class CiscoBaseConnection(BaseConnection):
         if match:
             file_system = match.group(1)
             # Test file_system
-            cmd = &#34;dir {}&#34;.format(file_system)
+            cmd = f&#34;dir {file_system}&#34;
             output = self.send_command_expect(cmd)
             if &#34;% Invalid&#34; in output or &#34;%Error:&#34; in output:
                 raise ValueError(
@@ -238,15 +225,23 @@ class CiscoBaseConnection(BaseConnection):
         &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
         self.enable()
         if confirm:
-            output = self.send_command_timing(command_string=cmd)
+            output = self.send_command_timing(
+                command_string=cmd, strip_prompt=False, strip_command=False
+            )
             if confirm_response:
-                output += self.send_command_timing(confirm_response)
+                output += self.send_command_timing(
+                    confirm_response, strip_prompt=False, strip_command=False
+                )
             else:
                 # Send enter by default
-                output += self.send_command_timing(self.RETURN)
+                output += self.send_command_timing(
+                    self.RETURN, strip_prompt=False, strip_command=False
+                )
         else:
             # Some devices are slow so match on trailing-prompt if you can
-            output = self.send_command(command_string=cmd)
+            output = self.send_command(
+                command_string=cmd, strip_prompt=False, strip_command=False
+            )
         return output
 
 
@@ -269,7 +264,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 <dl>
 <dt id="netmiko.cisco_base_connection.CiscoBaseConnection"><code class="flex name class">
 <span>class <span class="ident">CiscoBaseConnection</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -389,6 +384,10 @@ class CiscoFileTransfer(BaseFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -397,21 +396,15 @@ class CiscoFileTransfer(BaseFileTransfer):
 
     def check_enable_mode(self, check_string=&#34;#&#34;):
         &#34;&#34;&#34;Check if in enable mode. Return boolean.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).check_enable_mode(
-            check_string=check_string
-        )
+        return super().check_enable_mode(check_string=check_string)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Enter enable mode.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def exit_enable_mode(self, exit_command=&#34;disable&#34;):
         &#34;&#34;&#34;Exits enable (privileged exec) mode.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).exit_enable_mode(
-            exit_command=exit_command
-        )
+        return super().exit_enable_mode(exit_command=exit_command)
 
     def check_config_mode(self, check_string=&#34;)#&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;
@@ -419,9 +412,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 
         Cisco IOS devices abbreviate the prompt at 20 chars in config mode
         &#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def config_mode(self, config_command=&#34;config term&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;
@@ -431,15 +422,11 @@ class CiscoFileTransfer(BaseFileTransfer):
         &#34;&#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt[:16])
-        return super(CiscoBaseConnection, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def exit_config_mode(self, exit_config=&#34;end&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Exit from configuration mode.&#34;&#34;&#34;
-        return super(CiscoBaseConnection, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def serial_login(
         self,
@@ -525,7 +512,7 @@ class CiscoFileTransfer(BaseFileTransfer):
                     msg = &#34;Login failed - Password required, but none set: {}&#34;.format(
                         self.host
                     )
-                    raise NetMikoAuthenticationException(msg)
+                    raise NetmikoAuthenticationException(msg)
 
                 # Check if proper data received
                 if re.search(pri_prompt_terminator, output, flags=re.M) or re.search(
@@ -538,8 +525,8 @@ class CiscoFileTransfer(BaseFileTransfer):
                 i += 1
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -552,8 +539,8 @@ class CiscoFileTransfer(BaseFileTransfer):
             return return_msg
 
         self.remote_conn.close()
-        msg = &#34;Login failed: {}&#34;.format(self.host)
-        raise NetMikoAuthenticationException(msg)
+        msg = f&#34;Login failed: {self.host}&#34;
+        raise NetmikoAuthenticationException(msg)
 
     def cleanup(self):
         &#34;&#34;&#34;Gracefully exit the SSH session.&#34;&#34;&#34;
@@ -574,7 +561,7 @@ class CiscoFileTransfer(BaseFileTransfer):
         if match:
             file_system = match.group(1)
             # Test file_system
-            cmd = &#34;dir {}&#34;.format(file_system)
+            cmd = f&#34;dir {file_system}&#34;
             output = self.send_command_expect(cmd)
             if &#34;% Invalid&#34; in output or &#34;%Error:&#34; in output:
                 raise ValueError(
@@ -598,15 +585,23 @@ class CiscoFileTransfer(BaseFileTransfer):
         &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
         self.enable()
         if confirm:
-            output = self.send_command_timing(command_string=cmd)
+            output = self.send_command_timing(
+                command_string=cmd, strip_prompt=False, strip_command=False
+            )
             if confirm_response:
-                output += self.send_command_timing(confirm_response)
+                output += self.send_command_timing(
+                    confirm_response, strip_prompt=False, strip_command=False
+                )
             else:
                 # Send enter by default
-                output += self.send_command_timing(self.RETURN)
+                output += self.send_command_timing(
+                    self.RETURN, strip_prompt=False, strip_command=False
+                )
         else:
             # Some devices are slow so match on trailing-prompt if you can
-            output = self.send_command(command_string=cmd)
+            output = self.send_command(
+                command_string=cmd, strip_prompt=False, strip_command=False
+            )
         return output</code></pre>
 </details>
 <h3>Ancestors</h3>
@@ -622,6 +617,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 <li><a title="netmiko.huawei.huawei.HuaweiBase" href="huawei/huawei.html#netmiko.huawei.huawei.HuaweiBase">HuaweiBase</a></li>
 <li><a title="netmiko.ipinfusion.ipinfusion_ocnos.IpInfusionOcNOSBase" href="ipinfusion/ipinfusion_ocnos.html#netmiko.ipinfusion.ipinfusion_ocnos.IpInfusionOcNOSBase">IpInfusionOcNOSBase</a></li>
 <li><a title="netmiko.oneaccess.oneaccess_oneos.OneaccessOneOSBase" href="oneaccess/oneaccess_oneos.html#netmiko.oneaccess.oneaccess_oneos.OneaccessOneOSBase">OneaccessOneOSBase</a></li>
+<li><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="ruijie/ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></li>
 </ul>
 <h3>Methods</h3>
 <dl>
@@ -639,9 +635,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 
     Cisco IOS devices abbreviate the prompt at 20 chars in config mode
     &#34;&#34;&#34;
-    return super(CiscoBaseConnection, self).check_config_mode(
-        check_string=check_string, pattern=pattern
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode"><code class="name flex">
@@ -653,9 +647,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 <summary>Source code</summary>
 <pre><code class="python">def check_enable_mode(self, check_string=&#34;#&#34;):
     &#34;&#34;&#34;Check if in enable mode. Return boolean.&#34;&#34;&#34;
-    return super(CiscoBaseConnection, self).check_enable_mode(
-        check_string=check_string
-    )</code></pre>
+    return super().check_enable_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoBaseConnection.cleanup"><code class="name flex">
@@ -692,9 +684,7 @@ class CiscoFileTransfer(BaseFileTransfer):
     &#34;&#34;&#34;
     if not pattern:
         pattern = re.escape(self.base_prompt[:16])
-    return super(CiscoBaseConnection, self).config_mode(
-        config_command=config_command, pattern=pattern
-    )</code></pre>
+    return super().config_mode(config_command=config_command, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoBaseConnection.enable"><code class="name flex">
@@ -706,9 +696,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 <summary>Source code</summary>
 <pre><code class="python">def enable(self, cmd=&#34;enable&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
     &#34;&#34;&#34;Enter enable mode.&#34;&#34;&#34;
-    return super(CiscoBaseConnection, self).enable(
-        cmd=cmd, pattern=pattern, re_flags=re_flags
-    )</code></pre>
+    return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode"><code class="name flex">
@@ -720,9 +708,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;end&#34;, pattern=&#34;#&#34;):
     &#34;&#34;&#34;Exit from configuration mode.&#34;&#34;&#34;
-    return super(CiscoBaseConnection, self).exit_config_mode(
-        exit_config=exit_config, pattern=pattern
-    )</code></pre>
+    return super().exit_config_mode(exit_config=exit_config, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode"><code class="name flex">
@@ -734,9 +720,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 <summary>Source code</summary>
 <pre><code class="python">def exit_enable_mode(self, exit_command=&#34;disable&#34;):
     &#34;&#34;&#34;Exits enable (privileged exec) mode.&#34;&#34;&#34;
-    return super(CiscoBaseConnection, self).exit_enable_mode(
-        exit_command=exit_command
-    )</code></pre>
+    return super().exit_enable_mode(exit_command=exit_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoBaseConnection.save_config"><code class="name flex">
@@ -755,15 +739,23 @@ class CiscoFileTransfer(BaseFileTransfer):
     &#34;&#34;&#34;Saves Config.&#34;&#34;&#34;
     self.enable()
     if confirm:
-        output = self.send_command_timing(command_string=cmd)
+        output = self.send_command_timing(
+            command_string=cmd, strip_prompt=False, strip_command=False
+        )
         if confirm_response:
-            output += self.send_command_timing(confirm_response)
+            output += self.send_command_timing(
+                confirm_response, strip_prompt=False, strip_command=False
+            )
         else:
             # Send enter by default
-            output += self.send_command_timing(self.RETURN)
+            output += self.send_command_timing(
+                self.RETURN, strip_prompt=False, strip_command=False
+            )
     else:
         # Some devices are slow so match on trailing-prompt if you can
-        output = self.send_command(command_string=cmd)
+        output = self.send_command(
+            command_string=cmd, strip_prompt=False, strip_command=False
+        )
     return output</code></pre>
 </details>
 </dd>
@@ -866,7 +858,7 @@ class CiscoFileTransfer(BaseFileTransfer):
                 msg = &#34;Login failed - Password required, but none set: {}&#34;.format(
                     self.host
                 )
-                raise NetMikoAuthenticationException(msg)
+                raise NetmikoAuthenticationException(msg)
 
             # Check if proper data received
             if re.search(pri_prompt_terminator, output, flags=re.M) or re.search(
@@ -879,8 +871,8 @@ class CiscoFileTransfer(BaseFileTransfer):
             i += 1
         except EOFError:
             self.remote_conn.close()
-            msg = &#34;Login failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Login failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
     # Last try to see if we already logged in
     self.write_channel(self.TELNET_RETURN)
@@ -893,8 +885,8 @@ class CiscoFileTransfer(BaseFileTransfer):
         return return_msg
 
     self.remote_conn.close()
-    msg = &#34;Login failed: {}&#34;.format(self.host)
-    raise NetMikoAuthenticationException(msg)</code></pre>
+    msg = f&#34;Login failed: {self.host}&#34;
+    raise NetmikoAuthenticationException(msg)</code></pre>
 </details>
 </dd>
 </dl>
@@ -939,7 +931,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoFileTransfer"><code class="flex name class">
 <span>class <span class="ident">CiscoFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Class to manage SCP file transfer and associated SSH control channel.</p></section>
@@ -988,7 +980,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 </dd>
 <dt id="netmiko.cisco_base_connection.CiscoSSHConnection"><code class="flex name class">
 <span>class <span class="ident">CiscoSSHConnection</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -1108,6 +1100,10 @@ class CiscoFileTransfer(BaseFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1123,13 +1119,11 @@ class CiscoFileTransfer(BaseFileTransfer):
 <ul class="hlist">
 <li><a title="netmiko.a10.a10_ssh.A10SSH" href="a10/a10_ssh.html#netmiko.a10.a10_ssh.A10SSH">A10SSH</a></li>
 <li><a title="netmiko.accedian.accedian_ssh.AccedianSSH" href="accedian/accedian_ssh.html#netmiko.accedian.accedian_ssh.AccedianSSH">AccedianSSH</a></li>
-<li><a title="netmiko.alcatel.alcatel_sros_ssh.AlcatelSrosSSH" href="alcatel/alcatel_sros_ssh.html#netmiko.alcatel.alcatel_sros_ssh.AlcatelSrosSSH">AlcatelSrosSSH</a></li>
 <li><a title="netmiko.alcatel.alcatel_aos_ssh.AlcatelAosSSH" href="alcatel/alcatel_aos_ssh.html#netmiko.alcatel.alcatel_aos_ssh.AlcatelAosSSH">AlcatelAosSSH</a></li>
 <li><a title="netmiko.arista.arista.AristaBase" href="arista/arista.html#netmiko.arista.arista.AristaBase">AristaBase</a></li>
 <li><a title="netmiko.apresia.apresia_aeos.ApresiaAeosBase" href="apresia/apresia_aeos.html#netmiko.apresia.apresia_aeos.ApresiaAeosBase">ApresiaAeosBase</a></li>
 <li><a title="netmiko.aruba.aruba_ssh.ArubaSSH" href="aruba/aruba_ssh.html#netmiko.aruba.aruba_ssh.ArubaSSH">ArubaSSH</a></li>
 <li><a title="netmiko.calix.calix_b6.CalixB6Base" href="calix/calix_b6.html#netmiko.calix.calix_b6.CalixB6Base">CalixB6Base</a></li>
-<li><a title="netmiko.ciena.ciena_saos_ssh.CienaSaosSSH" href="ciena/ciena_saos_ssh.html#netmiko.ciena.ciena_saos_ssh.CienaSaosSSH">CienaSaosSSH</a></li>
 <li><a title="netmiko.cisco.cisco_asa_ssh.CiscoAsaSSH" href="cisco/cisco_asa_ssh.html#netmiko.cisco.cisco_asa_ssh.CiscoAsaSSH">CiscoAsaSSH</a></li>
 <li><a title="netmiko.cisco.cisco_nxos_ssh.CiscoNxosSSH" href="cisco/cisco_nxos_ssh.html#netmiko.cisco.cisco_nxos_ssh.CiscoNxosSSH">CiscoNxosSSH</a></li>
 <li><a title="netmiko.cisco.cisco_s300.CiscoS300SSH" href="cisco/cisco_s300.html#netmiko.cisco.cisco_s300.CiscoS300SSH">CiscoS300SSH</a></li>
@@ -1139,6 +1133,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 <li><a title="netmiko.dell.dell_force10_ssh.DellForce10SSH" href="dell/dell_force10_ssh.html#netmiko.dell.dell_force10_ssh.DellForce10SSH">DellForce10SSH</a></li>
 <li><a title="netmiko.dell.dell_os10_ssh.DellOS10SSH" href="dell/dell_os10_ssh.html#netmiko.dell.dell_os10_ssh.DellOS10SSH">DellOS10SSH</a></li>
 <li><a title="netmiko.eltex.eltex_ssh.EltexSSH" href="eltex/eltex_ssh.html#netmiko.eltex.eltex_ssh.EltexSSH">EltexSSH</a></li>
+<li><a title="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH" href="eltex/eltex_esr_ssh.html#netmiko.eltex.eltex_esr_ssh.EltexEsrSSH">EltexEsrSSH</a></li>
 <li><a title="netmiko.endace.endace_ssh.EndaceSSH" href="endace/endace_ssh.html#netmiko.endace.endace_ssh.EndaceSSH">EndaceSSH</a></li>
 <li><a title="netmiko.enterasys.enterasys_ssh.EnterasysSSH" href="enterasys/enterasys_ssh.html#netmiko.enterasys.enterasys_ssh.EnterasysSSH">EnterasysSSH</a></li>
 <li><a title="netmiko.extreme.extreme_ers_ssh.ExtremeErsSSH" href="extreme/extreme_ers_ssh.html#netmiko.extreme.extreme_ers_ssh.ExtremeErsSSH">ExtremeErsSSH</a></li>
@@ -1252,7 +1247,7 @@ class CiscoFileTransfer(BaseFileTransfer):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/citrix/index.html b/docs/netmiko/citrix/index.html
index 6a734d8d40ab9b2cd760be733d677ee87d156ebb..2041f3b532235b536633ff339c57d41afd0b5f20 100644
--- a/docs/netmiko/citrix/index.html
+++ b/docs/netmiko/citrix/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.citrix API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.citrix.netscaler_ssh import NetscalerSSH
+<pre><code class="python">from netmiko.citrix.netscaler_ssh import NetscalerSSH
 
 __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.citrix.NetscalerSSH"><code class="flex name class">
 <span>class <span class="ident">NetscalerSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Netscaler SSH class. </p>
@@ -166,6 +165,10 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -178,7 +181,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
         delay_factor = self.select_delay_factor(delay_factor=0)
         self._test_channel_read()
         self.set_base_prompt()
-        cmd = &#34;{}set cli mode -page OFF{}&#34;.format(self.RETURN, self.RETURN)
+        cmd = f&#34;{self.RETURN}set cli mode -page OFF{self.RETURN}&#34;
         self.disable_paging(command=cmd)
         time.sleep(1 * delay_factor)
         self.set_base_prompt()
@@ -194,7 +197,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
         &#34;&#34;&#34;
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {}&#34;.format(repr(prompt)))
+            raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
 
         prompt = prompt.strip()
         if len(prompt) == 1:
@@ -218,7 +221,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
 
     def strip_prompt(self, a_string):
         &#34;&#34;&#34; Strip &#39;Done&#39; from command output &#34;&#34;&#34;
-        output = super(NetscalerSSH, self).strip_prompt(a_string)
+        output = super().strip_prompt(a_string)
         lines = output.split(self.RESPONSE_RETURN)
         if &#34;Done&#34; in lines[-1]:
             return self.RESPONSE_RETURN.join(lines[:-1])
@@ -280,7 +283,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
     delay_factor = self.select_delay_factor(delay_factor=0)
     self._test_channel_read()
     self.set_base_prompt()
-    cmd = &#34;{}set cli mode -page OFF{}&#34;.format(self.RETURN, self.RETURN)
+    cmd = f&#34;{self.RETURN}set cli mode -page OFF{self.RETURN}&#34;
     self.disable_paging(command=cmd)
     time.sleep(1 * delay_factor)
     self.set_base_prompt()
@@ -305,7 +308,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
     &#34;&#34;&#34;
     prompt = self.find_prompt(delay_factor=delay_factor)
     if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-        raise ValueError(&#34;Router prompt not found: {}&#34;.format(repr(prompt)))
+        raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
 
     prompt = prompt.strip()
     if len(prompt) == 1:
@@ -325,7 +328,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def strip_prompt(self, a_string):
     &#34;&#34;&#34; Strip &#39;Done&#39; from command output &#34;&#34;&#34;
-    output = super(NetscalerSSH, self).strip_prompt(a_string)
+    output = super().strip_prompt(a_string)
     lines = output.split(self.RESPONSE_RETURN)
     if &#34;Done&#34; in lines[-1]:
         return self.RESPONSE_RETURN.join(lines[:-1])
@@ -414,7 +417,7 @@ __all__ = [&#34;NetscalerSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/citrix/netscaler_ssh.html b/docs/netmiko/citrix/netscaler_ssh.html
index a61024907d9692d7403207b83706b7348d30f6e3..d3c09632a0313e643fe90f30b5d206e66b16a0d4 100644
--- a/docs/netmiko/citrix/netscaler_ssh.html
+++ b/docs/netmiko/citrix/netscaler_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.citrix.netscaler_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -36,7 +36,7 @@ class NetscalerSSH(BaseConnection):
         delay_factor = self.select_delay_factor(delay_factor=0)
         self._test_channel_read()
         self.set_base_prompt()
-        cmd = &#34;{}set cli mode -page OFF{}&#34;.format(self.RETURN, self.RETURN)
+        cmd = f&#34;{self.RETURN}set cli mode -page OFF{self.RETURN}&#34;
         self.disable_paging(command=cmd)
         time.sleep(1 * delay_factor)
         self.set_base_prompt()
@@ -52,7 +52,7 @@ class NetscalerSSH(BaseConnection):
         &#34;&#34;&#34;
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {}&#34;.format(repr(prompt)))
+            raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
 
         prompt = prompt.strip()
         if len(prompt) == 1:
@@ -76,7 +76,7 @@ class NetscalerSSH(BaseConnection):
 
     def strip_prompt(self, a_string):
         &#34;&#34;&#34; Strip &#39;Done&#39; from command output &#34;&#34;&#34;
-        output = super(NetscalerSSH, self).strip_prompt(a_string)
+        output = super().strip_prompt(a_string)
         lines = output.split(self.RESPONSE_RETURN)
         if &#34;Done&#34; in lines[-1]:
             return self.RESPONSE_RETURN.join(lines[:-1])
@@ -95,7 +95,7 @@ class NetscalerSSH(BaseConnection):
 <dl>
 <dt id="netmiko.citrix.netscaler_ssh.NetscalerSSH"><code class="flex name class">
 <span>class <span class="ident">NetscalerSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Netscaler SSH class. </p>
@@ -215,6 +215,10 @@ class NetscalerSSH(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -227,7 +231,7 @@ class NetscalerSSH(BaseConnection):
         delay_factor = self.select_delay_factor(delay_factor=0)
         self._test_channel_read()
         self.set_base_prompt()
-        cmd = &#34;{}set cli mode -page OFF{}&#34;.format(self.RETURN, self.RETURN)
+        cmd = f&#34;{self.RETURN}set cli mode -page OFF{self.RETURN}&#34;
         self.disable_paging(command=cmd)
         time.sleep(1 * delay_factor)
         self.set_base_prompt()
@@ -243,7 +247,7 @@ class NetscalerSSH(BaseConnection):
         &#34;&#34;&#34;
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {}&#34;.format(repr(prompt)))
+            raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
 
         prompt = prompt.strip()
         if len(prompt) == 1:
@@ -267,7 +271,7 @@ class NetscalerSSH(BaseConnection):
 
     def strip_prompt(self, a_string):
         &#34;&#34;&#34; Strip &#39;Done&#39; from command output &#34;&#34;&#34;
-        output = super(NetscalerSSH, self).strip_prompt(a_string)
+        output = super().strip_prompt(a_string)
         lines = output.split(self.RESPONSE_RETURN)
         if &#34;Done&#34; in lines[-1]:
             return self.RESPONSE_RETURN.join(lines[:-1])
@@ -329,7 +333,7 @@ class NetscalerSSH(BaseConnection):
     delay_factor = self.select_delay_factor(delay_factor=0)
     self._test_channel_read()
     self.set_base_prompt()
-    cmd = &#34;{}set cli mode -page OFF{}&#34;.format(self.RETURN, self.RETURN)
+    cmd = f&#34;{self.RETURN}set cli mode -page OFF{self.RETURN}&#34;
     self.disable_paging(command=cmd)
     time.sleep(1 * delay_factor)
     self.set_base_prompt()
@@ -354,7 +358,7 @@ class NetscalerSSH(BaseConnection):
     &#34;&#34;&#34;
     prompt = self.find_prompt(delay_factor=delay_factor)
     if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-        raise ValueError(&#34;Router prompt not found: {}&#34;.format(repr(prompt)))
+        raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
 
     prompt = prompt.strip()
     if len(prompt) == 1:
@@ -374,7 +378,7 @@ class NetscalerSSH(BaseConnection):
 <summary>Source code</summary>
 <pre><code class="python">def strip_prompt(self, a_string):
     &#34;&#34;&#34; Strip &#39;Done&#39; from command output &#34;&#34;&#34;
-    output = super(NetscalerSSH, self).strip_prompt(a_string)
+    output = super().strip_prompt(a_string)
     lines = output.split(self.RESPONSE_RETURN)
     if &#34;Done&#34; in lines[-1]:
         return self.RESPONSE_RETURN.join(lines[:-1])
@@ -458,7 +462,7 @@ class NetscalerSSH(BaseConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cloudgenix/cloudgenix_ion.html b/docs/netmiko/cloudgenix/cloudgenix_ion.html
index 011c4ff0f2dde314b109c8bbc51de1371ea1bd36..8b390648e567bcff45b2a9d7452677b5cb357755 100644
--- a/docs/netmiko/cloudgenix/cloudgenix_ion.html
+++ b/docs/netmiko/cloudgenix/cloudgenix_ion.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cloudgenix.cloudgenix_ion API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,16 +22,12 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">import time
-
-from netmiko import log
-from netmiko.cisco_base_connection import CiscoSSHConnection
-from netmiko.py23_compat import string_types
+<pre><code class="python">from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
 class CloudGenixIonSSH(CiscoSSHConnection):
     def establish_connection(self):
-        super(CloudGenixIonSSH, self).establish_connection(width=100, height=1000)
+        super().establish_connection(width=100, height=1000)
 
     def session_preparation(self, *args, **kwargs):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -45,12 +41,12 @@ class CloudGenixIonSSH(CiscoSSHConnection):
         return &#34;&#34;
 
     def find_prompt(self, delay_factor=1):
-        prompt = super(CloudGenixIonSSH, self).find_prompt()
+        prompt = super().find_prompt(delay_factor=delay_factor)
         prompt = self.strip_backspaces(prompt).strip()
         return prompt
 
     def strip_command(self, command_string, output):
-        output = super(CloudGenixIonSSH, self).strip_command(command_string, output)
+        output = super().strip_command(command_string, output)
         # command_string gets repainted potentially multiple times (grab everything after last one)
         output = output.split(command_string)[-1]
         return output
@@ -71,37 +67,10 @@ class CloudGenixIonSSH(CiscoSSHConnection):
         &#34;&#34;&#34;No save method on ION SSH&#34;&#34;&#34;
         pass
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return &#34;&#34;
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, &#34;__iter__&#34;):
-            raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-        # Send config commands
-        output = &#34;&#34;
-        for cmd in config_commands:
-            output += self.send_command(cmd)
-            if self.fast_cli:
-                pass
-            else:
-                time.sleep(delay_factor * 0.05)
-
-        output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
-        return output</code></pre>
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )</code></pre>
 </details>
 </section>
 <section>
@@ -115,7 +84,7 @@ class CloudGenixIonSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.cloudgenix.cloudgenix_ion.CloudGenixIonSSH"><code class="flex name class">
 <span>class <span class="ident">CloudGenixIonSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -235,12 +204,16 @@ class CloudGenixIonSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class CloudGenixIonSSH(CiscoSSHConnection):
     def establish_connection(self):
-        super(CloudGenixIonSSH, self).establish_connection(width=100, height=1000)
+        super().establish_connection(width=100, height=1000)
 
     def session_preparation(self, *args, **kwargs):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -254,12 +227,12 @@ class CloudGenixIonSSH(CiscoSSHConnection):
         return &#34;&#34;
 
     def find_prompt(self, delay_factor=1):
-        prompt = super(CloudGenixIonSSH, self).find_prompt()
+        prompt = super().find_prompt(delay_factor=delay_factor)
         prompt = self.strip_backspaces(prompt).strip()
         return prompt
 
     def strip_command(self, command_string, output):
-        output = super(CloudGenixIonSSH, self).strip_command(command_string, output)
+        output = super().strip_command(command_string, output)
         # command_string gets repainted potentially multiple times (grab everything after last one)
         output = output.split(command_string)[-1]
         return output
@@ -280,37 +253,10 @@ class CloudGenixIonSSH(CiscoSSHConnection):
         &#34;&#34;&#34;No save method on ION SSH&#34;&#34;&#34;
         pass
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return &#34;&#34;
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, &#34;__iter__&#34;):
-            raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-        # Send config commands
-        output = &#34;&#34;
-        for cmd in config_commands:
-            output += self.send_command(cmd)
-            if self.fast_cli:
-                pass
-            else:
-                time.sleep(delay_factor * 0.05)
-
-        output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
-        return output</code></pre>
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -471,7 +417,7 @@ class CloudGenixIonSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/cloudgenix/index.html b/docs/netmiko/cloudgenix/index.html
index 90e6550727ecb1f57c0f678aa93b456d6f459c8f..fa4a677429d6c5fe7dc69e0d5be5d12b2bf01608 100644
--- a/docs/netmiko/cloudgenix/index.html
+++ b/docs/netmiko/cloudgenix/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.cloudgenix API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -45,7 +45,7 @@ __all__ = [&#34;CloudGenixIonSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.cloudgenix.CloudGenixIonSSH"><code class="flex name class">
 <span>class <span class="ident">CloudGenixIonSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -165,12 +165,16 @@ __all__ = [&#34;CloudGenixIonSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class CloudGenixIonSSH(CiscoSSHConnection):
     def establish_connection(self):
-        super(CloudGenixIonSSH, self).establish_connection(width=100, height=1000)
+        super().establish_connection(width=100, height=1000)
 
     def session_preparation(self, *args, **kwargs):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -184,12 +188,12 @@ __all__ = [&#34;CloudGenixIonSSH&#34;]</code></pre>
         return &#34;&#34;
 
     def find_prompt(self, delay_factor=1):
-        prompt = super(CloudGenixIonSSH, self).find_prompt()
+        prompt = super().find_prompt(delay_factor=delay_factor)
         prompt = self.strip_backspaces(prompt).strip()
         return prompt
 
     def strip_command(self, command_string, output):
-        output = super(CloudGenixIonSSH, self).strip_command(command_string, output)
+        output = super().strip_command(command_string, output)
         # command_string gets repainted potentially multiple times (grab everything after last one)
         output = output.split(command_string)[-1]
         return output
@@ -210,37 +214,10 @@ __all__ = [&#34;CloudGenixIonSSH&#34;]</code></pre>
         &#34;&#34;&#34;No save method on ION SSH&#34;&#34;&#34;
         pass
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return &#34;&#34;
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, &#34;__iter__&#34;):
-            raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
-
-        # Send config commands
-        output = &#34;&#34;
-        for cmd in config_commands:
-            output += self.send_command(cmd)
-            if self.fast_cli:
-                pass
-            else:
-                time.sleep(delay_factor * 0.05)
-
-        output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
-        return output</code></pre>
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -406,7 +383,7 @@ __all__ = [&#34;CloudGenixIonSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/coriant/coriant_ssh.html b/docs/netmiko/coriant/coriant_ssh.html
index 2e00b19e225d3204b0381bec159b9c802662ea37..0cb94d48298dba5d7c255bcf83bfe18c55c5ff2c 100644
--- a/docs/netmiko/coriant/coriant_ssh.html
+++ b/docs/netmiko/coriant/coriant_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.coriant.coriant_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.cisco_base_connection import CiscoSSHConnection
+<pre><code class="python">from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
 class CoriantSSH(CiscoSSHConnection):
@@ -56,7 +55,7 @@ class CoriantSSH(CiscoSSHConnection):
         self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;&gt;&#34;, delay_factor=2
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        super(CoriantSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -79,7 +78,7 @@ class CoriantSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.coriant.coriant_ssh.CoriantSSH"><code class="flex name class">
 <span>class <span class="ident">CoriantSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -199,6 +198,10 @@ class CoriantSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -232,7 +235,7 @@ class CoriantSSH(CiscoSSHConnection):
         self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;&gt;&#34;, delay_factor=2
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        super(CoriantSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -310,7 +313,7 @@ class CoriantSSH(CiscoSSHConnection):
     self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;&gt;&#34;, delay_factor=2
 ):
     &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-    super(CoriantSSH, self).set_base_prompt(
+    super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -394,7 +397,7 @@ class CoriantSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/coriant/index.html b/docs/netmiko/coriant/index.html
index 347b9f6bc600a5a5d7d06e0a03214c9d00574c80..4bcb988bd69b7cd7e8f29ad3940f81a8edf506f6 100644
--- a/docs/netmiko/coriant/index.html
+++ b/docs/netmiko/coriant/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.coriant API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -45,7 +45,7 @@ __all__ = [&#34;CoriantSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.coriant.CoriantSSH"><code class="flex name class">
 <span>class <span class="ident">CoriantSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -165,6 +165,10 @@ __all__ = [&#34;CoriantSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -198,7 +202,7 @@ __all__ = [&#34;CoriantSSH&#34;]</code></pre>
         self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;&gt;&#34;, delay_factor=2
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        super(CoriantSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -276,7 +280,7 @@ __all__ = [&#34;CoriantSSH&#34;]</code></pre>
     self, pri_prompt_terminator=&#34;:&#34;, alt_prompt_terminator=&#34;&gt;&#34;, delay_factor=2
 ):
     &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-    super(CoriantSSH, self).set_base_prompt(
+    super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -365,7 +369,7 @@ __all__ = [&#34;CoriantSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/dell/dell_dnos6.html b/docs/netmiko/dell/dell_dnos6.html
index 79e115c11be877e859de4fc437843766465dcea3..e6bb1dcdabead11f212eba9c18925f2966d36109 100644
--- a/docs/netmiko/dell/dell_dnos6.html
+++ b/docs/netmiko/dell/dell_dnos6.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.dell.dell_dnos6 API documentation</title>
 <meta name="description" content="Dell N2/3/4000 base driver- supports DNOS6." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Dell N2/3/4000 base driver- supports DNOS6.&#34;&#34;&#34;
-from __future__ import unicode_literals
 from netmiko.dell.dell_powerconnect import DellPowerConnectBase
 import time
 
@@ -49,7 +48,7 @@ class DellDNOS6Base(DellPowerConnectBase):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellDNOS6Base, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -73,7 +72,7 @@ class DellDNOS6Telnet(DellDNOS6Base):
 <dl>
 <dt id="netmiko.dell.dell_dnos6.DellDNOS6Base"><code class="flex name class">
 <span>class <span class="ident">DellDNOS6Base</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -193,6 +192,10 @@ class DellDNOS6Telnet(DellDNOS6Base):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -216,7 +219,7 @@ class DellDNOS6Telnet(DellDNOS6Base):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellDNOS6Base, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -247,7 +250,7 @@ class DellDNOS6Telnet(DellDNOS6Base):
     confirm_response=&#34;&#34;,
 ):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(DellDNOS6Base, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -302,7 +305,7 @@ class DellDNOS6Telnet(DellDNOS6Base):
 </dd>
 <dt id="netmiko.dell.dell_dnos6.DellDNOS6SSH"><code class="flex name class">
 <span>class <span class="ident">DellDNOS6SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -422,6 +425,10 @@ class DellDNOS6Telnet(DellDNOS6Base):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -485,7 +492,7 @@ class DellDNOS6Telnet(DellDNOS6Base):
 </dd>
 <dt id="netmiko.dell.dell_dnos6.DellDNOS6Telnet"><code class="flex name class">
 <span>class <span class="ident">DellDNOS6Telnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -605,6 +612,10 @@ class DellDNOS6Telnet(DellDNOS6Base):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -700,7 +711,7 @@ class DellDNOS6Telnet(DellDNOS6Base):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/dell/dell_force10_ssh.html b/docs/netmiko/dell/dell_force10_ssh.html
index d32687ce9020920bd6d8c93b6b2b2d2c9d761716..5ac4f561c9dd4d14dcb82f135be7aa0c3a37461d 100644
--- a/docs/netmiko/dell/dell_force10_ssh.html
+++ b/docs/netmiko/dell/dell_force10_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.dell.dell_force10_ssh API documentation</title>
 <meta name="description" content="Dell Force10 Driver - supports DNOS9." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Dell Force10 Driver - supports DNOS9.&#34;&#34;&#34;
-from __future__ import unicode_literals
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -38,7 +37,7 @@ class DellForce10SSH(CiscoSSHConnection):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellForce10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -54,7 +53,7 @@ class DellForce10SSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.dell.dell_force10_ssh.DellForce10SSH"><code class="flex name class">
 <span>class <span class="ident">DellForce10SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell Force10 Driver - supports DNOS9.</p>
@@ -174,6 +173,10 @@ class DellForce10SSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -187,7 +190,7 @@ class DellForce10SSH(CiscoSSHConnection):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellForce10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -213,7 +216,7 @@ class DellForce10SSH(CiscoSSHConnection):
     confirm_response=&#34;&#34;,
 ):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(DellForce10SSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -294,7 +297,7 @@ class DellForce10SSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/dell/dell_isilon_ssh.html b/docs/netmiko/dell/dell_isilon_ssh.html
index 6f549b62c10451cab2d069c4631d252848becf58..54dfcdc2abc4167cc1113123f257c199af9f0d6f 100644
--- a/docs/netmiko/dell/dell_isilon_ssh.html
+++ b/docs/netmiko/dell/dell_isilon_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.dell.dell_isilon_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-import time
+<pre><code class="python">import time
 import re
 
 from netmiko.base_connection import BaseConnection
@@ -35,7 +33,7 @@ class DellIsilonSSH(BaseConnection):
         self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-        return super(DellIsilonSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -44,7 +42,7 @@ class DellIsilonSSH(BaseConnection):
     def strip_ansi_escape_codes(self, string_buffer):
         &#34;&#34;&#34;Remove Null code&#34;&#34;&#34;
         output = re.sub(r&#34;\x00&#34;, &#34;&#34;, string_buffer)
-        return super(DellIsilonSSH, self).strip_ansi_escape_codes(output)
+        return super().strip_ansi_escape_codes(output)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -67,7 +65,7 @@ class DellIsilonSSH(BaseConnection):
         self.clear_buffer()
 
     def set_prompt(self, prompt_terminator=&#34;$&#34;):
-        prompt = &#34;PROMPT=&#39;%m{}&#39;&#34;.format(prompt_terminator)
+        prompt = f&#34;PROMPT=&#39;%m{prompt_terminator}&#39;&#34;
         command = self.RETURN + prompt + self.RETURN
         self.write_channel(command)
 
@@ -88,7 +86,7 @@ class DellIsilonSSH(BaseConnection):
         pass
 
     def check_config_mode(self, check_string=&#34;#&#34;):
-        return super(DellIsilonSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;sudo su&#34;):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
@@ -109,7 +107,7 @@ class DellIsilonSSH(BaseConnection):
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-        return super(DellIsilonSSH, self).exit_config_mode(exit_config=exit_config)</code></pre>
+        return super().exit_config_mode(exit_config=exit_config)</code></pre>
 </details>
 </section>
 <section>
@@ -123,7 +121,7 @@ class DellIsilonSSH(BaseConnection):
 <dl>
 <dt id="netmiko.dell.dell_isilon_ssh.DellIsilonSSH"><code class="flex name class">
 <span>class <span class="ident">DellIsilonSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -244,6 +242,10 @@ class DellIsilonSSH(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -252,7 +254,7 @@ class DellIsilonSSH(BaseConnection):
         self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-        return super(DellIsilonSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -261,7 +263,7 @@ class DellIsilonSSH(BaseConnection):
     def strip_ansi_escape_codes(self, string_buffer):
         &#34;&#34;&#34;Remove Null code&#34;&#34;&#34;
         output = re.sub(r&#34;\x00&#34;, &#34;&#34;, string_buffer)
-        return super(DellIsilonSSH, self).strip_ansi_escape_codes(output)
+        return super().strip_ansi_escape_codes(output)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -284,7 +286,7 @@ class DellIsilonSSH(BaseConnection):
         self.clear_buffer()
 
     def set_prompt(self, prompt_terminator=&#34;$&#34;):
-        prompt = &#34;PROMPT=&#39;%m{}&#39;&#34;.format(prompt_terminator)
+        prompt = f&#34;PROMPT=&#39;%m{prompt_terminator}&#39;&#34;
         command = self.RETURN + prompt + self.RETURN
         self.write_channel(command)
 
@@ -305,7 +307,7 @@ class DellIsilonSSH(BaseConnection):
         pass
 
     def check_config_mode(self, check_string=&#34;#&#34;):
-        return super(DellIsilonSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;sudo su&#34;):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
@@ -326,7 +328,7 @@ class DellIsilonSSH(BaseConnection):
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-        return super(DellIsilonSSH, self).exit_config_mode(exit_config=exit_config)</code></pre>
+        return super().exit_config_mode(exit_config=exit_config)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -404,7 +406,7 @@ class DellIsilonSSH(BaseConnection):
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;exit&#34;):
     &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-    return super(DellIsilonSSH, self).exit_config_mode(exit_config=exit_config)</code></pre>
+    return super().exit_config_mode(exit_config=exit_config)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.dell.dell_isilon_ssh.DellIsilonSSH.exit_enable_mode"><code class="name flex">
@@ -448,7 +450,7 @@ class DellIsilonSSH(BaseConnection):
     self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
 ):
     &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-    return super(DellIsilonSSH, self).set_base_prompt(
+    return super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -463,7 +465,7 @@ class DellIsilonSSH(BaseConnection):
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def set_prompt(self, prompt_terminator=&#34;$&#34;):
-    prompt = &#34;PROMPT=&#39;%m{}&#39;&#34;.format(prompt_terminator)
+    prompt = f&#34;PROMPT=&#39;%m{prompt_terminator}&#39;&#34;
     command = self.RETURN + prompt + self.RETURN
     self.write_channel(command)</code></pre>
 </details>
@@ -478,7 +480,7 @@ class DellIsilonSSH(BaseConnection):
 <pre><code class="python">def strip_ansi_escape_codes(self, string_buffer):
     &#34;&#34;&#34;Remove Null code&#34;&#34;&#34;
     output = re.sub(r&#34;\x00&#34;, &#34;&#34;, string_buffer)
-    return super(DellIsilonSSH, self).strip_ansi_escape_codes(output)</code></pre>
+    return super().strip_ansi_escape_codes(output)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.dell.dell_isilon_ssh.DellIsilonSSH.zsh_mode"><code class="name flex">
@@ -577,7 +579,7 @@ class DellIsilonSSH(BaseConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/dell/dell_os10_ssh.html b/docs/netmiko/dell/dell_os10_ssh.html
index 13c79b0f1dd01428e93a6c30184a109aad3b4d1a..c931489b1f0273f60c1828c7f2f8952cb6a5d0d0 100644
--- a/docs/netmiko/dell/dell_os10_ssh.html
+++ b/docs/netmiko/dell/dell_os10_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.dell.dell_os10_ssh API documentation</title>
 <meta name="description" content="Dell EMC Networking OS10 Driver - supports dellos10." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -41,7 +41,7 @@ class DellOS10SSH(CiscoSSHConnection):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellOS10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -50,16 +50,21 @@ class DellOS10FileTransfer(BaseFileTransfer):
     &#34;&#34;&#34;Dell EMC Networking OS10 SCP File Transfer driver.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=None, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/home/admin&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        if file_system is None:
-            file_system = &#34;/home/admin&#34;
-        super(DellOS10FileTransfer, self).__init__(
+        super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
         self.folder_name = &#34;/config&#34;
 
@@ -70,7 +75,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_cmd = &#39;system &#34;ls -l {}/{}&#34;&#39;.format(self.file_system, remote_file)
+        remote_cmd = f&#39;system &#34;ls -l {self.file_system}/{remote_file}&#34;&#39;
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         for line in remote_out.splitlines():
             if remote_file in line:
@@ -83,7 +88,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
 
     def remote_space_available(self, search_pattern=r&#34;(\d+) bytes free&#34;):
         &#34;&#34;&#34;Return space available on remote device.&#34;&#34;&#34;
-        remote_cmd = &#39;system &#34;df {}&#34;&#39;.format(self.folder_name)
+        remote_cmd = f&#39;system &#34;df {self.folder_name}&#34;&#39;
         remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         for line in remote_output.splitlines():
             if self.folder_name in line:
@@ -104,7 +109,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#39;system &#34;md5sum {}/{}&#34;&#39;.format(self.file_system, remote_file)
+        remote_md5_cmd = f&#39;system &#34;md5sum {self.file_system}/{remote_file}&#34;&#39;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5.strip()
@@ -120,14 +125,14 @@ class DellOS10FileTransfer(BaseFileTransfer):
 
     def put_file(self):
         &#34;&#34;&#34;SCP copy the file from the local system to the remote device.&#34;&#34;&#34;
-        destination = &#34;{}&#34;.format(self.dest_file)
+        destination = f&#34;{self.dest_file}&#34;
         self.scp_conn.scp_transfer_file(self.source_file, destination)
         # Must close the SCP connection to get the file written (flush)
         self.scp_conn.close()
 
     def get_file(self):
         &#34;&#34;&#34;SCP copy the file from the remote device to local system.&#34;&#34;&#34;
-        source_file = &#34;{}&#34;.format(self.source_file)
+        source_file = f&#34;{self.source_file}&#34;
         self.scp_conn.scp_get_file(source_file, self.dest_file)
         self.scp_conn.close()</code></pre>
 </details>
@@ -143,7 +148,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
 <dl>
 <dt id="netmiko.dell.dell_os10_ssh.DellOS10FileTransfer"><code class="flex name class">
 <span>class <span class="ident">DellOS10FileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/home/admin', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell EMC Networking OS10 SCP File Transfer driver.</p></section>
@@ -153,16 +158,21 @@ class DellOS10FileTransfer(BaseFileTransfer):
     &#34;&#34;&#34;Dell EMC Networking OS10 SCP File Transfer driver.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=None, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/home/admin&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        if file_system is None:
-            file_system = &#34;/home/admin&#34;
-        super(DellOS10FileTransfer, self).__init__(
+        super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
         self.folder_name = &#34;/config&#34;
 
@@ -173,7 +183,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_cmd = &#39;system &#34;ls -l {}/{}&#34;&#39;.format(self.file_system, remote_file)
+        remote_cmd = f&#39;system &#34;ls -l {self.file_system}/{remote_file}&#34;&#39;
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         for line in remote_out.splitlines():
             if remote_file in line:
@@ -186,7 +196,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
 
     def remote_space_available(self, search_pattern=r&#34;(\d+) bytes free&#34;):
         &#34;&#34;&#34;Return space available on remote device.&#34;&#34;&#34;
-        remote_cmd = &#39;system &#34;df {}&#34;&#39;.format(self.folder_name)
+        remote_cmd = f&#39;system &#34;df {self.folder_name}&#34;&#39;
         remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         for line in remote_output.splitlines():
             if self.folder_name in line:
@@ -207,7 +217,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#39;system &#34;md5sum {}/{}&#34;&#39;.format(self.file_system, remote_file)
+        remote_md5_cmd = f&#39;system &#34;md5sum {self.file_system}/{remote_file}&#34;&#39;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5.strip()
@@ -223,14 +233,14 @@ class DellOS10FileTransfer(BaseFileTransfer):
 
     def put_file(self):
         &#34;&#34;&#34;SCP copy the file from the local system to the remote device.&#34;&#34;&#34;
-        destination = &#34;{}&#34;.format(self.dest_file)
+        destination = f&#34;{self.dest_file}&#34;
         self.scp_conn.scp_transfer_file(self.source_file, destination)
         # Must close the SCP connection to get the file written (flush)
         self.scp_conn.close()
 
     def get_file(self):
         &#34;&#34;&#34;SCP copy the file from the remote device to local system.&#34;&#34;&#34;
-        source_file = &#34;{}&#34;.format(self.source_file)
+        source_file = f&#34;{self.source_file}&#34;
         self.scp_conn.scp_get_file(source_file, self.dest_file)
         self.scp_conn.close()</code></pre>
 </details>
@@ -254,7 +264,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
             remote_file = self.dest_file
         elif self.direction == &#34;get&#34;:
             remote_file = self.source_file
-    remote_md5_cmd = &#39;system &#34;md5sum {}/{}&#34;&#39;.format(self.file_system, remote_file)
+    remote_md5_cmd = f&#39;system &#34;md5sum {self.file_system}/{remote_file}&#34;&#39;
     dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
     dest_md5 = self.process_md5(dest_md5)
     return dest_md5.strip()</code></pre>
@@ -287,7 +297,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
 </dd>
 <dt id="netmiko.dell.dell_os10_ssh.DellOS10SSH"><code class="flex name class">
 <span>class <span class="ident">DellOS10SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell EMC Networking OS10 Driver - supports dellos10.</p>
@@ -407,6 +417,10 @@ class DellOS10FileTransfer(BaseFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -420,7 +434,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellOS10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -446,7 +460,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
     confirm_response=&#34;&#34;,
 ):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(DellOS10SSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -533,7 +547,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/dell/dell_powerconnect.html b/docs/netmiko/dell/dell_powerconnect.html
index ebc2053cefceceb1ef480f0de96df780ea767451..42405dba56e34d560a8f41236ec6be63a4ed112d 100644
--- a/docs/netmiko/dell/dell_powerconnect.html
+++ b/docs/netmiko/dell/dell_powerconnect.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.dell.dell_powerconnect API documentation</title>
 <meta name="description" content="Dell PowerConnect Driver." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Dell PowerConnect Driver.&#34;&#34;&#34;
-from __future__ import unicode_literals
 from paramiko import SSHClient
 import time
 from os import path
@@ -55,7 +54,7 @@ class DellPowerConnectBase(CiscoBaseConnection):
         self, pri_prompt_terminator=&#34;&gt;&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        prompt = super(DellPowerConnectBase, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -66,15 +65,11 @@ class DellPowerConnectBase(CiscoBaseConnection):
 
     def check_config_mode(self, check_string=&#34;(config)#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-        return super(DellPowerConnectBase, self).check_config_mode(
-            check_string=check_string
-        )
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;config&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(DellPowerConnectBase, self).config_mode(
-            config_command=config_command
-        )
+        return super().config_mode(config_command=config_command)
 
 
 class DellPowerConnectSSH(DellPowerConnectBase):
@@ -150,7 +145,7 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
 <dl>
 <dt id="netmiko.dell.dell_powerconnect.DellPowerConnectBase"><code class="flex name class">
 <span>class <span class="ident">DellPowerConnectBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -270,6 +265,10 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -291,7 +290,7 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
         self, pri_prompt_terminator=&#34;&gt;&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        prompt = super(DellPowerConnectBase, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -302,15 +301,11 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
 
     def check_config_mode(self, check_string=&#34;(config)#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-        return super(DellPowerConnectBase, self).check_config_mode(
-            check_string=check_string
-        )
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;config&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(DellPowerConnectBase, self).config_mode(
-            config_command=config_command
-        )</code></pre>
+        return super().config_mode(config_command=config_command)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -334,9 +329,7 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;(config)#&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-    return super(DellPowerConnectBase, self).check_config_mode(
-        check_string=check_string
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.dell.dell_powerconnect.DellPowerConnectBase.config_mode"><code class="name flex">
@@ -348,9 +341,7 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;config&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(DellPowerConnectBase, self).config_mode(
-        config_command=config_command
-    )</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.dell.dell_powerconnect.DellPowerConnectBase.session_preparation"><code class="name flex">
@@ -383,7 +374,7 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
     self, pri_prompt_terminator=&#34;&gt;&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
 ):
     &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-    prompt = super(DellPowerConnectBase, self).set_base_prompt(
+    prompt = super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -440,7 +431,7 @@ class DellPowerConnectTelnet(DellPowerConnectBase):
 </dd>
 <dt id="netmiko.dell.dell_powerconnect.DellPowerConnectSSH"><code class="flex name class">
 <span>class <span class="ident">DellPowerConnectSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -562,6 +553,10 @@ If we use login/password, the ssh server use the (none) auth mechanism.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -714,7 +709,7 @@ If we use login/password, the ssh server use the (none) auth mechanism.</p>
 </dd>
 <dt id="netmiko.dell.dell_powerconnect.DellPowerConnectTelnet"><code class="flex name class">
 <span>class <span class="ident">DellPowerConnectTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Telnet Driver.</p>
@@ -834,6 +829,10 @@ If we use login/password, the ssh server use the (none) auth mechanism.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -975,7 +974,7 @@ SSH agent (if one is running).</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/dell/index.html b/docs/netmiko/dell/index.html
index 66d4ccf0f050fda2b22b1b3cd620dda8ddfded8f..07484a7fb89e84427186cd2a010cd948ba015c05 100644
--- a/docs/netmiko/dell/index.html
+++ b/docs/netmiko/dell/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.dell API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.dell.dell_dnos6 import DellDNOS6SSH
+<pre><code class="python">from netmiko.dell.dell_dnos6 import DellDNOS6SSH
 from netmiko.dell.dell_dnos6 import DellDNOS6Telnet
 from netmiko.dell.dell_force10_ssh import DellForce10SSH
 from netmiko.dell.dell_os10_ssh import DellOS10SSH, DellOS10FileTransfer
@@ -77,7 +76,7 @@ __all__ = [
 <dl>
 <dt id="netmiko.dell.DellDNOS6SSH"><code class="flex name class">
 <span>class <span class="ident">DellDNOS6SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -197,6 +196,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -260,7 +263,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.dell.DellDNOS6Telnet"><code class="flex name class">
 <span>class <span class="ident">DellDNOS6Telnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -380,6 +383,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -443,7 +450,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.dell.DellForce10SSH"><code class="flex name class">
 <span>class <span class="ident">DellForce10SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell Force10 Driver - supports DNOS9.</p>
@@ -563,6 +570,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -576,7 +587,7 @@ __all__ = [
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellForce10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -602,7 +613,7 @@ __all__ = [
     confirm_response=&#34;&#34;,
 ):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(DellForce10SSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -657,7 +668,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.dell.DellIsilonSSH"><code class="flex name class">
 <span>class <span class="ident">DellIsilonSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -778,6 +789,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -786,7 +801,7 @@ __all__ = [
         self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-        return super(DellIsilonSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -795,7 +810,7 @@ __all__ = [
     def strip_ansi_escape_codes(self, string_buffer):
         &#34;&#34;&#34;Remove Null code&#34;&#34;&#34;
         output = re.sub(r&#34;\x00&#34;, &#34;&#34;, string_buffer)
-        return super(DellIsilonSSH, self).strip_ansi_escape_codes(output)
+        return super().strip_ansi_escape_codes(output)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -818,7 +833,7 @@ __all__ = [
         self.clear_buffer()
 
     def set_prompt(self, prompt_terminator=&#34;$&#34;):
-        prompt = &#34;PROMPT=&#39;%m{}&#39;&#34;.format(prompt_terminator)
+        prompt = f&#34;PROMPT=&#39;%m{prompt_terminator}&#39;&#34;
         command = self.RETURN + prompt + self.RETURN
         self.write_channel(command)
 
@@ -839,7 +854,7 @@ __all__ = [
         pass
 
     def check_config_mode(self, check_string=&#34;#&#34;):
-        return super(DellIsilonSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;sudo su&#34;):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
@@ -860,7 +875,7 @@ __all__ = [
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-        return super(DellIsilonSSH, self).exit_config_mode(exit_config=exit_config)</code></pre>
+        return super().exit_config_mode(exit_config=exit_config)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -938,7 +953,7 @@ __all__ = [
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;exit&#34;):
     &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-    return super(DellIsilonSSH, self).exit_config_mode(exit_config=exit_config)</code></pre>
+    return super().exit_config_mode(exit_config=exit_config)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.dell.DellIsilonSSH.exit_enable_mode"><code class="name flex">
@@ -982,7 +997,7 @@ __all__ = [
     self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
 ):
     &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-    return super(DellIsilonSSH, self).set_base_prompt(
+    return super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -997,7 +1012,7 @@ __all__ = [
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def set_prompt(self, prompt_terminator=&#34;$&#34;):
-    prompt = &#34;PROMPT=&#39;%m{}&#39;&#34;.format(prompt_terminator)
+    prompt = f&#34;PROMPT=&#39;%m{prompt_terminator}&#39;&#34;
     command = self.RETURN + prompt + self.RETURN
     self.write_channel(command)</code></pre>
 </details>
@@ -1012,7 +1027,7 @@ __all__ = [
 <pre><code class="python">def strip_ansi_escape_codes(self, string_buffer):
     &#34;&#34;&#34;Remove Null code&#34;&#34;&#34;
     output = re.sub(r&#34;\x00&#34;, &#34;&#34;, string_buffer)
-    return super(DellIsilonSSH, self).strip_ansi_escape_codes(output)</code></pre>
+    return super().strip_ansi_escape_codes(output)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.dell.DellIsilonSSH.zsh_mode"><code class="name flex">
@@ -1075,7 +1090,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.dell.DellOS10FileTransfer"><code class="flex name class">
 <span>class <span class="ident">DellOS10FileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/home/admin', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell EMC Networking OS10 SCP File Transfer driver.</p></section>
@@ -1085,16 +1100,21 @@ __all__ = [
     &#34;&#34;&#34;Dell EMC Networking OS10 SCP File Transfer driver.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=None, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/home/admin&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        if file_system is None:
-            file_system = &#34;/home/admin&#34;
-        super(DellOS10FileTransfer, self).__init__(
+        super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
         self.folder_name = &#34;/config&#34;
 
@@ -1105,7 +1125,7 @@ __all__ = [
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_cmd = &#39;system &#34;ls -l {}/{}&#34;&#39;.format(self.file_system, remote_file)
+        remote_cmd = f&#39;system &#34;ls -l {self.file_system}/{remote_file}&#34;&#39;
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         for line in remote_out.splitlines():
             if remote_file in line:
@@ -1118,7 +1138,7 @@ __all__ = [
 
     def remote_space_available(self, search_pattern=r&#34;(\d+) bytes free&#34;):
         &#34;&#34;&#34;Return space available on remote device.&#34;&#34;&#34;
-        remote_cmd = &#39;system &#34;df {}&#34;&#39;.format(self.folder_name)
+        remote_cmd = f&#39;system &#34;df {self.folder_name}&#34;&#39;
         remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         for line in remote_output.splitlines():
             if self.folder_name in line:
@@ -1139,7 +1159,7 @@ __all__ = [
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#39;system &#34;md5sum {}/{}&#34;&#39;.format(self.file_system, remote_file)
+        remote_md5_cmd = f&#39;system &#34;md5sum {self.file_system}/{remote_file}&#34;&#39;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5.strip()
@@ -1155,14 +1175,14 @@ __all__ = [
 
     def put_file(self):
         &#34;&#34;&#34;SCP copy the file from the local system to the remote device.&#34;&#34;&#34;
-        destination = &#34;{}&#34;.format(self.dest_file)
+        destination = f&#34;{self.dest_file}&#34;
         self.scp_conn.scp_transfer_file(self.source_file, destination)
         # Must close the SCP connection to get the file written (flush)
         self.scp_conn.close()
 
     def get_file(self):
         &#34;&#34;&#34;SCP copy the file from the remote device to local system.&#34;&#34;&#34;
-        source_file = &#34;{}&#34;.format(self.source_file)
+        source_file = f&#34;{self.source_file}&#34;
         self.scp_conn.scp_get_file(source_file, self.dest_file)
         self.scp_conn.close()</code></pre>
 </details>
@@ -1186,7 +1206,7 @@ __all__ = [
             remote_file = self.dest_file
         elif self.direction == &#34;get&#34;:
             remote_file = self.source_file
-    remote_md5_cmd = &#39;system &#34;md5sum {}/{}&#34;&#39;.format(self.file_system, remote_file)
+    remote_md5_cmd = f&#39;system &#34;md5sum {self.file_system}/{remote_file}&#34;&#39;
     dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
     dest_md5 = self.process_md5(dest_md5)
     return dest_md5.strip()</code></pre>
@@ -1219,7 +1239,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.dell.DellOS10SSH"><code class="flex name class">
 <span>class <span class="ident">DellOS10SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell EMC Networking OS10 Driver - supports dellos10.</p>
@@ -1339,6 +1359,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1352,7 +1376,7 @@ __all__ = [
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(DellOS10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -1378,7 +1402,7 @@ __all__ = [
     confirm_response=&#34;&#34;,
 ):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(DellOS10SSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -1433,7 +1457,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.dell.DellPowerConnectSSH"><code class="flex name class">
 <span>class <span class="ident">DellPowerConnectSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Driver.</p>
@@ -1555,6 +1579,10 @@ If we use login/password, the ssh server use the (none) auth mechanism.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1707,7 +1735,7 @@ If we use login/password, the ssh server use the (none) auth mechanism.</p>
 </dd>
 <dt id="netmiko.dell.DellPowerConnectTelnet"><code class="flex name class">
 <span>class <span class="ident">DellPowerConnectTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Dell PowerConnect Telnet Driver.</p>
@@ -1827,6 +1855,10 @@ If we use login/password, the ssh server use the (none) auth mechanism.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1969,7 +2001,7 @@ If we use login/password, the ssh server use the (none) auth mechanism.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/eltex/eltex_esr_ssh.html b/docs/netmiko/eltex/eltex_esr_ssh.html
new file mode 100644
index 0000000000000000000000000000000000000000..98ba9b01ea35734e665ed29950e67266d172a28f
--- /dev/null
+++ b/docs/netmiko/eltex/eltex_esr_ssh.html
@@ -0,0 +1,552 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.6.3" />
+<title>netmiko.eltex.eltex_esr_ssh API documentation</title>
+<meta name="description" content="" />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>netmiko.eltex.eltex_esr_ssh</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">import time
+from netmiko.cisco_base_connection import CiscoSSHConnection
+
+
+class EltexEsrSSH(CiscoSSHConnection):
+    &#34;&#34;&#34;Netmiko support for routers Eltex ESR.&#34;&#34;&#34;
+
+    def session_preparation(self):
+        &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        self.ansi_escape_codes = True
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;terminal datadump&#34;)
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;)#&#34;):
+        &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
+        return super().config_mode(config_command=config_command, pattern=pattern)
+
+    def check_config_mode(self, check_string=&#34;(config&#34;, pattern=&#34;&#34;):
+        &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        &#34;&#34;&#34;Not Implemented (use commit() method)&#34;&#34;&#34;
+        raise NotImplementedError
+
+    def commit(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Commit the candidate configuration.
+        Commit the entered configuration.
+        Raise an error and return the failure
+        if the commit fails.
+        default:
+           command_string = commit
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Can&#39;t commit configuration&#34;
+        command_string = &#34;commit&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output
+
+    def _confirm(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Confirm the candidate configuration.
+        Raise an error and return the failure if the confirm fails.
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Nothing to confirm in configuration&#34;
+        command_string = &#34;confirm&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Confirm failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output
+
+    def _restore(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Restore the candidate configuration.
+
+        Raise an error and return the failure if the restore fails.
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Can&#39;t find backup of previous configuration!&#34;
+        command_string = &#34;restore&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Restore failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH"><code class="flex name class">
+<span>class <span class="ident">EltexEsrSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Netmiko support for routers Eltex ESR.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class EltexEsrSSH(CiscoSSHConnection):
+    &#34;&#34;&#34;Netmiko support for routers Eltex ESR.&#34;&#34;&#34;
+
+    def session_preparation(self):
+        &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        self.ansi_escape_codes = True
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;terminal datadump&#34;)
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;)#&#34;):
+        &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
+        return super().config_mode(config_command=config_command, pattern=pattern)
+
+    def check_config_mode(self, check_string=&#34;(config&#34;, pattern=&#34;&#34;):
+        &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        &#34;&#34;&#34;Not Implemented (use commit() method)&#34;&#34;&#34;
+        raise NotImplementedError
+
+    def commit(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Commit the candidate configuration.
+        Commit the entered configuration.
+        Raise an error and return the failure
+        if the commit fails.
+        default:
+           command_string = commit
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Can&#39;t commit configuration&#34;
+        command_string = &#34;commit&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output
+
+    def _confirm(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Confirm the candidate configuration.
+        Raise an error and return the failure if the confirm fails.
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Nothing to confirm in configuration&#34;
+        command_string = &#34;confirm&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Confirm failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output
+
+    def _restore(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Restore the candidate configuration.
+
+        Raise an error and return the failure if the restore fails.
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Can&#39;t find backup of previous configuration!&#34;
+        command_string = &#34;restore&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Restore failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></li>
+<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.check_config_mode"><code class="name flex">
+<span>def <span class="ident">check_config_mode</span></span>(<span>self, check_string='(config', pattern='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Checks whether in configuration mode. Returns a boolean.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_config_mode(self, check_string=&#34;(config&#34;, pattern=&#34;&#34;):
+    &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.commit"><code class="name flex">
+<span>def <span class="ident">commit</span></span>(<span>self, delay_factor=1)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Commit the candidate configuration.
+Commit the entered configuration.
+Raise an error and return the failure
+if the commit fails.
+default:
+command_string = commit</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def commit(self, delay_factor=1):
+    &#34;&#34;&#34;
+    Commit the candidate configuration.
+    Commit the entered configuration.
+    Raise an error and return the failure
+    if the commit fails.
+    default:
+       command_string = commit
+    &#34;&#34;&#34;
+
+    delay_factor = self.select_delay_factor(delay_factor)
+    error_marker = &#34;Can&#39;t commit configuration&#34;
+    command_string = &#34;commit&#34;
+
+    if self.check_config_mode():
+        self.exit_config_mode()
+
+    output = self.send_command(
+        command_string=command_string, delay_factor=delay_factor
+    )
+
+    if error_marker in output:
+        raise ValueError(
+            &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
+        )
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.config_mode"><code class="name flex">
+<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='configure', pattern=')#')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Enter configuration mode.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;)#&#34;):
+    &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
+    return super().config_mode(config_command=config_command, pattern=pattern)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Not Implemented (use commit() method)</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, *args, **kwargs):
+    &#34;&#34;&#34;Not Implemented (use commit() method)&#34;&#34;&#34;
+    raise NotImplementedError</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.session_preparation"><code class="name flex">
+<span>def <span class="ident">session_preparation</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Prepare the session after the connection has been established.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def session_preparation(self):
+    &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+    self.ansi_escape_codes = True
+    self._test_channel_read()
+    self.set_base_prompt()
+    self.disable_paging(command=&#34;terminal datadump&#34;)
+
+    # Clear the read buffer
+    time.sleep(0.3 * self.global_delay_factor)
+    self.clear_buffer()</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="netmiko.eltex" href="index.html">netmiko.eltex</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH" href="#netmiko.eltex.eltex_esr_ssh.EltexEsrSSH">EltexEsrSSH</a></code></h4>
+<ul class="">
+<li><code><a title="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.check_config_mode" href="#netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.commit" href="#netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.commit">commit</a></code></li>
+<li><code><a title="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.config_mode" href="#netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.save_config" href="#netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.session_preparation" href="#netmiko.eltex.eltex_esr_ssh.EltexEsrSSH.session_preparation">session_preparation</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/netmiko/eltex/eltex_ssh.html b/docs/netmiko/eltex/eltex_ssh.html
index 3657c7168de59200ac3c9acdf60de5bd8036c69e..57d582973eeac2c7789150fbba4687f151b2e884 100644
--- a/docs/netmiko/eltex/eltex_ssh.html
+++ b/docs/netmiko/eltex/eltex_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.eltex.eltex_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import print_function
-from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -56,7 +54,7 @@ class EltexSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.eltex.eltex_ssh.EltexSSH"><code class="flex name class">
 <span>class <span class="ident">EltexSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -176,6 +174,10 @@ class EltexSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -310,7 +312,7 @@ class EltexSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/eltex/index.html b/docs/netmiko/eltex/index.html
index 1aa293a27ecb504d6ffcf86446055c59782cefa9..6db1f552f887ce4c09688774df10e0a12610ccbc 100644
--- a/docs/netmiko/eltex/index.html
+++ b/docs/netmiko/eltex/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.eltex API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,15 +22,19 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.eltex.eltex_ssh import EltexSSH
+<pre><code class="python">from netmiko.eltex.eltex_ssh import EltexSSH
+from netmiko.eltex.eltex_esr_ssh import EltexEsrSSH
 
-__all__ = [&#34;EltexSSH&#34;]</code></pre>
+__all__ = [&#34;EltexSSH&#34;, &#34;EltexEsrSSH&#34;]</code></pre>
 </details>
 </section>
 <section>
 <h2 class="section-title" id="header-submodules">Sub-modules</h2>
 <dl>
+<dt><code class="name"><a title="netmiko.eltex.eltex_esr_ssh" href="eltex_esr_ssh.html">netmiko.eltex.eltex_esr_ssh</a></code></dt>
+<dd>
+<section class="desc"></section>
+</dd>
 <dt><code class="name"><a title="netmiko.eltex.eltex_ssh" href="eltex_ssh.html">netmiko.eltex.eltex_ssh</a></code></dt>
 <dd>
 <section class="desc"></section>
@@ -44,9 +48,385 @@ __all__ = [&#34;EltexSSH&#34;]</code></pre>
 <section>
 <h2 class="section-title" id="header-classes">Classes</h2>
 <dl>
+<dt id="netmiko.eltex.EltexEsrSSH"><code class="flex name class">
+<span>class <span class="ident">EltexEsrSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Netmiko support for routers Eltex ESR.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class EltexEsrSSH(CiscoSSHConnection):
+    &#34;&#34;&#34;Netmiko support for routers Eltex ESR.&#34;&#34;&#34;
+
+    def session_preparation(self):
+        &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        self.ansi_escape_codes = True
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;terminal datadump&#34;)
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;)#&#34;):
+        &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
+        return super().config_mode(config_command=config_command, pattern=pattern)
+
+    def check_config_mode(self, check_string=&#34;(config&#34;, pattern=&#34;&#34;):
+        &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        &#34;&#34;&#34;Not Implemented (use commit() method)&#34;&#34;&#34;
+        raise NotImplementedError
+
+    def commit(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Commit the candidate configuration.
+        Commit the entered configuration.
+        Raise an error and return the failure
+        if the commit fails.
+        default:
+           command_string = commit
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Can&#39;t commit configuration&#34;
+        command_string = &#34;commit&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output
+
+    def _confirm(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Confirm the candidate configuration.
+        Raise an error and return the failure if the confirm fails.
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Nothing to confirm in configuration&#34;
+        command_string = &#34;confirm&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Confirm failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output
+
+    def _restore(self, delay_factor=1):
+        &#34;&#34;&#34;
+        Restore the candidate configuration.
+
+        Raise an error and return the failure if the restore fails.
+        &#34;&#34;&#34;
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = &#34;Can&#39;t find backup of previous configuration!&#34;
+        command_string = &#34;restore&#34;
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                &#34;Restore failed with following errors:\n\n{}&#34;.format(output)
+            )
+        return output</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></li>
+<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.eltex.EltexEsrSSH.check_config_mode"><code class="name flex">
+<span>def <span class="ident">check_config_mode</span></span>(<span>self, check_string='(config', pattern='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Checks whether in configuration mode. Returns a boolean.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_config_mode(self, check_string=&#34;(config&#34;, pattern=&#34;&#34;):
+    &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.EltexEsrSSH.commit"><code class="name flex">
+<span>def <span class="ident">commit</span></span>(<span>self, delay_factor=1)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Commit the candidate configuration.
+Commit the entered configuration.
+Raise an error and return the failure
+if the commit fails.
+default:
+command_string = commit</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def commit(self, delay_factor=1):
+    &#34;&#34;&#34;
+    Commit the candidate configuration.
+    Commit the entered configuration.
+    Raise an error and return the failure
+    if the commit fails.
+    default:
+       command_string = commit
+    &#34;&#34;&#34;
+
+    delay_factor = self.select_delay_factor(delay_factor)
+    error_marker = &#34;Can&#39;t commit configuration&#34;
+    command_string = &#34;commit&#34;
+
+    if self.check_config_mode():
+        self.exit_config_mode()
+
+    output = self.send_command(
+        command_string=command_string, delay_factor=delay_factor
+    )
+
+    if error_marker in output:
+        raise ValueError(
+            &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
+        )
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.EltexEsrSSH.config_mode"><code class="name flex">
+<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='configure', pattern=')#')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Enter configuration mode.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;)#&#34;):
+    &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
+    return super().config_mode(config_command=config_command, pattern=pattern)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.EltexEsrSSH.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Not Implemented (use commit() method)</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, *args, **kwargs):
+    &#34;&#34;&#34;Not Implemented (use commit() method)&#34;&#34;&#34;
+    raise NotImplementedError</code></pre>
+</details>
+</dd>
+<dt id="netmiko.eltex.EltexEsrSSH.session_preparation"><code class="name flex">
+<span>def <span class="ident">session_preparation</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Prepare the session after the connection has been established.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def session_preparation(self):
+    &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+    self.ansi_escape_codes = True
+    self._test_channel_read()
+    self.set_base_prompt()
+    self.disable_paging(command=&#34;terminal datadump&#34;)
+
+    # Clear the read buffer
+    time.sleep(0.3 * self.global_delay_factor)
+    self.clear_buffer()</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.cisco_base_connection.CiscoSSHConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoSSHConnection">CiscoSSHConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoSSHConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
 <dt id="netmiko.eltex.EltexSSH"><code class="flex name class">
 <span>class <span class="ident">EltexSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -166,6 +546,10 @@ __all__ = [&#34;EltexSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -287,12 +671,23 @@ __all__ = [&#34;EltexSSH&#34;]</code></pre>
 </li>
 <li><h3><a href="#header-submodules">Sub-modules</a></h3>
 <ul>
+<li><code><a title="netmiko.eltex.eltex_esr_ssh" href="eltex_esr_ssh.html">netmiko.eltex.eltex_esr_ssh</a></code></li>
 <li><code><a title="netmiko.eltex.eltex_ssh" href="eltex_ssh.html">netmiko.eltex.eltex_ssh</a></code></li>
 </ul>
 </li>
 <li><h3><a href="#header-classes">Classes</a></h3>
 <ul>
 <li>
+<h4><code><a title="netmiko.eltex.EltexEsrSSH" href="#netmiko.eltex.EltexEsrSSH">EltexEsrSSH</a></code></h4>
+<ul class="">
+<li><code><a title="netmiko.eltex.EltexEsrSSH.check_config_mode" href="#netmiko.eltex.EltexEsrSSH.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.eltex.EltexEsrSSH.commit" href="#netmiko.eltex.EltexEsrSSH.commit">commit</a></code></li>
+<li><code><a title="netmiko.eltex.EltexEsrSSH.config_mode" href="#netmiko.eltex.EltexEsrSSH.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.eltex.EltexEsrSSH.save_config" href="#netmiko.eltex.EltexEsrSSH.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.eltex.EltexEsrSSH.session_preparation" href="#netmiko.eltex.EltexEsrSSH.session_preparation">session_preparation</a></code></li>
+</ul>
+</li>
+<li>
 <h4><code><a title="netmiko.eltex.EltexSSH" href="#netmiko.eltex.EltexSSH">EltexSSH</a></code></h4>
 <ul class="">
 <li><code><a title="netmiko.eltex.EltexSSH.save_config" href="#netmiko.eltex.EltexSSH.save_config">save_config</a></code></li>
@@ -305,7 +700,7 @@ __all__ = [&#34;EltexSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/endace/endace_ssh.html b/docs/netmiko/endace/endace_ssh.html
index 9df350e556bfe03e2dbf3d92a74d2bba8a4f1179..4cec95ca1c28359bfaf5cfa53dd90ca4f6a504af 100644
--- a/docs/netmiko/endace/endace_ssh.html
+++ b/docs/netmiko/endace/endace_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.endace.endace_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,26 +22,19 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-
-from netmiko.cisco_base_connection import CiscoSSHConnection
+<pre><code class="python">from netmiko.cisco_base_connection import CiscoSSHConnection
 import re
 
 
 class EndaceSSH(CiscoSSHConnection):
     def disable_paging(self, command=&#34;no cli session paging enable&#34;, delay_factor=1):
-        return super(EndaceSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;&#34;, re_flags=re.IGNORECASE):
-        return super(EndaceSSH, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def check_config_mode(self, check_string=&#34;(config) #&#34;):
-        return super(EndaceSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;conf t&#34;, pattern=&#34;&#34;):
         output = &#34;&#34;
@@ -58,16 +51,14 @@ class EndaceSSH(CiscoSSHConnection):
         return output
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;#&#34;):
-        return super(EndaceSSH, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def save_config(
         self, cmd=&#34;configuration write&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         self.enable()
         self.config_mode()
-        return super(EndaceSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -83,7 +74,7 @@ class EndaceSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.endace.endace_ssh.EndaceSSH"><code class="flex name class">
 <span>class <span class="ident">EndaceSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -203,22 +194,22 @@ class EndaceSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class EndaceSSH(CiscoSSHConnection):
     def disable_paging(self, command=&#34;no cli session paging enable&#34;, delay_factor=1):
-        return super(EndaceSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;&#34;, re_flags=re.IGNORECASE):
-        return super(EndaceSSH, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def check_config_mode(self, check_string=&#34;(config) #&#34;):
-        return super(EndaceSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;conf t&#34;, pattern=&#34;&#34;):
         output = &#34;&#34;
@@ -235,16 +226,14 @@ class EndaceSSH(CiscoSSHConnection):
         return output
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;#&#34;):
-        return super(EndaceSSH, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def save_config(
         self, cmd=&#34;configuration write&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         self.enable()
         self.config_mode()
-        return super(EndaceSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -327,7 +316,7 @@ class EndaceSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/endace/index.html b/docs/netmiko/endace/index.html
index 735fb9ccd5351f5e7ffe8587f19b4bcc430a8873..f97bcacd68c6cdb39b0315eae1c8159115488eb8 100644
--- a/docs/netmiko/endace/index.html
+++ b/docs/netmiko/endace/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.endace API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.endace.endace_ssh import EndaceSSH
+<pre><code class="python">from netmiko.endace.endace_ssh import EndaceSSH
 
 __all__ = [&#34;EndaceSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;EndaceSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.endace.EndaceSSH"><code class="flex name class">
 <span>class <span class="ident">EndaceSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -166,22 +165,22 @@ __all__ = [&#34;EndaceSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class EndaceSSH(CiscoSSHConnection):
     def disable_paging(self, command=&#34;no cli session paging enable&#34;, delay_factor=1):
-        return super(EndaceSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;&#34;, re_flags=re.IGNORECASE):
-        return super(EndaceSSH, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def check_config_mode(self, check_string=&#34;(config) #&#34;):
-        return super(EndaceSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;conf t&#34;, pattern=&#34;&#34;):
         output = &#34;&#34;
@@ -198,16 +197,14 @@ __all__ = [&#34;EndaceSSH&#34;]</code></pre>
         return output
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;#&#34;):
-        return super(EndaceSSH, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def save_config(
         self, cmd=&#34;configuration write&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         self.enable()
         self.config_mode()
-        return super(EndaceSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -295,7 +292,7 @@ __all__ = [&#34;EndaceSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/enterasys/enterasys_ssh.html b/docs/netmiko/enterasys/enterasys_ssh.html
index 8746d5077c30ebeed89726656e61f628a5fb7364..5a9ba7bfe5289ddbaa9a7a25083eca421016537f 100644
--- a/docs/netmiko/enterasys/enterasys_ssh.html
+++ b/docs/netmiko/enterasys/enterasys_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.enterasys.enterasys_ssh API documentation</title>
 <meta name="description" content="Enterasys support." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Enterasys support.&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -57,7 +56,7 @@ class EnterasysSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.enterasys.enterasys_ssh.EnterasysSSH"><code class="flex name class">
 <span>class <span class="ident">EnterasysSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Enterasys support.</p>
@@ -177,6 +176,10 @@ class EnterasysSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -309,7 +312,7 @@ class EnterasysSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/enterasys/index.html b/docs/netmiko/enterasys/index.html
index 9cc07f3a472453167b02f505b1dd1ef4732f25a8..1ce0ef9fff3d0ebe813eccfe68a3c8506b36f310 100644
--- a/docs/netmiko/enterasys/index.html
+++ b/docs/netmiko/enterasys/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.enterasys API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.enterasys.enterasys_ssh import EnterasysSSH
+<pre><code class="python">from netmiko.enterasys.enterasys_ssh import EnterasysSSH
 
 __all__ = [&#34;EnterasysSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;EnterasysSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.enterasys.EnterasysSSH"><code class="flex name class">
 <span>class <span class="ident">EnterasysSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Enterasys support.</p>
@@ -166,6 +165,10 @@ __all__ = [&#34;EnterasysSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -303,7 +306,7 @@ __all__ = [&#34;EnterasysSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/extreme_ers_ssh.html b/docs/netmiko/extreme/extreme_ers_ssh.html
index f42154339d3eac276cbe38054feb56880671dd2c..b7fac7009dcebbb1fae5749fbfd22fbbcb16cdd2 100644
--- a/docs/netmiko/extreme/extreme_ers_ssh.html
+++ b/docs/netmiko/extreme/extreme_ers_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme.extreme_ers_ssh API documentation</title>
 <meta name="description" content="Netmiko support for Extreme Ethernet Routing Switch." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,8 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Netmiko support for Extreme Ethernet Routing Switch.&#34;&#34;&#34;
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -65,7 +63,7 @@ class ExtremeErsSSH(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeErsSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -81,7 +79,7 @@ class ExtremeErsSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.extreme.extreme_ers_ssh.ExtremeErsSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeErsSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Netmiko support for Extreme Ethernet Routing Switch.</p>
@@ -201,6 +199,10 @@ class ExtremeErsSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -236,7 +238,7 @@ class ExtremeErsSSH(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeErsSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -257,7 +259,7 @@ class ExtremeErsSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-    return super(ExtremeErsSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -374,7 +376,7 @@ class ExtremeErsSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/extreme_exos.html b/docs/netmiko/extreme/extreme_exos.html
index f52920fc97309cc8558b67efea361cb180d4b224..0c7576eec873e7619abe5b84d1577d2e10d17425 100644
--- a/docs/netmiko/extreme/extreme_exos.html
+++ b/docs/netmiko/extreme/extreme_exos.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme.extreme_exos API documentation</title>
 <meta name="description" content="Extreme support." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Extreme support.&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -60,7 +59,7 @@ class ExtremeExosBase(CiscoSSHConnection):
             * testhost.4 #
             * testhost.5 #
         &#34;&#34;&#34;
-        cur_base_prompt = super(ExtremeExosBase, self).set_base_prompt(*args, **kwargs)
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
         # Strip off any leading * or whitespace chars; strip off trailing period and digits
         match = re.search(r&#34;[\*\s]*(.*)\.\d+&#34;, cur_base_prompt)
         if match:
@@ -77,7 +76,7 @@ class ExtremeExosBase(CiscoSSHConnection):
 
         # refresh self.base_prompt
         self.set_base_prompt()
-        return super(ExtremeExosBase, self).send_command(*args, **kwargs)
+        return super().send_command(*args, **kwargs)
 
     def config_mode(self, config_command=&#34;&#34;):
         &#34;&#34;&#34;No configuration mode on Extreme Exos.&#34;&#34;&#34;
@@ -85,7 +84,7 @@ class ExtremeExosBase(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=&#34;#&#34;):
         &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
-        return super(ExtremeExosBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def exit_config_mode(self, exit_config=&#34;&#34;):
         &#34;&#34;&#34;No configuration mode on Extreme Exos.&#34;&#34;&#34;
@@ -95,7 +94,7 @@ class ExtremeExosBase(CiscoSSHConnection):
         self, cmd=&#34;save configuration primary&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(ExtremeExosBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -108,7 +107,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ExtremeExosTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 </section>
 <section>
@@ -122,7 +121,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
 <dl>
 <dt id="netmiko.extreme.extreme_exos.ExtremeExosBase"><code class="flex name class">
 <span>class <span class="ident">ExtremeExosBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Extreme Exos support.</p>
@@ -243,6 +242,10 @@ class ExtremeExosTelnet(ExtremeExosBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -276,7 +279,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
             * testhost.4 #
             * testhost.5 #
         &#34;&#34;&#34;
-        cur_base_prompt = super(ExtremeExosBase, self).set_base_prompt(*args, **kwargs)
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
         # Strip off any leading * or whitespace chars; strip off trailing period and digits
         match = re.search(r&#34;[\*\s]*(.*)\.\d+&#34;, cur_base_prompt)
         if match:
@@ -293,7 +296,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
 
         # refresh self.base_prompt
         self.set_base_prompt()
-        return super(ExtremeExosBase, self).send_command(*args, **kwargs)
+        return super().send_command(*args, **kwargs)
 
     def config_mode(self, config_command=&#34;&#34;):
         &#34;&#34;&#34;No configuration mode on Extreme Exos.&#34;&#34;&#34;
@@ -301,7 +304,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
 
     def check_config_mode(self, check_string=&#34;#&#34;):
         &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
-        return super(ExtremeExosBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def exit_config_mode(self, exit_config=&#34;&#34;):
         &#34;&#34;&#34;No configuration mode on Extreme Exos.&#34;&#34;&#34;
@@ -311,7 +314,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
         self, cmd=&#34;save configuration primary&#34;, confirm=False, confirm_response=&#34;&#34;
     ):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(ExtremeExosBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -337,7 +340,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;#&#34;):
     &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
-    return super(ExtremeExosBase, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.extreme.extreme_exos.ExtremeExosBase.config_mode"><code class="name flex">
@@ -375,7 +378,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
     self, cmd=&#34;save configuration primary&#34;, confirm=False, confirm_response=&#34;&#34;
 ):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(ExtremeExosBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -395,7 +398,7 @@ class ExtremeExosTelnet(ExtremeExosBase):
 
     # refresh self.base_prompt
     self.set_base_prompt()
-    return super(ExtremeExosBase, self).send_command(*args, **kwargs)</code></pre>
+    return super().send_command(*args, **kwargs)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.extreme.extreme_exos.ExtremeExosBase.set_base_prompt"><code class="name flex">
@@ -430,7 +433,7 @@ prompt, eg.</p>
         * testhost.4 #
         * testhost.5 #
     &#34;&#34;&#34;
-    cur_base_prompt = super(ExtremeExosBase, self).set_base_prompt(*args, **kwargs)
+    cur_base_prompt = super().set_base_prompt(*args, **kwargs)
     # Strip off any leading * or whitespace chars; strip off trailing period and digits
     match = re.search(r&#34;[\*\s]*(.*)\.\d+&#34;, cur_base_prompt)
     if match:
@@ -485,7 +488,7 @@ prompt, eg.</p>
 </dd>
 <dt id="netmiko.extreme.extreme_exos.ExtremeExosSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeExosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Extreme Exos support.</p>
@@ -606,6 +609,10 @@ prompt, eg.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -790,6 +797,10 @@ prompt, eg.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -797,7 +808,7 @@ prompt, eg.</p>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ExtremeExosTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -893,7 +904,7 @@ prompt, eg.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/extreme_netiron.html b/docs/netmiko/extreme/extreme_netiron.html
index e45384b8c567947ff00d9a4bb981f3567a091ce7..2a473d1555be0bc97d6188cccef71de0ae20b634 100644
--- a/docs/netmiko/extreme/extreme_netiron.html
+++ b/docs/netmiko/extreme/extreme_netiron.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme.extreme_netiron API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,14 +22,13 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.cisco_base_connection import CiscoSSHConnection
+<pre><code class="python">from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
 class ExtremeNetironBase(CiscoSSHConnection):
     def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeNetironBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -42,7 +41,7 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ExtremeNetironTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 </section>
 <section>
@@ -56,7 +55,7 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
 <dl>
 <dt id="netmiko.extreme.extreme_netiron.ExtremeNetironBase"><code class="flex name class">
 <span>class <span class="ident">ExtremeNetironBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -176,13 +175,17 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class ExtremeNetironBase(CiscoSSHConnection):
     def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeNetironBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -208,7 +211,7 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-    return super(ExtremeNetironBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -263,7 +266,7 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
 </dd>
 <dt id="netmiko.extreme.extreme_netiron.ExtremeNetironSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeNetironSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -383,6 +386,10 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -566,6 +573,10 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -573,7 +584,7 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ExtremeNetironTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -664,7 +675,7 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/extreme_nos_ssh.html b/docs/netmiko/extreme/extreme_nos_ssh.html
index 16829e76634c7a47af2a09f645bd3b1efd2d39b1..ea71291623634caf3a63965f986aa41fe298d469 100644
--- a/docs/netmiko/extreme/extreme_nos_ssh.html
+++ b/docs/netmiko/extreme/extreme_nos_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme.extreme_nos_ssh API documentation</title>
 <meta name="description" content="Support for Extreme NOS/VDX." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Support for Extreme NOS/VDX.&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -53,7 +52,7 @@ class ExtremeNosSSH(CiscoSSHConnection):
         confirm_response=&#34;y&#34;,
     ):
         &#34;&#34;&#34;Save Config for Extreme VDX.&#34;&#34;&#34;
-        return super(ExtremeNosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -69,7 +68,7 @@ class ExtremeNosSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.extreme.extreme_nos_ssh.ExtremeNosSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeNosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Support for Extreme NOS/VDX.</p>
@@ -189,6 +188,10 @@ class ExtremeNosSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -216,7 +219,7 @@ class ExtremeNosSSH(CiscoSSHConnection):
         confirm_response=&#34;y&#34;,
     ):
         &#34;&#34;&#34;Save Config for Extreme VDX.&#34;&#34;&#34;
-        return super(ExtremeNosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -266,7 +269,7 @@ class ExtremeNosSSH(CiscoSSHConnection):
     confirm_response=&#34;y&#34;,
 ):
     &#34;&#34;&#34;Save Config for Extreme VDX.&#34;&#34;&#34;
-    return super(ExtremeNosSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -361,7 +364,7 @@ class ExtremeNosSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/extreme_slx_ssh.html b/docs/netmiko/extreme/extreme_slx_ssh.html
index 536399fa7240dcc41d1a9fc7b2f91c9948868804..dfa4d39bbd4feb1ff66616553bd0bdfd5e991fd6 100644
--- a/docs/netmiko/extreme/extreme_slx_ssh.html
+++ b/docs/netmiko/extreme/extreme_slx_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme.extreme_slx_ssh API documentation</title>
 <meta name="description" content="Support for Extreme SLX." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Support for Extreme SLX.&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -53,7 +52,7 @@ class ExtremeSlxSSH(CiscoSSHConnection):
         confirm_response=&#34;y&#34;,
     ):
         &#34;&#34;&#34;Save Config for Extreme SLX.&#34;&#34;&#34;
-        return super(ExtremeSlxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -69,7 +68,7 @@ class ExtremeSlxSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.extreme.extreme_slx_ssh.ExtremeSlxSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeSlxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Support for Extreme SLX.</p>
@@ -189,6 +188,10 @@ class ExtremeSlxSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -216,7 +219,7 @@ class ExtremeSlxSSH(CiscoSSHConnection):
         confirm_response=&#34;y&#34;,
     ):
         &#34;&#34;&#34;Save Config for Extreme SLX.&#34;&#34;&#34;
-        return super(ExtremeSlxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -266,7 +269,7 @@ class ExtremeSlxSSH(CiscoSSHConnection):
     confirm_response=&#34;y&#34;,
 ):
     &#34;&#34;&#34;Save Config for Extreme SLX.&#34;&#34;&#34;
-    return super(ExtremeSlxSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -361,7 +364,7 @@ class ExtremeSlxSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/extreme_vsp_ssh.html b/docs/netmiko/extreme/extreme_vsp_ssh.html
index 9bd0fa2de66f3f65d23dcca243490dc55573ab7a..e3d909b9cf64bc174707403233bb41f98ef4cdd0 100644
--- a/docs/netmiko/extreme/extreme_vsp_ssh.html
+++ b/docs/netmiko/extreme/extreme_vsp_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme.extreme_vsp_ssh API documentation</title>
 <meta name="description" content="Extreme Virtual Services Platform Support." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,8 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Extreme Virtual Services Platform Support.&#34;&#34;&#34;
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -44,7 +42,7 @@ class ExtremeVspSSH(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeVspSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -60,7 +58,7 @@ class ExtremeVspSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.extreme.extreme_vsp_ssh.ExtremeVspSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeVspSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Extreme Virtual Services Platform Support.</p>
@@ -180,6 +178,10 @@ class ExtremeVspSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -197,7 +199,7 @@ class ExtremeVspSSH(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeVspSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -218,7 +220,7 @@ class ExtremeVspSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-    return super(ExtremeVspSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -316,7 +318,7 @@ class ExtremeVspSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/extreme_wing_ssh.html b/docs/netmiko/extreme/extreme_wing_ssh.html
index 8eb83fe867d901773887eabd4928b8b6f4c4964c..9e1a36aad255f6a2c517ad2268df2ce755693bd4 100644
--- a/docs/netmiko/extreme/extreme_wing_ssh.html
+++ b/docs/netmiko/extreme/extreme_wing_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme.extreme_wing_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -51,7 +50,7 @@ class ExtremeWingSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.extreme.extreme_wing_ssh.ExtremeWingSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeWingSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Extreme WiNG support.</p>
@@ -171,6 +170,10 @@ class ExtremeWingSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -287,7 +290,7 @@ class ExtremeWingSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/extreme/index.html b/docs/netmiko/extreme/index.html
index 9a56cc881fa13654e8fb6287ef7239aa4a51b55a..c2eeeab47ba26e7f8aa1bf01c77b159fc66b3249 100644
--- a/docs/netmiko/extreme/index.html
+++ b/docs/netmiko/extreme/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.extreme API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.extreme.extreme_ers_ssh import ExtremeErsSSH
+<pre><code class="python">from netmiko.extreme.extreme_ers_ssh import ExtremeErsSSH
 from netmiko.extreme.extreme_exos import ExtremeExosSSH
 from netmiko.extreme.extreme_exos import ExtremeExosTelnet
 from netmiko.extreme.extreme_netiron import ExtremeNetironSSH
@@ -88,7 +87,7 @@ __all__ = [
 <dl>
 <dt id="netmiko.extreme.ExtremeErsSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeErsSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Netmiko support for Extreme Ethernet Routing Switch.</p>
@@ -208,6 +207,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -243,7 +246,7 @@ __all__ = [
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeErsSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -264,7 +267,7 @@ __all__ = [
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-    return super(ExtremeErsSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -354,7 +357,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.extreme.ExtremeExosSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeExosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Extreme Exos support.</p>
@@ -475,6 +478,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -659,6 +666,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -666,7 +677,7 @@ __all__ = [
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ExtremeExosTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -725,7 +736,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.extreme.ExtremeNetironSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeNetironSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -845,6 +856,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1028,6 +1043,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1035,7 +1054,7 @@ __all__ = [
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(ExtremeNetironTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -1094,7 +1113,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.extreme.ExtremeNosSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeNosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Support for Extreme NOS/VDX.</p>
@@ -1214,6 +1233,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1241,7 +1264,7 @@ __all__ = [
         confirm_response=&#34;y&#34;,
     ):
         &#34;&#34;&#34;Save Config for Extreme VDX.&#34;&#34;&#34;
-        return super(ExtremeNosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -1291,7 +1314,7 @@ __all__ = [
     confirm_response=&#34;y&#34;,
 ):
     &#34;&#34;&#34;Save Config for Extreme VDX.&#34;&#34;&#34;
-    return super(ExtremeNosSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -1357,7 +1380,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.extreme.ExtremeSlxSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeSlxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Support for Extreme SLX.</p>
@@ -1477,6 +1500,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1504,7 +1531,7 @@ __all__ = [
         confirm_response=&#34;y&#34;,
     ):
         &#34;&#34;&#34;Save Config for Extreme SLX.&#34;&#34;&#34;
-        return super(ExtremeSlxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -1554,7 +1581,7 @@ __all__ = [
     confirm_response=&#34;y&#34;,
 ):
     &#34;&#34;&#34;Save Config for Extreme SLX.&#34;&#34;&#34;
-    return super(ExtremeSlxSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -1620,7 +1647,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.extreme.ExtremeVspSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeVspSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Extreme Virtual Services Platform Support.</p>
@@ -1740,6 +1767,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1757,7 +1788,7 @@ __all__ = [
 
     def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-        return super(ExtremeVspSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -1778,7 +1809,7 @@ __all__ = [
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save Config&#34;&#34;&#34;
-    return super(ExtremeVspSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -1849,7 +1880,7 @@ __all__ = [
 </dd>
 <dt id="netmiko.extreme.ExtremeWingSSH"><code class="flex name class">
 <span>class <span class="ident">ExtremeWingSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Extreme WiNG support.</p>
@@ -1969,6 +2000,10 @@ __all__ = [
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -2140,7 +2175,7 @@ __all__ = [
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/f5/f5_linux_ssh.html b/docs/netmiko/f5/f5_linux_ssh.html
index 422c5bfa1b2f4fe92e2d96e9baac76bfae7f2d18..b477ccb4a246024c4d43b9a46ad423b5142be0fe 100644
--- a/docs/netmiko/f5/f5_linux_ssh.html
+++ b/docs/netmiko/f5/f5_linux_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.f5.f5_linux_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.linux.linux_ssh import LinuxSSH
+<pre><code class="python">from netmiko.linux.linux_ssh import LinuxSSH
 
 
 class F5LinuxSSH(LinuxSSH):
@@ -41,7 +40,7 @@ class F5LinuxSSH(LinuxSSH):
 <dl>
 <dt id="netmiko.f5.f5_linux_ssh.F5LinuxSSH"><code class="flex name class">
 <span>class <span class="ident">F5LinuxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -161,6 +160,10 @@ class F5LinuxSSH(LinuxSSH):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -247,7 +250,7 @@ class F5LinuxSSH(LinuxSSH):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/f5/f5_tmsh_ssh.html b/docs/netmiko/f5/f5_tmsh_ssh.html
index d747fe4c2f7f5478ce4fd5f1c871287e81417c04..f97e793c1d430487e9cd8c4f5b91636b1aa5b654 100644
--- a/docs/netmiko/f5/f5_tmsh_ssh.html
+++ b/docs/netmiko/f5/f5_tmsh_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.f5.f5_tmsh_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.base_connection import BaseConnection
 
 
@@ -45,7 +44,7 @@ class F5TmshSSH(BaseConnection):
         &#34;&#34;&#34;tmsh command is equivalent to config command on F5.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
-        command = &#34;{}tmsh{}&#34;.format(self.RETURN, self.RETURN)
+        command = f&#34;{self.RETURN}tmsh{self.RETURN}&#34;
         self.write_channel(command)
         time.sleep(1 * delay_factor)
         self.clear_buffer()
@@ -63,7 +62,7 @@ class F5TmshSSH(BaseConnection):
 <dl>
 <dt id="netmiko.f5.f5_tmsh_ssh.F5TmshSSH"><code class="flex name class">
 <span>class <span class="ident">F5TmshSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -184,6 +183,10 @@ class F5TmshSSH(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -205,7 +208,7 @@ class F5TmshSSH(BaseConnection):
         &#34;&#34;&#34;tmsh command is equivalent to config command on F5.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
-        command = &#34;{}tmsh{}&#34;.format(self.RETURN, self.RETURN)
+        command = f&#34;{self.RETURN}tmsh{self.RETURN}&#34;
         self.write_channel(command)
         time.sleep(1 * delay_factor)
         self.clear_buffer()
@@ -249,7 +252,7 @@ class F5TmshSSH(BaseConnection):
     &#34;&#34;&#34;tmsh command is equivalent to config command on F5.&#34;&#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor)
     self.clear_buffer()
-    command = &#34;{}tmsh{}&#34;.format(self.RETURN, self.RETURN)
+    command = f&#34;{self.RETURN}tmsh{self.RETURN}&#34;
     self.write_channel(command)
     time.sleep(1 * delay_factor)
     self.clear_buffer()
@@ -333,7 +336,7 @@ class F5TmshSSH(BaseConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/f5/index.html b/docs/netmiko/f5/index.html
index 5dcebd4dcda1c36fa7b41395f8fd117ec8298d27..7189f067f1158082d7d6f49893f16f619212e182 100644
--- a/docs/netmiko/f5/index.html
+++ b/docs/netmiko/f5/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.f5 API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.f5.f5_tmsh_ssh import F5TmshSSH
+<pre><code class="python">from netmiko.f5.f5_tmsh_ssh import F5TmshSSH
 from netmiko.f5.f5_linux_ssh import F5LinuxSSH
 
 __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
@@ -51,7 +50,7 @@ __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.f5.F5LinuxSSH"><code class="flex name class">
 <span>class <span class="ident">F5LinuxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -171,6 +170,10 @@ __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -234,7 +237,7 @@ __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
 </dd>
 <dt id="netmiko.f5.F5TmshSSH"><code class="flex name class">
 <span>class <span class="ident">F5TmshSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -355,6 +358,10 @@ __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -376,7 +383,7 @@ __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
         &#34;&#34;&#34;tmsh command is equivalent to config command on F5.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
-        command = &#34;{}tmsh{}&#34;.format(self.RETURN, self.RETURN)
+        command = f&#34;{self.RETURN}tmsh{self.RETURN}&#34;
         self.write_channel(command)
         time.sleep(1 * delay_factor)
         self.clear_buffer()
@@ -420,7 +427,7 @@ __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
     &#34;&#34;&#34;tmsh command is equivalent to config command on F5.&#34;&#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor)
     self.clear_buffer()
-    command = &#34;{}tmsh{}&#34;.format(self.RETURN, self.RETURN)
+    command = f&#34;{self.RETURN}tmsh{self.RETURN}&#34;
     self.write_channel(command)
     time.sleep(1 * delay_factor)
     self.clear_buffer()
@@ -513,7 +520,7 @@ __all__ = [&#34;F5TmshSSH&#34;, &#34;F5LinuxSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/flexvnf/flexvnf_ssh.html b/docs/netmiko/flexvnf/flexvnf_ssh.html
index 3ad80511c3c425358869ecf9f81786c0e4c4818f..3d98954c7e79355ff59f9f39b470cd44ae2f5268 100644
--- a/docs/netmiko/flexvnf/flexvnf_ssh.html
+++ b/docs/netmiko/flexvnf/flexvnf_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.flexvnf.flexvnf_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-import re
+<pre><code class="python">import re
 import time
 
 from netmiko.base_connection import BaseConnection
@@ -81,11 +79,11 @@ class FlexvnfSSH(BaseConnection):
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(FlexvnfSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(FlexvnfSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit configuration-mode&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
@@ -161,7 +159,7 @@ class FlexvnfSSH(BaseConnection):
         if comment:
             if &#39;&#34;&#39; in comment:
                 raise ValueError(&#34;Invalid comment contains double quote&#34;)
-            comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+            comment = f&#39;&#34;{comment}&#34;&#39;
             command_string += &#34; comment &#34; + comment
 
         if and_quit:
@@ -188,15 +186,13 @@ class FlexvnfSSH(BaseConnection):
             )
 
         if commit_marker not in output:
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
         return output
 
     def strip_prompt(self, *args, **kwargs):
         &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-        a_string = super(FlexvnfSSH, self).strip_prompt(*args, **kwargs)
+        a_string = super().strip_prompt(*args, **kwargs)
         return self.strip_context_items(a_string)
 
     def strip_context_items(self, a_string):
@@ -243,7 +239,7 @@ class FlexvnfSSH(BaseConnection):
 <dl>
 <dt id="netmiko.flexvnf.flexvnf_ssh.FlexvnfSSH"><code class="flex name class">
 <span>class <span class="ident">FlexvnfSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -364,6 +360,10 @@ class FlexvnfSSH(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -418,11 +418,11 @@ class FlexvnfSSH(BaseConnection):
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(FlexvnfSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(FlexvnfSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit configuration-mode&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
@@ -498,7 +498,7 @@ class FlexvnfSSH(BaseConnection):
         if comment:
             if &#39;&#34;&#39; in comment:
                 raise ValueError(&#34;Invalid comment contains double quote&#34;)
-            comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+            comment = f&#39;&#34;{comment}&#34;&#39;
             command_string += &#34; comment &#34; + comment
 
         if and_quit:
@@ -525,15 +525,13 @@ class FlexvnfSSH(BaseConnection):
             )
 
         if commit_marker not in output:
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
         return output
 
     def strip_prompt(self, *args, **kwargs):
         &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-        a_string = super(FlexvnfSSH, self).strip_prompt(*args, **kwargs)
+        a_string = super().strip_prompt(*args, **kwargs)
         return self.strip_context_items(a_string)
 
     def strip_context_items(self, a_string):
@@ -583,7 +581,7 @@ class FlexvnfSSH(BaseConnection):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;]&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(FlexvnfSSH, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.flexvnf.flexvnf_ssh.FlexvnfSSH.check_enable_mode"><code class="name flex">
@@ -678,7 +676,7 @@ command_string = commit check</p></section>
     if comment:
         if &#39;&#34;&#39; in comment:
             raise ValueError(&#34;Invalid comment contains double quote&#34;)
-        comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+        comment = f&#39;&#34;{comment}&#34;&#39;
         command_string += &#34; comment &#34; + comment
 
     if and_quit:
@@ -705,9 +703,7 @@ command_string = commit check</p></section>
         )
 
     if commit_marker not in output:
-        raise ValueError(
-            &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
     return output</code></pre>
 </details>
@@ -721,7 +717,7 @@ command_string = commit check</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(FlexvnfSSH, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.flexvnf.flexvnf_ssh.FlexvnfSSH.enable"><code class="name flex">
@@ -880,7 +876,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def strip_prompt(self, *args, **kwargs):
     &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-    a_string = super(FlexvnfSSH, self).strip_prompt(*args, **kwargs)
+    a_string = super().strip_prompt(*args, **kwargs)
     return self.strip_context_items(a_string)</code></pre>
 </details>
 </dd>
@@ -962,7 +958,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/flexvnf/index.html b/docs/netmiko/flexvnf/index.html
index 885f073258da7cc364be88518ad90ac39cafd031..b204a09b95d1c87deea40f27555444ce79cb3991 100644
--- a/docs/netmiko/flexvnf/index.html
+++ b/docs/netmiko/flexvnf/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.flexvnf API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.flexvnf.flexvnf_ssh import FlexvnfSSH
+<pre><code class="python">from netmiko.flexvnf.flexvnf_ssh import FlexvnfSSH
 
 __all__ = [&#34;FlexvnfSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;FlexvnfSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.flexvnf.FlexvnfSSH"><code class="flex name class">
 <span>class <span class="ident">FlexvnfSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -167,6 +166,10 @@ __all__ = [&#34;FlexvnfSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -221,11 +224,11 @@ __all__ = [&#34;FlexvnfSSH&#34;]</code></pre>
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(FlexvnfSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(FlexvnfSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit configuration-mode&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
@@ -301,7 +304,7 @@ __all__ = [&#34;FlexvnfSSH&#34;]</code></pre>
         if comment:
             if &#39;&#34;&#39; in comment:
                 raise ValueError(&#34;Invalid comment contains double quote&#34;)
-            comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+            comment = f&#39;&#34;{comment}&#34;&#39;
             command_string += &#34; comment &#34; + comment
 
         if and_quit:
@@ -328,15 +331,13 @@ __all__ = [&#34;FlexvnfSSH&#34;]</code></pre>
             )
 
         if commit_marker not in output:
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
         return output
 
     def strip_prompt(self, *args, **kwargs):
         &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-        a_string = super(FlexvnfSSH, self).strip_prompt(*args, **kwargs)
+        a_string = super().strip_prompt(*args, **kwargs)
         return self.strip_context_items(a_string)
 
     def strip_context_items(self, a_string):
@@ -386,7 +387,7 @@ __all__ = [&#34;FlexvnfSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;]&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(FlexvnfSSH, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.flexvnf.FlexvnfSSH.check_enable_mode"><code class="name flex">
@@ -481,7 +482,7 @@ command_string = commit check</p></section>
     if comment:
         if &#39;&#34;&#39; in comment:
             raise ValueError(&#34;Invalid comment contains double quote&#34;)
-        comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+        comment = f&#39;&#34;{comment}&#34;&#39;
         command_string += &#34; comment &#34; + comment
 
     if and_quit:
@@ -508,9 +509,7 @@ command_string = commit check</p></section>
         )
 
     if commit_marker not in output:
-        raise ValueError(
-            &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
     return output</code></pre>
 </details>
@@ -524,7 +523,7 @@ command_string = commit check</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(FlexvnfSSH, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.flexvnf.FlexvnfSSH.enable"><code class="name flex">
@@ -683,7 +682,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def strip_prompt(self, *args, **kwargs):
     &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-    a_string = super(FlexvnfSSH, self).strip_prompt(*args, **kwargs)
+    a_string = super().strip_prompt(*args, **kwargs)
     return self.strip_context_items(a_string)</code></pre>
 </details>
 </dd>
@@ -770,7 +769,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/fortinet/fortinet_ssh.html b/docs/netmiko/fortinet/fortinet_ssh.html
index 090ecaf7fe35688db3c7c6d19ccd38e67d9dc814..d88c73f2639f625d0effb5037d03bf5465ce7015 100644
--- a/docs/netmiko/fortinet/fortinet_ssh.html
+++ b/docs/netmiko/fortinet/fortinet_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.fortinet.fortinet_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import paramiko
+<pre><code class="python">import paramiko
 import time
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -41,6 +40,21 @@ class FortinetSSH(CiscoSSHConnection):
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        delay_factor = self.select_delay_factor(delay_factor=0)
+        output = &#34;&#34;
+
+        # If &#34;set post-login-banner enable&#34; is set it will require you to press &#39;a&#39;
+        # to accept the banner before you login. This will accept if it occurs
+        count = 1
+        while count &lt;= 30:
+            output += self.read_channel()
+            if &#34;to accept&#34; in output:
+                self.write_channel(&#34;a\r&#34;)
+                break
+            else:
+                time.sleep(0.33 * delay_factor)
+            count += 1
+
         self._test_channel_read()
         self.set_base_prompt(alt_prompt_terminator=&#34;$&#34;)
         self.disable_paging()
@@ -99,7 +113,7 @@ class FortinetSSH(CiscoSSHConnection):
         &#34;&#34;&#34;Re-enable paging globally.&#34;&#34;&#34;
         if self.allow_disable_global:
             # Return paging state
-            output_mode_cmd = &#34;set output {}&#34;.format(self._output_mode)
+            output_mode_cmd = f&#34;set output {self._output_mode}&#34;
             enable_paging_commands = [&#34;config system console&#34;, output_mode_cmd, &#34;end&#34;]
             if self.vdoms:
                 enable_paging_commands.insert(0, &#34;config global&#34;)
@@ -131,7 +145,7 @@ class FortinetSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.fortinet.fortinet_ssh.FortinetSSH"><code class="flex name class">
 <span>class <span class="ident">FortinetSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -251,6 +265,10 @@ class FortinetSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -266,6 +284,21 @@ class FortinetSSH(CiscoSSHConnection):
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        delay_factor = self.select_delay_factor(delay_factor=0)
+        output = &#34;&#34;
+
+        # If &#34;set post-login-banner enable&#34; is set it will require you to press &#39;a&#39;
+        # to accept the banner before you login. This will accept if it occurs
+        count = 1
+        while count &lt;= 30:
+            output += self.read_channel()
+            if &#34;to accept&#34; in output:
+                self.write_channel(&#34;a\r&#34;)
+                break
+            else:
+                time.sleep(0.33 * delay_factor)
+            count += 1
+
         self._test_channel_read()
         self.set_base_prompt(alt_prompt_terminator=&#34;$&#34;)
         self.disable_paging()
@@ -324,7 +357,7 @@ class FortinetSSH(CiscoSSHConnection):
         &#34;&#34;&#34;Re-enable paging globally.&#34;&#34;&#34;
         if self.allow_disable_global:
             # Return paging state
-            output_mode_cmd = &#34;set output {}&#34;.format(self._output_mode)
+            output_mode_cmd = f&#34;set output {self._output_mode}&#34;
             enable_paging_commands = [&#34;config system console&#34;, output_mode_cmd, &#34;end&#34;]
             if self.vdoms:
                 enable_paging_commands.insert(0, &#34;config global&#34;)
@@ -363,7 +396,7 @@ class FortinetSSH(CiscoSSHConnection):
     &#34;&#34;&#34;Re-enable paging globally.&#34;&#34;&#34;
     if self.allow_disable_global:
         # Return paging state
-        output_mode_cmd = &#34;set output {}&#34;.format(self._output_mode)
+        output_mode_cmd = f&#34;set output {self._output_mode}&#34;
         enable_paging_commands = [&#34;config system console&#34;, output_mode_cmd, &#34;end&#34;]
         if self.vdoms:
             enable_paging_commands.insert(0, &#34;config global&#34;)
@@ -462,6 +495,21 @@ class FortinetSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def session_preparation(self):
     &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+    delay_factor = self.select_delay_factor(delay_factor=0)
+    output = &#34;&#34;
+
+    # If &#34;set post-login-banner enable&#34; is set it will require you to press &#39;a&#39;
+    # to accept the banner before you login. This will accept if it occurs
+    count = 1
+    while count &lt;= 30:
+        output += self.read_channel()
+        if &#34;to accept&#34; in output:
+            self.write_channel(&#34;a\r&#34;)
+            break
+        else:
+            time.sleep(0.33 * delay_factor)
+        count += 1
+
     self._test_channel_read()
     self.set_base_prompt(alt_prompt_terminator=&#34;$&#34;)
     self.disable_paging()
@@ -546,7 +594,7 @@ class FortinetSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/fortinet/index.html b/docs/netmiko/fortinet/index.html
index fc79cabe0c66d1bf3a26212799c535890a007c37..e6b0065466a55f45f79ea95fc6b5302bf0518d80 100644
--- a/docs/netmiko/fortinet/index.html
+++ b/docs/netmiko/fortinet/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.fortinet API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.fortinet.fortinet_ssh import FortinetSSH
+<pre><code class="python">from netmiko.fortinet.fortinet_ssh import FortinetSSH
 
 __all__ = [&#34;FortinetSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;FortinetSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.fortinet.FortinetSSH"><code class="flex name class">
 <span>class <span class="ident">FortinetSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -166,6 +165,10 @@ __all__ = [&#34;FortinetSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -181,6 +184,21 @@ __all__ = [&#34;FortinetSSH&#34;]</code></pre>
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        delay_factor = self.select_delay_factor(delay_factor=0)
+        output = &#34;&#34;
+
+        # If &#34;set post-login-banner enable&#34; is set it will require you to press &#39;a&#39;
+        # to accept the banner before you login. This will accept if it occurs
+        count = 1
+        while count &lt;= 30:
+            output += self.read_channel()
+            if &#34;to accept&#34; in output:
+                self.write_channel(&#34;a\r&#34;)
+                break
+            else:
+                time.sleep(0.33 * delay_factor)
+            count += 1
+
         self._test_channel_read()
         self.set_base_prompt(alt_prompt_terminator=&#34;$&#34;)
         self.disable_paging()
@@ -239,7 +257,7 @@ __all__ = [&#34;FortinetSSH&#34;]</code></pre>
         &#34;&#34;&#34;Re-enable paging globally.&#34;&#34;&#34;
         if self.allow_disable_global:
             # Return paging state
-            output_mode_cmd = &#34;set output {}&#34;.format(self._output_mode)
+            output_mode_cmd = f&#34;set output {self._output_mode}&#34;
             enable_paging_commands = [&#34;config system console&#34;, output_mode_cmd, &#34;end&#34;]
             if self.vdoms:
                 enable_paging_commands.insert(0, &#34;config global&#34;)
@@ -278,7 +296,7 @@ __all__ = [&#34;FortinetSSH&#34;]</code></pre>
     &#34;&#34;&#34;Re-enable paging globally.&#34;&#34;&#34;
     if self.allow_disable_global:
         # Return paging state
-        output_mode_cmd = &#34;set output {}&#34;.format(self._output_mode)
+        output_mode_cmd = f&#34;set output {self._output_mode}&#34;
         enable_paging_commands = [&#34;config system console&#34;, output_mode_cmd, &#34;end&#34;]
         if self.vdoms:
             enable_paging_commands.insert(0, &#34;config global&#34;)
@@ -377,6 +395,21 @@ __all__ = [&#34;FortinetSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def session_preparation(self):
     &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+    delay_factor = self.select_delay_factor(delay_factor=0)
+    output = &#34;&#34;
+
+    # If &#34;set post-login-banner enable&#34; is set it will require you to press &#39;a&#39;
+    # to accept the banner before you login. This will accept if it occurs
+    count = 1
+    while count &lt;= 30:
+        output += self.read_channel()
+        if &#34;to accept&#34; in output:
+            self.write_channel(&#34;a\r&#34;)
+            break
+        else:
+            time.sleep(0.33 * delay_factor)
+        count += 1
+
     self._test_channel_read()
     self.set_base_prompt(alt_prompt_terminator=&#34;$&#34;)
     self.disable_paging()
@@ -466,7 +499,7 @@ __all__ = [&#34;FortinetSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/hp/hp_comware.html b/docs/netmiko/hp/hp_comware.html
index 39acd068dcbff4e3a528a2531af4dab05af9f1f4..87f290af37ec38ed85bcbe581d97d8a9f75a95ae 100644
--- a/docs/netmiko/hp/hp_comware.html
+++ b/docs/netmiko/hp/hp_comware.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.hp.hp_comware API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import print_function
-from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -55,17 +53,15 @@ class HPComwareBase(CiscoSSHConnection):
 
     def config_mode(self, config_command=&#34;system-view&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(HPComwareBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;return&#34;, pattern=r&#34;&gt;&#34;):
         &#34;&#34;&#34;Exit config mode.&#34;&#34;&#34;
-        return super(HPComwareBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Check whether device is in configuration mode. Return a boolean.&#34;&#34;&#34;
-        return super(HPComwareBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def set_base_prompt(
         self, pri_prompt_terminator=&#34;&gt;&#34;, alt_prompt_terminator=&#34;]&#34;, delay_factor=1
@@ -80,7 +76,7 @@ class HPComwareBase(CiscoSSHConnection):
 
         This will be set on logging in, but not when entering system-view
         &#34;&#34;&#34;
-        prompt = super(HPComwareBase, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -106,7 +102,7 @@ class HPComwareBase(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;save force&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
-        return super(HPComwareBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -119,7 +115,7 @@ class HPComwareTelnet(HPComwareBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(HPComwareTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 </section>
 <section>
@@ -133,7 +129,7 @@ class HPComwareTelnet(HPComwareBase):
 <dl>
 <dt id="netmiko.hp.hp_comware.HPComwareBase"><code class="flex name class">
 <span>class <span class="ident">HPComwareBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -253,6 +249,10 @@ class HPComwareTelnet(HPComwareBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -283,17 +283,15 @@ class HPComwareTelnet(HPComwareBase):
 
     def config_mode(self, config_command=&#34;system-view&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(HPComwareBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;return&#34;, pattern=r&#34;&gt;&#34;):
         &#34;&#34;&#34;Exit config mode.&#34;&#34;&#34;
-        return super(HPComwareBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Check whether device is in configuration mode. Return a boolean.&#34;&#34;&#34;
-        return super(HPComwareBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def set_base_prompt(
         self, pri_prompt_terminator=&#34;&gt;&#34;, alt_prompt_terminator=&#34;]&#34;, delay_factor=1
@@ -308,7 +306,7 @@ class HPComwareTelnet(HPComwareBase):
 
         This will be set on logging in, but not when entering system-view
         &#34;&#34;&#34;
-        prompt = super(HPComwareBase, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -334,7 +332,7 @@ class HPComwareTelnet(HPComwareBase):
 
     def save_config(self, cmd=&#34;save force&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
-        return super(HPComwareBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -360,7 +358,7 @@ class HPComwareTelnet(HPComwareBase):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;]&#34;):
     &#34;&#34;&#34;Check whether device is in configuration mode. Return a boolean.&#34;&#34;&#34;
-    return super(HPComwareBase, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.hp.hp_comware.HPComwareBase.check_enable_mode"><code class="name flex">
@@ -384,7 +382,7 @@ class HPComwareTelnet(HPComwareBase):
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;system-view&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(HPComwareBase, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.hp.hp_comware.HPComwareBase.enable"><code class="name flex">
@@ -408,9 +406,7 @@ class HPComwareTelnet(HPComwareBase):
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;return&#34;, pattern=r&#34;&gt;&#34;):
     &#34;&#34;&#34;Exit config mode.&#34;&#34;&#34;
-    return super(HPComwareBase, self).exit_config_mode(
-        exit_config=exit_config, pattern=pattern
-    )</code></pre>
+    return super().exit_config_mode(exit_config=exit_config, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.hp.hp_comware.HPComwareBase.exit_enable_mode"><code class="name flex">
@@ -434,7 +430,7 @@ class HPComwareTelnet(HPComwareBase):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save force&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
-    return super(HPComwareBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -496,7 +492,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 
     This will be set on logging in, but not when entering system-view
     &#34;&#34;&#34;
-    prompt = super(HPComwareBase, self).set_base_prompt(
+    prompt = super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -551,7 +547,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 </dd>
 <dt id="netmiko.hp.hp_comware.HPComwareSSH"><code class="flex name class">
 <span>class <span class="ident">HPComwareSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -671,6 +667,10 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -854,6 +854,10 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -861,7 +865,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(HPComwareTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -960,7 +964,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/hp/hp_procurve.html b/docs/netmiko/hp/hp_procurve.html
index 946af9f91b9843932e20256ba82d31ff174ed831..6b0714e5027963163d3b508b56c6e8afd045919e 100644
--- a/docs/netmiko/hp/hp_procurve.html
+++ b/docs/netmiko/hp/hp_procurve.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.hp.hp_procurve API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import print_function
-from __future__ import unicode_literals
-import re
+<pre><code class="python">import re
 import time
 import socket
 from os import path
@@ -66,19 +64,39 @@ class HPProcurveBase(CiscoSSHConnection):
         default_username=&#34;manager&#34;,
     ):
         &#34;&#34;&#34;Enter enable mode&#34;&#34;&#34;
+        delay_factor = self.select_delay_factor(delay_factor=0)
         if self.check_enable_mode():
             return &#34;&#34;
-        output = self.send_command_timing(cmd)
-        if (
-            &#34;username&#34; in output.lower()
-            or &#34;login name&#34; in output.lower()
-            or &#34;user name&#34; in output.lower()
-        ):
-            output += self.send_command_timing(default_username)
-        if &#34;password&#34; in output.lower():
-            output += self.send_command_timing(self.secret)
-        log.debug(&#34;{}&#34;.format(output))
+
+        output = &#34;&#34;
+        i = 1
+        max_attempts = 5
+        while i &lt;= max_attempts:
+            self.write_channel(cmd + self.RETURN)
+            time.sleep(0.3 * delay_factor)
+            new_output = self.read_channel()
+            username_pattern = r&#34;(username|login|user name)&#34;
+            if re.search(username_pattern, new_output, flags=re_flags):
+                output += new_output
+                new_output = self.send_command_timing(default_username)
+            if re.search(pattern, new_output, flags=re_flags):
+                output += new_output
+                self.write_channel(self.normalize_cmd(self.secret))
+                new_output = self._read_channel_timing()
+                if self.check_enable_mode():
+                    output += new_output
+                    return output
+            output += new_output
+            i += 1
+
+        log.debug(f&#34;{output}&#34;)
         self.clear_buffer()
+        msg = (
+            &#34;Failed to enter enable mode. Please ensure you pass &#34;
+            &#34;the &#39;secret&#39; argument to ConnectHandler.&#34;
+        )
+        if not self.check_enable_mode():
+            raise ValueError(msg)
         return output
 
     def cleanup(self):
@@ -105,7 +123,7 @@ class HPProcurveBase(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
-        return super(HPProcurveBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -131,7 +149,7 @@ class HPProcurveSSH(HPProcurveBase):
         # Try one last time to past &#34;Press any key to continue
         self.write_channel(self.RETURN)
 
-        super(HPProcurveSSH, self).session_preparation()
+        super().session_preparation()
 
     def _build_ssh_client(self):
         &#34;&#34;&#34;Allow passwordless authentication for HP devices being provisioned.&#34;&#34;&#34;
@@ -164,7 +182,7 @@ class HPProcurveTelnet(HPProcurveBase):
         max_loops=60,
     ):
         &#34;&#34;&#34;Telnet login: can be username/password or just password.&#34;&#34;&#34;
-        super(HPProcurveTelnet, self).telnet_login(
+        super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
@@ -185,7 +203,7 @@ class HPProcurveTelnet(HPProcurveBase):
 <dl>
 <dt id="netmiko.hp.hp_procurve.HPProcurveBase"><code class="flex name class">
 <span>class <span class="ident">HPProcurveBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -305,6 +323,10 @@ class HPProcurveTelnet(HPProcurveBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -333,19 +355,39 @@ class HPProcurveTelnet(HPProcurveBase):
         default_username=&#34;manager&#34;,
     ):
         &#34;&#34;&#34;Enter enable mode&#34;&#34;&#34;
+        delay_factor = self.select_delay_factor(delay_factor=0)
         if self.check_enable_mode():
             return &#34;&#34;
-        output = self.send_command_timing(cmd)
-        if (
-            &#34;username&#34; in output.lower()
-            or &#34;login name&#34; in output.lower()
-            or &#34;user name&#34; in output.lower()
-        ):
-            output += self.send_command_timing(default_username)
-        if &#34;password&#34; in output.lower():
-            output += self.send_command_timing(self.secret)
-        log.debug(&#34;{}&#34;.format(output))
+
+        output = &#34;&#34;
+        i = 1
+        max_attempts = 5
+        while i &lt;= max_attempts:
+            self.write_channel(cmd + self.RETURN)
+            time.sleep(0.3 * delay_factor)
+            new_output = self.read_channel()
+            username_pattern = r&#34;(username|login|user name)&#34;
+            if re.search(username_pattern, new_output, flags=re_flags):
+                output += new_output
+                new_output = self.send_command_timing(default_username)
+            if re.search(pattern, new_output, flags=re_flags):
+                output += new_output
+                self.write_channel(self.normalize_cmd(self.secret))
+                new_output = self._read_channel_timing()
+                if self.check_enable_mode():
+                    output += new_output
+                    return output
+            output += new_output
+            i += 1
+
+        log.debug(f&#34;{output}&#34;)
         self.clear_buffer()
+        msg = (
+            &#34;Failed to enter enable mode. Please ensure you pass &#34;
+            &#34;the &#39;secret&#39; argument to ConnectHandler.&#34;
+        )
+        if not self.check_enable_mode():
+            raise ValueError(msg)
         return output
 
     def cleanup(self):
@@ -372,7 +414,7 @@ class HPProcurveTelnet(HPProcurveBase):
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
-        return super(HPProcurveBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -404,19 +446,39 @@ class HPProcurveTelnet(HPProcurveBase):
     default_username=&#34;manager&#34;,
 ):
     &#34;&#34;&#34;Enter enable mode&#34;&#34;&#34;
+    delay_factor = self.select_delay_factor(delay_factor=0)
     if self.check_enable_mode():
         return &#34;&#34;
-    output = self.send_command_timing(cmd)
-    if (
-        &#34;username&#34; in output.lower()
-        or &#34;login name&#34; in output.lower()
-        or &#34;user name&#34; in output.lower()
-    ):
-        output += self.send_command_timing(default_username)
-    if &#34;password&#34; in output.lower():
-        output += self.send_command_timing(self.secret)
-    log.debug(&#34;{}&#34;.format(output))
+
+    output = &#34;&#34;
+    i = 1
+    max_attempts = 5
+    while i &lt;= max_attempts:
+        self.write_channel(cmd + self.RETURN)
+        time.sleep(0.3 * delay_factor)
+        new_output = self.read_channel()
+        username_pattern = r&#34;(username|login|user name)&#34;
+        if re.search(username_pattern, new_output, flags=re_flags):
+            output += new_output
+            new_output = self.send_command_timing(default_username)
+        if re.search(pattern, new_output, flags=re_flags):
+            output += new_output
+            self.write_channel(self.normalize_cmd(self.secret))
+            new_output = self._read_channel_timing()
+            if self.check_enable_mode():
+                output += new_output
+                return output
+        output += new_output
+        i += 1
+
+    log.debug(f&#34;{output}&#34;)
     self.clear_buffer()
+    msg = (
+        &#34;Failed to enter enable mode. Please ensure you pass &#34;
+        &#34;the &#39;secret&#39; argument to ConnectHandler.&#34;
+    )
+    if not self.check_enable_mode():
+        raise ValueError(msg)
     return output</code></pre>
 </details>
 </dd>
@@ -429,7 +491,7 @@ class HPProcurveTelnet(HPProcurveBase):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
-    return super(HPProcurveBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -506,7 +568,7 @@ class HPProcurveTelnet(HPProcurveBase):
 </dd>
 <dt id="netmiko.hp.hp_procurve.HPProcurveSSH"><code class="flex name class">
 <span>class <span class="ident">HPProcurveSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -626,6 +688,10 @@ class HPProcurveTelnet(HPProcurveBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -650,7 +716,7 @@ class HPProcurveTelnet(HPProcurveBase):
         # Try one last time to past &#34;Press any key to continue
         self.write_channel(self.RETURN)
 
-        super(HPProcurveSSH, self).session_preparation()
+        super().session_preparation()
 
     def _build_ssh_client(self):
         &#34;&#34;&#34;Allow passwordless authentication for HP devices being provisioned.&#34;&#34;&#34;
@@ -728,7 +794,7 @@ class HPProcurveTelnet(HPProcurveBase):
 </dd>
 <dt id="netmiko.hp.hp_procurve.HPProcurveTelnet"><code class="flex name class">
 <span>class <span class="ident">HPProcurveTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -848,6 +914,10 @@ class HPProcurveTelnet(HPProcurveBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -862,7 +932,7 @@ class HPProcurveTelnet(HPProcurveBase):
         max_loops=60,
     ):
         &#34;&#34;&#34;Telnet login: can be username/password or just password.&#34;&#34;&#34;
-        super(HPProcurveTelnet, self).telnet_login(
+        super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
@@ -897,7 +967,7 @@ class HPProcurveTelnet(HPProcurveBase):
     max_loops=60,
 ):
     &#34;&#34;&#34;Telnet login: can be username/password or just password.&#34;&#34;&#34;
-    super(HPProcurveTelnet, self).telnet_login(
+    super().telnet_login(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         username_pattern=username_pattern,
@@ -1018,7 +1088,7 @@ class HPProcurveTelnet(HPProcurveBase):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/hp/index.html b/docs/netmiko/hp/index.html
index d0f2c385ae36eefd1170b7967194fdffcd339f37..dce1f864a3d76d47ae364c2beb6f091b48d7cb3f 100644
--- a/docs/netmiko/hp/index.html
+++ b/docs/netmiko/hp/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.hp API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.hp.hp_procurve import HPProcurveSSH, HPProcurveTelnet
+<pre><code class="python">from netmiko.hp.hp_procurve import HPProcurveSSH, HPProcurveTelnet
 from netmiko.hp.hp_comware import HPComwareSSH, HPComwareTelnet
 
 __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSSH&#34;, &#34;HPComwareTelnet&#34;]</code></pre>
@@ -51,7 +50,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
 <dl>
 <dt id="netmiko.hp.HPComwareSSH"><code class="flex name class">
 <span>class <span class="ident">HPComwareSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -171,6 +170,10 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -354,6 +357,10 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -361,7 +368,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(HPComwareTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -420,7 +427,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
 </dd>
 <dt id="netmiko.hp.HPProcurveSSH"><code class="flex name class">
 <span>class <span class="ident">HPProcurveSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -540,6 +547,10 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -564,7 +575,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
         # Try one last time to past &#34;Press any key to continue
         self.write_channel(self.RETURN)
 
-        super(HPProcurveSSH, self).session_preparation()
+        super().session_preparation()
 
     def _build_ssh_client(self):
         &#34;&#34;&#34;Allow passwordless authentication for HP devices being provisioned.&#34;&#34;&#34;
@@ -642,7 +653,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
 </dd>
 <dt id="netmiko.hp.HPProcurveTelnet"><code class="flex name class">
 <span>class <span class="ident">HPProcurveTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -762,6 +773,10 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -776,7 +791,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
         max_loops=60,
     ):
         &#34;&#34;&#34;Telnet login: can be username/password or just password.&#34;&#34;&#34;
-        super(HPProcurveTelnet, self).telnet_login(
+        super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
@@ -811,7 +826,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
     max_loops=60,
 ):
     &#34;&#34;&#34;Telnet login: can be username/password or just password.&#34;&#34;&#34;
-    super(HPProcurveTelnet, self).telnet_login(
+    super().telnet_login(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         username_pattern=username_pattern,
@@ -912,7 +927,7 @@ __all__ = [&#34;HPProcurveSSH&#34;, &#34;HPProcurveTelnet&#34;, &#34;HPComwareSS
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/huawei/huawei.html b/docs/netmiko/huawei/huawei.html
index 60ee74db94d9b3a5046a718f06daa9bce57d5618..76b7018036c7d955fdd0afd95d62ba3cb57dc905 100644
--- a/docs/netmiko/huawei/huawei.html
+++ b/docs/netmiko/huawei/huawei.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.huawei.huawei API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,12 +22,10 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import print_function
-from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 import re
 from netmiko.cisco_base_connection import CiscoBaseConnection
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 from netmiko import log
 
 
@@ -43,17 +41,15 @@ class HuaweiBase(CiscoBaseConnection):
 
     def config_mode(self, config_command=&#34;system-view&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(HuaweiBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;return&#34;, pattern=r&#34;&gt;&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-        return super(HuaweiBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
-        return super(HuaweiBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def check_enable_mode(self, *args, **kwargs):
         &#34;&#34;&#34;Huawei has no enable mode.&#34;&#34;&#34;
@@ -95,7 +91,7 @@ class HuaweiBase(CiscoBaseConnection):
 
         # Check that ends with a valid terminator character
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {0}&#34;.format(prompt))
+            raise ValueError(f&#34;Router prompt not found: {prompt}&#34;)
 
         # Strip off any leading HRP_. characters for USGv5 HA
         prompt = re.sub(r&#34;^HRP_.&#34;, &#34;&#34;, prompt, flags=re.M)
@@ -104,13 +100,13 @@ class HuaweiBase(CiscoBaseConnection):
         prompt = prompt[1:-1]
         prompt = prompt.strip()
         self.base_prompt = prompt
-        log.debug(&#34;prompt: {0}&#34;.format(self.base_prompt))
+        log.debug(f&#34;prompt: {self.base_prompt}&#34;)
 
         return self.base_prompt
 
-    def save_config(self, cmd=&#34;save&#34;, confirm=False, confirm_response=&#34;&#34;):
+    def save_config(self, cmd=&#34;save&#34;, confirm=True, confirm_response=&#34;y&#34;):
         &#34;&#34;&#34; Save Config for HuaweiSSH&#34;&#34;&#34;
-        return super(HuaweiBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -118,7 +114,15 @@ class HuaweiBase(CiscoBaseConnection):
 class HuaweiSSH(HuaweiBase):
     &#34;&#34;&#34;Huawei SSH driver.&#34;&#34;&#34;
 
-    pass
+    def special_login_handler(self):
+        &#34;&#34;&#34;Handle password change request by ignoring it&#34;&#34;&#34;
+
+        password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
+        output = self.read_until_prompt_or_pattern(password_change_prompt)
+        if re.search(password_change_prompt, output):
+            self.write_channel(&#34;N\n&#34;)
+            self.clear_buffer()
+        return output
 
 
 class HuaweiTelnet(HuaweiBase):
@@ -136,7 +140,7 @@ class HuaweiTelnet(HuaweiBase):
         &#34;&#34;&#34;Telnet login for Huawei Devices&#34;&#34;&#34;
 
         delay_factor = self.select_delay_factor(delay_factor)
-        password_change_prompt = re.escape(&#34;Change now? [Y/N]&#34;)
+        password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
         combined_pattern = r&#34;({}|{}|{})&#34;.format(
             pri_prompt_terminator, alt_prompt_terminator, password_change_prompt
         )
@@ -185,8 +189,8 @@ class HuaweiTelnet(HuaweiBase):
 
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -199,8 +203,8 @@ class HuaweiTelnet(HuaweiBase):
             return return_msg
 
         self.remote_conn.close()
-        msg = &#34;Login failed: {}&#34;.format(self.host)
-        raise NetMikoAuthenticationException(msg)
+        msg = f&#34;Login failed: {self.host}&#34;
+        raise NetmikoAuthenticationException(msg)
 
 
 class HuaweiVrpv8SSH(HuaweiSSH):
@@ -222,7 +226,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
         command_string = &#34;commit&#34;
 
         if comment:
-            command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+            command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -235,9 +239,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
         output += self.exit_config_mode()
 
         if error_marker in output:
-            raise ValueError(
-                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
         return output
 
     def save_config(self, *args, **kwargs):
@@ -256,7 +258,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
 <dl>
 <dt id="netmiko.huawei.huawei.HuaweiBase"><code class="flex name class">
 <span>class <span class="ident">HuaweiBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -376,6 +378,10 @@ class HuaweiVrpv8SSH(HuaweiSSH):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -391,17 +397,15 @@ class HuaweiVrpv8SSH(HuaweiSSH):
 
     def config_mode(self, config_command=&#34;system-view&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(HuaweiBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;return&#34;, pattern=r&#34;&gt;&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-        return super(HuaweiBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
-        return super(HuaweiBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def check_enable_mode(self, *args, **kwargs):
         &#34;&#34;&#34;Huawei has no enable mode.&#34;&#34;&#34;
@@ -443,7 +447,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
 
         # Check that ends with a valid terminator character
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {0}&#34;.format(prompt))
+            raise ValueError(f&#34;Router prompt not found: {prompt}&#34;)
 
         # Strip off any leading HRP_. characters for USGv5 HA
         prompt = re.sub(r&#34;^HRP_.&#34;, &#34;&#34;, prompt, flags=re.M)
@@ -452,13 +456,13 @@ class HuaweiVrpv8SSH(HuaweiSSH):
         prompt = prompt[1:-1]
         prompt = prompt.strip()
         self.base_prompt = prompt
-        log.debug(&#34;prompt: {0}&#34;.format(self.base_prompt))
+        log.debug(f&#34;prompt: {self.base_prompt}&#34;)
 
         return self.base_prompt
 
-    def save_config(self, cmd=&#34;save&#34;, confirm=False, confirm_response=&#34;&#34;):
+    def save_config(self, cmd=&#34;save&#34;, confirm=True, confirm_response=&#34;y&#34;):
         &#34;&#34;&#34; Save Config for HuaweiSSH&#34;&#34;&#34;
-        return super(HuaweiBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -483,7 +487,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;]&#34;):
     &#34;&#34;&#34;Checks whether in configuration mode. Returns a boolean.&#34;&#34;&#34;
-    return super(HuaweiBase, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.huawei.huawei.HuaweiBase.check_enable_mode"><code class="name flex">
@@ -507,7 +511,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;system-view&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(HuaweiBase, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.huawei.huawei.HuaweiBase.enable"><code class="name flex">
@@ -531,9 +535,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;return&#34;, pattern=r&#34;&gt;&#34;):
     &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-    return super(HuaweiBase, self).exit_config_mode(
-        exit_config=exit_config, pattern=pattern
-    )</code></pre>
+    return super().exit_config_mode(exit_config=exit_config, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.huawei.huawei.HuaweiBase.exit_enable_mode"><code class="name flex">
@@ -549,15 +551,15 @@ class HuaweiVrpv8SSH(HuaweiSSH):
 </details>
 </dd>
 <dt id="netmiko.huawei.huawei.HuaweiBase.save_config"><code class="name flex">
-<span>def <span class="ident">save_config</span></span>(<span>self, cmd='save', confirm=False, confirm_response='')</span>
+<span>def <span class="ident">save_config</span></span>(<span>self, cmd='save', confirm=True, confirm_response='y')</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Save Config for HuaweiSSH</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def save_config(self, cmd=&#34;save&#34;, confirm=False, confirm_response=&#34;&#34;):
+<pre><code class="python">def save_config(self, cmd=&#34;save&#34;, confirm=True, confirm_response=&#34;y&#34;):
     &#34;&#34;&#34; Save Config for HuaweiSSH&#34;&#34;&#34;
-    return super(HuaweiBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -618,7 +620,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 
     # Check that ends with a valid terminator character
     if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-        raise ValueError(&#34;Router prompt not found: {0}&#34;.format(prompt))
+        raise ValueError(f&#34;Router prompt not found: {prompt}&#34;)
 
     # Strip off any leading HRP_. characters for USGv5 HA
     prompt = re.sub(r&#34;^HRP_.&#34;, &#34;&#34;, prompt, flags=re.M)
@@ -627,7 +629,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     prompt = prompt[1:-1]
     prompt = prompt.strip()
     self.base_prompt = prompt
-    log.debug(&#34;prompt: {0}&#34;.format(self.base_prompt))
+    log.debug(f&#34;prompt: {self.base_prompt}&#34;)
 
     return self.base_prompt</code></pre>
 </details>
@@ -674,7 +676,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 </dd>
 <dt id="netmiko.huawei.huawei.HuaweiSSH"><code class="flex name class">
 <span>class <span class="ident">HuaweiSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Huawei SSH driver.</p>
@@ -794,13 +796,25 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class HuaweiSSH(HuaweiBase):
     &#34;&#34;&#34;Huawei SSH driver.&#34;&#34;&#34;
 
-    pass</code></pre>
+    def special_login_handler(self):
+        &#34;&#34;&#34;Handle password change request by ignoring it&#34;&#34;&#34;
+
+        password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
+        output = self.read_until_prompt_or_pattern(password_change_prompt)
+        if re.search(password_change_prompt, output):
+            self.write_channel(&#34;N\n&#34;)
+            self.clear_buffer()
+        return output</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -812,6 +826,27 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 <ul class="hlist">
 <li><a title="netmiko.huawei.huawei.HuaweiVrpv8SSH" href="#netmiko.huawei.huawei.HuaweiVrpv8SSH">HuaweiVrpv8SSH</a></li>
 </ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.huawei.huawei.HuaweiSSH.special_login_handler"><code class="name flex">
+<span>def <span class="ident">special_login_handler</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Handle password change request by ignoring it</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def special_login_handler(self):
+    &#34;&#34;&#34;Handle password change request by ignoring it&#34;&#34;&#34;
+
+    password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
+    output = self.read_until_prompt_or_pattern(password_change_prompt)
+    if re.search(password_change_prompt, output):
+        self.write_channel(&#34;N\n&#34;)
+        self.clear_buffer()
+    return output</code></pre>
+</details>
+</dd>
+</dl>
 <h3>Inherited members</h3>
 <ul class="hlist">
 <li><code><b><a title="netmiko.huawei.huawei.HuaweiBase" href="#netmiko.huawei.huawei.HuaweiBase">HuaweiBase</a></b></code>:
@@ -849,7 +884,6 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.session_preparation" href="#netmiko.huawei.huawei.HuaweiBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.set_base_prompt" href="#netmiko.huawei.huawei.HuaweiBase.set_base_prompt">set_base_prompt</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
-<li><code><a title="netmiko.huawei.huawei.HuaweiBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
@@ -862,7 +896,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 </dd>
 <dt id="netmiko.huawei.huawei.HuaweiTelnet"><code class="flex name class">
 <span>class <span class="ident">HuaweiTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Huawei Telnet driver.</p>
@@ -982,6 +1016,10 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1000,7 +1038,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
         &#34;&#34;&#34;Telnet login for Huawei Devices&#34;&#34;&#34;
 
         delay_factor = self.select_delay_factor(delay_factor)
-        password_change_prompt = re.escape(&#34;Change now? [Y/N]&#34;)
+        password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
         combined_pattern = r&#34;({}|{}|{})&#34;.format(
             pri_prompt_terminator, alt_prompt_terminator, password_change_prompt
         )
@@ -1049,8 +1087,8 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -1063,8 +1101,8 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
             return return_msg
 
         self.remote_conn.close()
-        msg = &#34;Login failed: {}&#34;.format(self.host)
-        raise NetMikoAuthenticationException(msg)</code></pre>
+        msg = f&#34;Login failed: {self.host}&#34;
+        raise NetmikoAuthenticationException(msg)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -1093,7 +1131,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     &#34;&#34;&#34;Telnet login for Huawei Devices&#34;&#34;&#34;
 
     delay_factor = self.select_delay_factor(delay_factor)
-    password_change_prompt = re.escape(&#34;Change now? [Y/N]&#34;)
+    password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
     combined_pattern = r&#34;({}|{}|{})&#34;.format(
         pri_prompt_terminator, alt_prompt_terminator, password_change_prompt
     )
@@ -1142,8 +1180,8 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 
         except EOFError:
             self.remote_conn.close()
-            msg = &#34;Login failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Login failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
     # Last try to see if we already logged in
     self.write_channel(self.TELNET_RETURN)
@@ -1156,8 +1194,8 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
         return return_msg
 
     self.remote_conn.close()
-    msg = &#34;Login failed: {}&#34;.format(self.host)
-    raise NetMikoAuthenticationException(msg)</code></pre>
+    msg = f&#34;Login failed: {self.host}&#34;
+    raise NetmikoAuthenticationException(msg)</code></pre>
 </details>
 </dd>
 </dl>
@@ -1210,7 +1248,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
 </dd>
 <dt id="netmiko.huawei.huawei.HuaweiVrpv8SSH"><code class="flex name class">
 <span>class <span class="ident">HuaweiVrpv8SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Huawei SSH driver.</p>
@@ -1330,6 +1368,10 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1352,7 +1394,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
         command_string = &#34;commit&#34;
 
         if comment:
-            command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+            command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -1365,9 +1407,7 @@ this will be the router prompt with &lt; &gt; or [ ] stripped off.</p>
         output += self.exit_config_mode()
 
         if error_marker in output:
-            raise ValueError(
-                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
         return output
 
     def save_config(self, *args, **kwargs):
@@ -1414,7 +1454,7 @@ command_string = commit comment <comment></p></section>
     command_string = &#34;commit&#34;
 
     if comment:
-        command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+        command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
     output = self.config_mode()
     output += self.send_command_expect(
@@ -1427,9 +1467,7 @@ command_string = commit comment <comment></p></section>
     output += self.exit_config_mode()
 
     if error_marker in output:
-        raise ValueError(
-            &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -1481,7 +1519,7 @@ command_string = commit comment <comment></p></section>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.session_preparation" href="#netmiko.huawei.huawei.HuaweiBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.set_base_prompt" href="#netmiko.huawei.huawei.HuaweiBase.set_base_prompt">set_base_prompt</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
-<li><code><a title="netmiko.huawei.huawei.HuaweiSSH.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.huawei.huawei.HuaweiSSH.special_login_handler" href="#netmiko.huawei.huawei.HuaweiSSH.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
@@ -1524,6 +1562,9 @@ command_string = commit comment <comment></p></section>
 </li>
 <li>
 <h4><code><a title="netmiko.huawei.huawei.HuaweiSSH" href="#netmiko.huawei.huawei.HuaweiSSH">HuaweiSSH</a></code></h4>
+<ul class="">
+<li><code><a title="netmiko.huawei.huawei.HuaweiSSH.special_login_handler" href="#netmiko.huawei.huawei.HuaweiSSH.special_login_handler">special_login_handler</a></code></li>
+</ul>
 </li>
 <li>
 <h4><code><a title="netmiko.huawei.huawei.HuaweiTelnet" href="#netmiko.huawei.huawei.HuaweiTelnet">HuaweiTelnet</a></code></h4>
@@ -1544,7 +1585,7 @@ command_string = commit comment <comment></p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/huawei/index.html b/docs/netmiko/huawei/index.html
index a48a3916b1151de900ec63523fdca24e4b6271ec..0a8a20df969eec69dc707f2beaceca34b123f4c3 100644
--- a/docs/netmiko/huawei/index.html
+++ b/docs/netmiko/huawei/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.huawei API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.huawei.huawei import HuaweiSSH, HuaweiVrpv8SSH
+<pre><code class="python">from netmiko.huawei.huawei import HuaweiSSH, HuaweiVrpv8SSH
 from netmiko.huawei.huawei import HuaweiTelnet
 
 __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;]</code></pre>
@@ -47,7 +46,7 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
 <dl>
 <dt id="netmiko.huawei.HuaweiSSH"><code class="flex name class">
 <span>class <span class="ident">HuaweiSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Huawei SSH driver.</p>
@@ -167,13 +166,25 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class HuaweiSSH(HuaweiBase):
     &#34;&#34;&#34;Huawei SSH driver.&#34;&#34;&#34;
 
-    pass</code></pre>
+    def special_login_handler(self):
+        &#34;&#34;&#34;Handle password change request by ignoring it&#34;&#34;&#34;
+
+        password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
+        output = self.read_until_prompt_or_pattern(password_change_prompt)
+        if re.search(password_change_prompt, output):
+            self.write_channel(&#34;N\n&#34;)
+            self.clear_buffer()
+        return output</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -185,6 +196,27 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
 <ul class="hlist">
 <li><a title="netmiko.huawei.huawei.HuaweiVrpv8SSH" href="huawei.html#netmiko.huawei.huawei.HuaweiVrpv8SSH">HuaweiVrpv8SSH</a></li>
 </ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.huawei.HuaweiSSH.special_login_handler"><code class="name flex">
+<span>def <span class="ident">special_login_handler</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Handle password change request by ignoring it</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def special_login_handler(self):
+    &#34;&#34;&#34;Handle password change request by ignoring it&#34;&#34;&#34;
+
+    password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
+    output = self.read_until_prompt_or_pattern(password_change_prompt)
+    if re.search(password_change_prompt, output):
+        self.write_channel(&#34;N\n&#34;)
+        self.clear_buffer()
+    return output</code></pre>
+</details>
+</dd>
+</dl>
 <h3>Inherited members</h3>
 <ul class="hlist">
 <li><code><b><a title="netmiko.huawei.huawei.HuaweiBase" href="huawei.html#netmiko.huawei.huawei.HuaweiBase">HuaweiBase</a></b></code>:
@@ -222,7 +254,6 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.session_preparation" href="huawei.html#netmiko.huawei.huawei.HuaweiBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.set_base_prompt" href="huawei.html#netmiko.huawei.huawei.HuaweiBase.set_base_prompt">set_base_prompt</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
-<li><code><a title="netmiko.huawei.huawei.HuaweiBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
@@ -235,7 +266,7 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
 </dd>
 <dt id="netmiko.huawei.HuaweiTelnet"><code class="flex name class">
 <span>class <span class="ident">HuaweiTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Huawei Telnet driver.</p>
@@ -355,6 +386,10 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -373,7 +408,7 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
         &#34;&#34;&#34;Telnet login for Huawei Devices&#34;&#34;&#34;
 
         delay_factor = self.select_delay_factor(delay_factor)
-        password_change_prompt = re.escape(&#34;Change now? [Y/N]&#34;)
+        password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
         combined_pattern = r&#34;({}|{}|{})&#34;.format(
             pri_prompt_terminator, alt_prompt_terminator, password_change_prompt
         )
@@ -422,8 +457,8 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
 
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -436,8 +471,8 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
             return return_msg
 
         self.remote_conn.close()
-        msg = &#34;Login failed: {}&#34;.format(self.host)
-        raise NetMikoAuthenticationException(msg)</code></pre>
+        msg = f&#34;Login failed: {self.host}&#34;
+        raise NetmikoAuthenticationException(msg)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -466,7 +501,7 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
     &#34;&#34;&#34;Telnet login for Huawei Devices&#34;&#34;&#34;
 
     delay_factor = self.select_delay_factor(delay_factor)
-    password_change_prompt = re.escape(&#34;Change now? [Y/N]&#34;)
+    password_change_prompt = r&#34;(Change now|Please choose &#39;YES&#39; or &#39;NO&#39;).+&#34;
     combined_pattern = r&#34;({}|{}|{})&#34;.format(
         pri_prompt_terminator, alt_prompt_terminator, password_change_prompt
     )
@@ -515,8 +550,8 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
 
         except EOFError:
             self.remote_conn.close()
-            msg = &#34;Login failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Login failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
     # Last try to see if we already logged in
     self.write_channel(self.TELNET_RETURN)
@@ -529,8 +564,8 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
         return return_msg
 
     self.remote_conn.close()
-    msg = &#34;Login failed: {}&#34;.format(self.host)
-    raise NetMikoAuthenticationException(msg)</code></pre>
+    msg = f&#34;Login failed: {self.host}&#34;
+    raise NetmikoAuthenticationException(msg)</code></pre>
 </details>
 </dd>
 </dl>
@@ -583,7 +618,7 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
 </dd>
 <dt id="netmiko.huawei.HuaweiVrpv8SSH"><code class="flex name class">
 <span>class <span class="ident">HuaweiVrpv8SSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Huawei SSH driver.</p>
@@ -703,6 +738,10 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -725,7 +764,7 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
         command_string = &#34;commit&#34;
 
         if comment:
-            command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+            command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -738,9 +777,7 @@ __all__ = [&#34;HuaweiSSH&#34;, &#34;HuaweiVrpv8SSH&#34;, &#34;HuaweiTelnet&#34;
         output += self.exit_config_mode()
 
         if error_marker in output:
-            raise ValueError(
-                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
         return output
 
     def save_config(self, *args, **kwargs):
@@ -787,7 +824,7 @@ command_string = commit comment <comment></p></section>
     command_string = &#34;commit&#34;
 
     if comment:
-        command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+        command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
     output = self.config_mode()
     output += self.send_command_expect(
@@ -800,9 +837,7 @@ command_string = commit comment <comment></p></section>
     output += self.exit_config_mode()
 
     if error_marker in output:
-        raise ValueError(
-            &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -854,7 +889,7 @@ command_string = commit comment <comment></p></section>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.session_preparation" href="huawei.html#netmiko.huawei.huawei.HuaweiBase.session_preparation">session_preparation</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.set_base_prompt" href="huawei.html#netmiko.huawei.huawei.HuaweiBase.set_base_prompt">set_base_prompt</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
-<li><code><a title="netmiko.huawei.huawei.HuaweiSSH.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.huawei.huawei.HuaweiSSH.special_login_handler" href="huawei.html#netmiko.huawei.huawei.HuaweiSSH.special_login_handler">special_login_handler</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
 <li><code><a title="netmiko.huawei.huawei.HuaweiSSH.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
@@ -888,6 +923,9 @@ command_string = commit comment <comment></p></section>
 <ul>
 <li>
 <h4><code><a title="netmiko.huawei.HuaweiSSH" href="#netmiko.huawei.HuaweiSSH">HuaweiSSH</a></code></h4>
+<ul class="">
+<li><code><a title="netmiko.huawei.HuaweiSSH.special_login_handler" href="#netmiko.huawei.HuaweiSSH.special_login_handler">special_login_handler</a></code></li>
+</ul>
 </li>
 <li>
 <h4><code><a title="netmiko.huawei.HuaweiTelnet" href="#netmiko.huawei.HuaweiTelnet">HuaweiTelnet</a></code></h4>
@@ -908,7 +946,7 @@ command_string = commit comment <comment></p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/index.html b/docs/netmiko/index.html
index 58a867099bf2e1cd2a9cfb8cf908a3c08c14cab6..3011b97d7a50ee97e7e96a980821c1f6cc7e35fd 100644
--- a/docs/netmiko/index.html
+++ b/docs/netmiko/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import logging
+<pre><code class="python">import logging
 
 # Logging configuration
 log = logging.getLogger(__name__)  # noqa
@@ -36,28 +35,29 @@ from netmiko.ssh_dispatcher import platforms
 from netmiko.ssh_dispatcher import FileTransfer
 from netmiko.scp_handler import SCPConn
 from netmiko.cisco.cisco_ios import InLineTransfer
-from netmiko.ssh_exception import NetMikoTimeoutException
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoTimeoutException, NetMikoTimeoutException
+from netmiko.ssh_exception import (
+    NetmikoAuthenticationException,
+    NetMikoAuthenticationException,
+)
 from netmiko.ssh_autodetect import SSHDetect
 from netmiko.base_connection import BaseConnection
 from netmiko.scp_functions import file_transfer
 
 # Alternate naming
-NetmikoTimeoutError = NetMikoTimeoutException
-NetmikoAuthError = NetMikoAuthenticationException
 Netmiko = ConnectHandler
 
-__version__ = &#34;2.4.2&#34;
+__version__ = &#34;3.0.0&#34;
 __all__ = (
     &#34;ConnectHandler&#34;,
     &#34;ssh_dispatcher&#34;,
     &#34;platforms&#34;,
     &#34;SCPConn&#34;,
     &#34;FileTransfer&#34;,
+    &#34;NetmikoTimeoutException&#34;,
+    &#34;NetmikoAuthenticationException&#34;,
     &#34;NetMikoTimeoutException&#34;,
     &#34;NetMikoAuthenticationException&#34;,
-    &#34;NetmikoTimeoutError&#34;,
-    &#34;NetmikoAuthError&#34;,
     &#34;InLineTransfer&#34;,
     &#34;redispatch&#34;,
     &#34;SSHDetect&#34;,
@@ -209,6 +209,10 @@ CNTL_SHIFT_6 = chr(30)</code></pre>
 <dd>
 <section class="desc"></section>
 </dd>
+<dt><code class="name"><a title="netmiko.nokia" href="nokia/index.html">netmiko.nokia</a></code></dt>
+<dd>
+<section class="desc"></section>
+</dd>
 <dt><code class="name"><a title="netmiko.oneaccess" href="oneaccess/index.html">netmiko.oneaccess</a></code></dt>
 <dd>
 <section class="desc"></section>
@@ -225,10 +229,6 @@ CNTL_SHIFT_6 = chr(30)</code></pre>
 <dd>
 <section class="desc"></section>
 </dd>
-<dt><code class="name"><a title="netmiko.py23_compat" href="py23_compat.html">netmiko.py23_compat</a></code></dt>
-<dd>
-<section class="desc"><p>Simplify Python3 compatibility. Modeled after six behavior for small set of things</p></section>
-</dd>
 <dt><code class="name"><a title="netmiko.quanta" href="quanta/index.html">netmiko.quanta</a></code></dt>
 <dd>
 <section class="desc"></section>
@@ -241,6 +241,10 @@ CNTL_SHIFT_6 = chr(30)</code></pre>
 <dd>
 <section class="desc"></section>
 </dd>
+<dt><code class="name"><a title="netmiko.ruijie" href="ruijie/index.html">netmiko.ruijie</a></code></dt>
+<dd>
+<section class="desc"></section>
+</dd>
 <dt><code class="name"><a title="netmiko.scp_functions" href="scp_functions.html">netmiko.scp_functions</a></code></dt>
 <dd>
 <section class="desc"><p>Netmiko SCP operations …</p></section>
@@ -345,7 +349,7 @@ a new SSH connection with a remote host. This …</p></section>
 </details>
 </dd>
 <dt id="netmiko.file_transfer"><code class="name flex">
-<span>def <span class="ident">file_transfer</span></span>(<span>ssh_conn, source_file, dest_file, file_system=None, direction='put', disable_md5=False, inline_transfer=False, overwrite_file=False)</span>
+<span>def <span class="ident">file_transfer</span></span>(<span>ssh_conn, source_file, dest_file, file_system=None, direction='put', disable_md5=False, inline_transfer=False, overwrite_file=False, socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Use Secure Copy or Inline (IOS-only) to transfer files to/from network devices.</p>
@@ -366,6 +370,7 @@ a new SSH connection with a remote host. This …</p></section>
     disable_md5=False,
     inline_transfer=False,
     overwrite_file=False,
+    socket_timeout=10.0,
 ):
     &#34;&#34;&#34;Use Secure Copy or Inline (IOS-only) to transfer files to/from network devices.
 
@@ -405,6 +410,7 @@ a new SSH connection with a remote host. This …</p></section>
         &#34;source_file&#34;: source_file,
         &#34;dest_file&#34;: dest_file,
         &#34;direction&#34;: direction,
+        &#34;socket_timeout&#34;: socket_timeout,
     }
     if file_system is not None:
         scp_args[&#34;file_system&#34;] = file_system
@@ -489,7 +495,7 @@ with terminal server.</p></section>
 <dl>
 <dt id="netmiko.BaseConnection"><code class="flex name class">
 <span>class <span class="ident">BaseConnection</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -610,6 +616,10 @@ with terminal server.</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -644,8 +654,8 @@ with terminal server.</p></section>
         timeout=100,
         session_timeout=60,
         auth_timeout=None,
-        blocking_timeout=8,
-        banner_timeout=5,
+        blocking_timeout=20,
+        banner_timeout=15,
         keepalive=0,
         default_enter=None,
         response_return=None,
@@ -656,6 +666,7 @@ with terminal server.</p></section>
         session_log_file_mode=&#34;write&#34;,
         allow_auto_change=False,
         encoding=&#34;ascii&#34;,
+        sock=None,
     ):
         &#34;&#34;&#34;
         Initialize attributes for establishing connection to target device.
@@ -772,6 +783,10 @@ with terminal server.</p></section>
         :param encoding: Encoding to be used when writing bytes to the output channel.
                 (default: ascii)
         :type encoding: str
+
+        :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+                communication to the target host (default: None).
+        :type sock: socket
         &#34;&#34;&#34;
         self.remote_conn = None
 
@@ -813,6 +828,7 @@ with terminal server.</p></section>
         self.keepalive = keepalive
         self.allow_auto_change = allow_auto_change
         self.encoding = encoding
+        self.sock = sock
 
         # Netmiko will close the session_log if we open the file
         self.session_log = None
@@ -821,10 +837,10 @@ with terminal server.</p></section>
         # Ensures last write operations prior to disconnect are recorded.
         self._session_log_fin = False
         if session_log is not None:
-            if isinstance(session_log, string_types):
+            if isinstance(session_log, str):
                 # If session_log is a string, open a file corresponding to string name.
                 self.open_session_log(filename=session_log, mode=session_log_file_mode)
-            elif isinstance(session_log, bufferedio_types):
+            elif isinstance(session_log, io.BufferedIOBase):
                 # In-memory buffer or an already open file handle
                 self.session_log = session_log
             else:
@@ -911,7 +927,7 @@ with terminal server.</p></section>
         pass
 
     def _timeout_exceeded(self, start, msg=&#34;Timeout exceeded!&#34;):
-        &#34;&#34;&#34;Raise NetMikoTimeoutException if waiting too much in the serving queue.
+        &#34;&#34;&#34;Raise NetmikoTimeoutException if waiting too much in the serving queue.
 
         :param start: Initial start time to see if session lock timeout has been exceeded
         :type start: float (from time.time() call i.e. epoch time)
@@ -924,7 +940,7 @@ with terminal server.</p></section>
             return False
         if time.time() - start &gt; self.session_timeout:
             # session_timeout exceeded
-            raise NetMikoTimeoutException(msg)
+            raise NetmikoTimeoutException(msg)
         return False
 
     def _lock_netmiko_session(self, start=None):
@@ -984,7 +1000,11 @@ with terminal server.</p></section>
                 data = data.replace(self.password, &#34;********&#34;)
             if self.secret:
                 data = data.replace(self.secret, &#34;********&#34;)
-            self.session_log.write(write_bytes(data, encoding=self.encoding))
+            if isinstance(self.session_log, io.BufferedIOBase):
+                data = self.normalize_linefeeds(data)
+                self.session_log.write(write_bytes(data, encoding=self.encoding))
+            else:
+                self.session_log.write(self.normalize_linefeeds(data))
             self.session_log.flush()
 
     def write_channel(self, out_data):
@@ -1051,7 +1071,9 @@ with terminal server.</p></section>
                 output += self.remote_conn.read(self.remote_conn.in_waiting).decode(
                     &#34;utf-8&#34;, &#34;ignore&#34;
                 )
-        log.debug(&#34;read_channel: {}&#34;.format(output))
+        if self.ansi_escape_codes:
+            output = self.strip_ansi_escape_codes(output)
+        log.debug(f&#34;read_channel: {output}&#34;)
         self._write_session_log(output)
         return output
 
@@ -1094,7 +1116,7 @@ with terminal server.</p></section>
         output = &#34;&#34;
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        log.debug(&#34;Pattern is: {}&#34;.format(pattern))
+        log.debug(f&#34;Pattern is: {pattern}&#34;)
 
         i = 1
         loop_delay = 0.1
@@ -1111,11 +1133,13 @@ with terminal server.</p></section>
                     if len(new_data) == 0:
                         raise EOFError(&#34;Channel stream closed by remote device.&#34;)
                     new_data = new_data.decode(&#34;utf-8&#34;, &#34;ignore&#34;)
-                    log.debug(&#34;_read_channel_expect read_data: {}&#34;.format(new_data))
+                    if self.ansi_escape_codes:
+                        new_data = self.strip_ansi_escape_codes(new_data)
+                    log.debug(f&#34;_read_channel_expect read_data: {new_data}&#34;)
                     output += new_data
                     self._write_session_log(new_data)
                 except socket.timeout:
-                    raise NetMikoTimeoutException(
+                    raise NetmikoTimeoutException(
                         &#34;Timed-out reading channel, data not available.&#34;
                     )
                 finally:
@@ -1123,12 +1147,12 @@ with terminal server.</p></section>
             elif self.protocol == &#34;telnet&#34; or &#34;serial&#34;:
                 output += self.read_channel()
             if re.search(pattern, output, flags=re_flags):
-                log.debug(&#34;Pattern found: {} {}&#34;.format(pattern, output))
+                log.debug(f&#34;Pattern found: {pattern} {output}&#34;)
                 return output
             time.sleep(loop_delay * self.global_delay_factor)
             i += 1
-        raise NetMikoTimeoutException(
-            &#34;Timed-out reading channel, pattern not found in output: {}&#34;.format(pattern)
+        raise NetmikoTimeoutException(
+            f&#34;Timed-out reading channel, pattern not found in output: {pattern}&#34;
         )
 
     def _read_channel_timing(self, delay_factor=1, max_loops=150):
@@ -1286,8 +1310,8 @@ with terminal server.</p></section>
                 i += 1
             except EOFError:
                 self.remote_conn.close()
-                msg = &#34;Login failed: {}&#34;.format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f&#34;Login failed: {self.host}&#34;
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -1299,9 +1323,9 @@ with terminal server.</p></section>
         ):
             return return_msg
 
-        msg = &#34;Login failed: {}&#34;.format(self.host)
+        msg = f&#34;Login failed: {self.host}&#34;
         self.remote_conn.close()
-        raise NetMikoAuthenticationException(msg)
+        raise NetmikoAuthenticationException(msg)
 
     def _try_session_preparation(self):
         &#34;&#34;&#34;
@@ -1401,6 +1425,7 @@ with terminal server.</p></section>
             &#34;timeout&#34;: self.timeout,
             &#34;auth_timeout&#34;: self.auth_timeout,
             &#34;banner_timeout&#34;: self.banner_timeout,
+            &#34;sock&#34;: self.sock,
         }
 
         # Check if using SSH &#39;config&#39; file mainly for SSH proxy support
@@ -1419,8 +1444,6 @@ with terminal server.</p></section>
         :param strip_command:
         :type strip_command:
         &#34;&#34;&#34;
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
         output = self.normalize_linefeeds(output)
         if strip_command and command_string:
             command_string = self.normalize_linefeeds(command_string)
@@ -1432,8 +1455,8 @@ with terminal server.</p></section>
     def establish_connection(self, width=None, height=None):
         &#34;&#34;&#34;Establish SSH connection to the network device
 
-        Timeout will generate a NetMikoTimeoutException
-        Authentication failure will generate a NetMikoAuthenticationException
+        Timeout will generate a NetmikoTimeoutException
+        Authentication failure will generate a NetmikoAuthenticationException
 
         width and height are needed for Fortinet paging setting.
 
@@ -1463,19 +1486,17 @@ with terminal server.</p></section>
                 msg = &#34;Connection to device timed-out: {device_type} {ip}:{port}&#34;.format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                raise NetMikoTimeoutException(msg)
+                raise NetmikoTimeoutException(msg)
             except paramiko.ssh_exception.AuthenticationException as auth_err:
                 self.paramiko_cleanup()
                 msg = &#34;Authentication failure: unable to connect {device_type} {ip}:{port}&#34;.format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                msg += self.RETURN + text_type(auth_err)
-                raise NetMikoAuthenticationException(msg)
+                msg += self.RETURN + str(auth_err)
+                raise NetmikoAuthenticationException(msg)
 
             if self.verbose:
-                print(
-                    &#34;SSH connection established to {}:{}&#34;.format(self.host, self.port)
-                )
+                print(f&#34;SSH connection established to {self.host}:{self.port}&#34;)
 
             # Use invoke_shell to establish an &#39;interactive session&#39;
             if width and height:
@@ -1532,7 +1553,7 @@ with terminal server.</p></section>
         if new_data:
             return new_data
         else:
-            raise NetMikoTimeoutException(&#34;Timed out waiting for data&#34;)
+            raise NetmikoTimeoutException(&#34;Timed out waiting for data&#34;)
 
     def _build_ssh_client(self):
         &#34;&#34;&#34;Prepare for Paramiko SSH connection.&#34;&#34;&#34;
@@ -1586,12 +1607,11 @@ with terminal server.</p></section>
         self.clear_buffer()
         command = self.normalize_cmd(command)
         log.debug(&#34;In disable_paging&#34;)
-        log.debug(&#34;Command: {0}&#34;.format(command))
+        log.debug(f&#34;Command: {command}&#34;)
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
-        log.debug(&#34;{0}&#34;.format(output))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
+        log.debug(f&#34;{output}&#34;)
         log.debug(&#34;Exiting disable_paging&#34;)
         return output
 
@@ -1612,9 +1632,8 @@ with terminal server.</p></section>
         delay_factor = self.select_delay_factor(delay_factor)
         command = self.normalize_cmd(command)
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
         return output
 
     def set_base_prompt(
@@ -1641,7 +1660,7 @@ with terminal server.</p></section>
         &#34;&#34;&#34;
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError(&#34;Router prompt not found: {0}&#34;.format(repr(prompt)))
+            raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
         # Strip off trailing terminator
         self.base_prompt = prompt[:-1]
         return self.base_prompt
@@ -1655,24 +1674,26 @@ with terminal server.</p></section>
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
         self.write_channel(self.RETURN)
-        time.sleep(delay_factor * 0.1)
+        sleep_time = delay_factor * 0.1
+        time.sleep(sleep_time)
 
         # Initial attempt to get prompt
         prompt = self.read_channel()
-        if self.ansi_escape_codes:
-            prompt = self.strip_ansi_escape_codes(prompt)
 
         # Check if the only thing you received was a newline
         count = 0
         prompt = prompt.strip()
-        while count &lt;= 10 and not prompt:
+        while count &lt;= 12 and not prompt:
             prompt = self.read_channel().strip()
-            if prompt:
-                if self.ansi_escape_codes:
-                    prompt = self.strip_ansi_escape_codes(prompt).strip()
-            else:
+            if not prompt:
                 self.write_channel(self.RETURN)
-                time.sleep(delay_factor * 0.1)
+                # log.debug(f&#34;find_prompt sleep time: {sleep_time}&#34;)
+                time.sleep(sleep_time)
+                if sleep_time &lt;= 3:
+                    # Double the sleep_time when it is small
+                    sleep_time *= 2
+                else:
+                    sleep_time += 1
             count += 1
 
         # If multiple lines in the output take the last line
@@ -1680,14 +1701,25 @@ with terminal server.</p></section>
         prompt = prompt.split(self.RESPONSE_RETURN)[-1]
         prompt = prompt.strip()
         if not prompt:
-            raise ValueError(&#34;Unable to find prompt: {}&#34;.format(prompt))
+            raise ValueError(f&#34;Unable to find prompt: {prompt}&#34;)
         time.sleep(delay_factor * 0.1)
         self.clear_buffer()
+        log.debug(f&#34;[find_prompt()]: prompt is {prompt}&#34;)
         return prompt
 
-    def clear_buffer(self):
+    def clear_buffer(self, backoff=True):
         &#34;&#34;&#34;Read any data available in the channel.&#34;&#34;&#34;
-        self.read_channel()
+        sleep_time = 0.1 * self.global_delay_factor
+        for _ in range(10):
+            time.sleep(sleep_time)
+            data = self.read_channel()
+            if not data:
+                break
+            # Double sleep time each time we detect data
+            log.debug(&#34;Clear buffer detects data in the channel&#34;)
+            if backoff:
+                sleep_time *= 2
+                sleep_time = 3 if sleep_time &gt;= 3 else sleep_time
 
     def send_command_timing(
         self,
@@ -1698,7 +1730,9 @@ with terminal server.</p></section>
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
+        cmd_echo=False,
     ):
         &#34;&#34;&#34;Execute command_string on the SSH channel using a delay-based mechanism. Generally
         used for show commands.
@@ -1723,10 +1757,17 @@ with terminal server.</p></section>
         :type normalize: bool
 
         :param use_textfsm: Process command output through TextFSM template (default: False).
-        :type normalize: bool
+        :type use_textfsm: bool
+
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+        :type textfsm_template: str
 
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
-        :type normalize: bool
+        :type use_genie: bool
+
+        :param cmd_echo: Verify command echo before proceeding (default: False).
+        :type cmd_echo: bool
         &#34;&#34;&#34;
         output = &#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
@@ -1735,7 +1776,27 @@ with terminal server.</p></section>
             command_string = self.normalize_cmd(command_string)
 
         self.write_channel(command_string)
-        output = self._read_channel_timing(
+
+        cmd = command_string.strip()
+        # if cmd is just an &#34;enter&#34; skip this section
+        if cmd and cmd_echo:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+
+            # Strip off everything before the command echo
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                output = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
+            else:
+                # cmd is in the actual output (not just echoed)
+                output = new_data
+
+        log.debug(f&#34;send_command_timing current output: {output}&#34;)
+
+        output += self._read_channel_timing(
             delay_factor=delay_factor, max_loops=max_loops
         )
         output = self._sanitize_output(
@@ -1744,18 +1805,27 @@ with terminal server.</p></section>
             command_string=command_string,
             strip_prompt=strip_prompt,
         )
+
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+
+        log.debug(f&#34;send_command_timing final output: {output}&#34;)
         return output
 
     def strip_prompt(self, a_string):
@@ -1809,6 +1879,7 @@ with terminal server.</p></section>
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
     ):
         &#34;&#34;&#34;Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -1842,6 +1913,9 @@ with terminal server.</p></section>
         :param use_textfsm: Process command output through TextFSM template (default: False).
         :type normalize: bool
 
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
         :type normalize: bool
         &#34;&#34;&#34;
@@ -1874,6 +1948,20 @@ with terminal server.</p></section>
         time.sleep(delay_factor * loop_delay)
         self.clear_buffer()
         self.write_channel(command_string)
+        new_data = &#34;&#34;
+
+        cmd = command_string.strip()
+        # if cmd is just and &#34;enter&#34; skip this section
+        if cmd:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+            # Strip off everything before the command echo (to avoid false positives on the prompt)
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                new_data = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
 
         i = 1
         output = &#34;&#34;
@@ -1882,11 +1970,7 @@ with terminal server.</p></section>
 
         # Keep reading data until search_pattern is found or until max_loops is reached.
         while i &lt;= max_loops:
-            new_data = self.read_channel()
             if new_data:
-                if self.ansi_escape_codes:
-                    new_data = self.strip_ansi_escape_codes(new_data)
-
                 output += new_data
                 past_three_reads.append(new_data)
 
@@ -1907,6 +1991,7 @@ with terminal server.</p></section>
 
             time.sleep(delay_factor * loop_delay)
             i += 1
+            new_data = self.read_channel()
         else:  # nobreak
             raise IOError(
                 &#34;Search pattern never detected in send_command_expect: {}&#34;.format(
@@ -1922,17 +2007,23 @@ with terminal server.</p></section>
         )
 
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
         return output
 
     def send_command_expect(self, *args, **kwargs):
@@ -1973,12 +2064,17 @@ with terminal server.</p></section>
         # Check for line wrap (remove backspaces)
         if backspace_char in output:
             output = output.replace(backspace_char, &#34;&#34;)
+
+        # Juniper has a weird case where the echoed command will be &#34; \n&#34;
+        # i.e. there is an extra space there.
+        cmd = command_string.strip()
+        if output.startswith(cmd):
             output_lines = output.split(self.RESPONSE_RETURN)
             new_output = output_lines[1:]
             return self.RESPONSE_RETURN.join(new_output)
         else:
-            command_length = len(command_string)
-            return output[command_length:]
+            # command_string isn&#39;t there; do nothing
+            return output
 
     def normalize_linefeeds(self, a_string):
         &#34;&#34;&#34;Convert `\r\r\n`,`\r\n`, `\n\r` to `\n.`
@@ -2040,7 +2136,7 @@ with terminal server.</p></section>
                 )
                 self.write_channel(self.normalize_cmd(self.secret))
                 output += self.read_until_prompt()
-            except NetMikoTimeoutException:
+            except NetmikoTimeoutException:
                 raise ValueError(msg)
             if not self.check_enable_mode():
                 raise ValueError(msg)
@@ -2089,7 +2185,10 @@ with terminal server.</p></section>
         output = &#34;&#34;
         if not self.check_config_mode():
             self.write_channel(self.normalize_cmd(config_command))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(config_command.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if not self.check_config_mode():
                 raise ValueError(&#34;Failed to enter configuration mode.&#34;)
         return output
@@ -2106,10 +2205,13 @@ with terminal server.</p></section>
         output = &#34;&#34;
         if self.check_config_mode():
             self.write_channel(self.normalize_cmd(exit_config))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(exit_config.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if self.check_config_mode():
                 raise ValueError(&#34;Failed to exit configuration mode&#34;)
-        log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+        log.debug(f&#34;exit_config_mode: {output}&#34;)
         return output
 
     def send_config_from_file(self, config_file=None, **kwargs):
@@ -2139,6 +2241,8 @@ with terminal server.</p></section>
         strip_prompt=False,
         strip_command=False,
         config_mode_command=None,
+        cmd_verify=True,
+        enter_config_mode=True,
     ):
         &#34;&#34;&#34;
         Send configuration commands down the SSH channel.
@@ -2168,34 +2272,64 @@ with terminal server.</p></section>
 
         :param config_mode_command: The command to enter into config mode
         :type config_mode_command: str
+
+        :param cmd_verify: Whether or not to verify command echo for each command in config_set
+        :type cmd_verify: bool
+
+        :param enter_config_mode: Do you enter config mode before sending config commands
+        :type exit_config_mode: bool
+
         &#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor)
         if config_commands is None:
             return &#34;&#34;
-        elif isinstance(config_commands, string_types):
+        elif isinstance(config_commands, str):
             config_commands = (config_commands,)
 
         if not hasattr(config_commands, &#34;__iter__&#34;):
             raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
 
         # Send config commands
-        cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
-        output = self.config_mode(*cfg_mode_args)
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            if self.fast_cli:
-                pass
-            else:
+        if enter_config_mode:
+            cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
+            output = self.config_mode(*cfg_mode_args)
+
+        if self.fast_cli:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        elif not cmd_verify:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
                 time.sleep(delay_factor * 0.05)
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        else:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+
+                # Make sure command is echoed
+                new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
+                output += new_output
+
+                # We might capture next prompt in the original read
+                pattern = f&#34;(?:{re.escape(self.base_prompt)}|#)&#34;
+                if not re.search(pattern, new_output):
+                    # Make sure trailing prompt comes back (after command)
+                    # NX-OS has fast-buffering problem where it immediately echoes command
+                    # Even though the device hasn&#39;t caught up with processing command.
+                    new_output = self.read_until_pattern(pattern=pattern)
+                    output += new_output
 
-        # Gather output
-        output += self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
-        )
         if exit_config_mode:
             output += self.exit_config_mode()
         output = self._sanitize_output(output)
-        log.debug(&#34;{}&#34;.format(output))
+        log.debug(f&#34;{output}&#34;)
         return output
 
     def strip_ansi_escape_codes(self, string_buffer):
@@ -2229,7 +2363,7 @@ with terminal server.</p></section>
         :type string_buffer: str
         &#34;&#34;&#34;  # noqa
         log.debug(&#34;In strip_ansi_escape_codes&#34;)
-        log.debug(&#34;repr = {}&#34;.format(repr(string_buffer)))
+        log.debug(f&#34;repr = {repr(string_buffer)}&#34;)
 
         code_position_cursor = chr(27) + r&#34;\[\d+;\d+H&#34;
         code_show_cursor = chr(27) + r&#34;\[\?25h&#34;
@@ -2285,8 +2419,9 @@ with terminal server.</p></section>
         # CODE_NEXT_LINE must substitute with return
         output = re.sub(code_next_line, self.RETURN, output)
 
-        log.debug(&#34;new_output = {0}&#34;.format(output))
-        log.debug(&#34;repr = {0}&#34;.format(repr(output)))
+        log.debug(&#34;Stripping ANSI escape codes&#34;)
+        log.debug(f&#34;new_output = {output}&#34;)
+        log.debug(f&#34;repr = {repr(output)}&#34;)
 
         return output
 
@@ -2328,9 +2463,9 @@ with terminal server.</p></section>
     def open_session_log(self, filename, mode=&#34;write&#34;):
         &#34;&#34;&#34;Open the session_log file.&#34;&#34;&#34;
         if mode == &#34;append&#34;:
-            self.session_log = open(filename, mode=&#34;ab&#34;)
+            self.session_log = open(filename, mode=&#34;a&#34;)
         else:
-            self.session_log = open(filename, mode=&#34;wb&#34;)
+            self.session_log = open(filename, mode=&#34;w&#34;)
         self._session_log_close = True
 
     def close_session_log(self):
@@ -2344,13 +2479,16 @@ with terminal server.</p></section>
 <li><a title="netmiko.base_connection.TelnetConnection" href="base_connection.html#netmiko.base_connection.TelnetConnection">TelnetConnection</a></li>
 <li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
 <li><a title="netmiko.checkpoint.checkpoint_gaia_ssh.CheckPointGaiaSSH" href="checkpoint/checkpoint_gaia_ssh.html#netmiko.checkpoint.checkpoint_gaia_ssh.CheckPointGaiaSSH">CheckPointGaiaSSH</a></li>
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosBase" href="ciena/ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosBase">CienaSaosBase</a></li>
 <li><a title="netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH" href="cisco/cisco_wlc_ssh.html#netmiko.cisco.cisco_wlc_ssh.CiscoWlcSSH">CiscoWlcSSH</a></li>
 <li><a title="netmiko.citrix.netscaler_ssh.NetscalerSSH" href="citrix/netscaler_ssh.html#netmiko.citrix.netscaler_ssh.NetscalerSSH">NetscalerSSH</a></li>
 <li><a title="netmiko.dell.dell_isilon_ssh.DellIsilonSSH" href="dell/dell_isilon_ssh.html#netmiko.dell.dell_isilon_ssh.DellIsilonSSH">DellIsilonSSH</a></li>
 <li><a title="netmiko.f5.f5_tmsh_ssh.F5TmshSSH" href="f5/f5_tmsh_ssh.html#netmiko.f5.f5_tmsh_ssh.F5TmshSSH">F5TmshSSH</a></li>
 <li><a title="netmiko.flexvnf.flexvnf_ssh.FlexvnfSSH" href="flexvnf/flexvnf_ssh.html#netmiko.flexvnf.flexvnf_ssh.FlexvnfSSH">FlexvnfSSH</a></li>
 <li><a title="netmiko.juniper.juniper.JuniperBase" href="juniper/juniper.html#netmiko.juniper.juniper.JuniperBase">JuniperBase</a></li>
+<li><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH" href="juniper/juniper_screenos.html#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH">JuniperScreenOsSSH</a></li>
 <li><a title="netmiko.netapp.netapp_cdot_ssh.NetAppcDotSSH" href="netapp/netapp_cdot_ssh.html#netmiko.netapp.netapp_cdot_ssh.NetAppcDotSSH">NetAppcDotSSH</a></li>
+<li><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH" href="nokia/nokia_sros_ssh.html#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH">NokiaSrosSSH</a></li>
 <li><a title="netmiko.paloalto.paloalto_panos.PaloAltoPanosBase" href="paloalto/paloalto_panos.html#netmiko.paloalto.paloalto_panos.PaloAltoPanosBase">PaloAltoPanosBase</a></li>
 <li><a title="netmiko.pluribus.pluribus_ssh.PluribusSSH" href="pluribus/pluribus_ssh.html#netmiko.pluribus.pluribus_ssh.PluribusSSH">PluribusSSH</a></li>
 <li><a title="netmiko.rad.rad_etx.RadETXBase" href="rad/rad_etx.html#netmiko.rad.rad_etx.RadETXBase">RadETXBase</a></li>
@@ -2443,15 +2581,25 @@ def strip_backspaces(output):
 </details>
 </dd>
 <dt id="netmiko.BaseConnection.clear_buffer"><code class="name flex">
-<span>def <span class="ident">clear_buffer</span></span>(<span>self)</span>
+<span>def <span class="ident">clear_buffer</span></span>(<span>self, backoff=True)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Read any data available in the channel.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def clear_buffer(self):
+<pre><code class="python">def clear_buffer(self, backoff=True):
     &#34;&#34;&#34;Read any data available in the channel.&#34;&#34;&#34;
-    self.read_channel()</code></pre>
+    sleep_time = 0.1 * self.global_delay_factor
+    for _ in range(10):
+        time.sleep(sleep_time)
+        data = self.read_channel()
+        if not data:
+            break
+        # Double sleep time each time we detect data
+        log.debug(&#34;Clear buffer detects data in the channel&#34;)
+        if backoff:
+            sleep_time *= 2
+            sleep_time = 3 if sleep_time &gt;= 3 else sleep_time</code></pre>
 </details>
 </dd>
 <dt id="netmiko.BaseConnection.close_session_log"><code class="name flex">
@@ -2503,7 +2651,10 @@ def strip_backspaces(output):
     output = &#34;&#34;
     if not self.check_config_mode():
         self.write_channel(self.normalize_cmd(config_command))
-        output = self.read_until_pattern(pattern=pattern)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output += self.read_until_pattern(pattern=re.escape(config_command.strip()))
+        if not re.search(pattern, output, flags=re.M):
+            output += self.read_until_pattern(pattern=pattern)
         if not self.check_config_mode():
             raise ValueError(&#34;Failed to enter configuration mode.&#34;)
     return output</code></pre>
@@ -2534,12 +2685,11 @@ def strip_backspaces(output):
     self.clear_buffer()
     command = self.normalize_cmd(command)
     log.debug(&#34;In disable_paging&#34;)
-    log.debug(&#34;Command: {0}&#34;.format(command))
+    log.debug(f&#34;Command: {command}&#34;)
     self.write_channel(command)
-    output = self.read_until_prompt()
-    if self.ansi_escape_codes:
-        output = self.strip_ansi_escape_codes(output)
-    log.debug(&#34;{0}&#34;.format(output))
+    # Make sure you read until you detect the command echo (avoid getting out of sync)
+    output = self.read_until_pattern(pattern=re.escape(command.strip()))
+    log.debug(f&#34;{output}&#34;)
     log.debug(&#34;Exiting disable_paging&#34;)
     return output</code></pre>
 </details>
@@ -2608,7 +2758,7 @@ def strip_backspaces(output):
             )
             self.write_channel(self.normalize_cmd(self.secret))
             output += self.read_until_prompt()
-        except NetMikoTimeoutException:
+        except NetmikoTimeoutException:
             raise ValueError(msg)
         if not self.check_enable_mode():
             raise ValueError(msg)
@@ -2620,8 +2770,8 @@ def strip_backspaces(output):
 </code></dt>
 <dd>
 <section class="desc"><p>Establish SSH connection to the network device</p>
-<p>Timeout will generate a NetMikoTimeoutException
-Authentication failure will generate a NetMikoAuthenticationException</p>
+<p>Timeout will generate a NetmikoTimeoutException
+Authentication failure will generate a NetmikoAuthenticationException</p>
 <p>width and height are needed for Fortinet paging setting.</p>
 <p>:param width: Specified width of the VT100 terminal window
 :type width: int</p>
@@ -2632,8 +2782,8 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
 <pre><code class="python">def establish_connection(self, width=None, height=None):
     &#34;&#34;&#34;Establish SSH connection to the network device
 
-    Timeout will generate a NetMikoTimeoutException
-    Authentication failure will generate a NetMikoAuthenticationException
+    Timeout will generate a NetmikoTimeoutException
+    Authentication failure will generate a NetmikoAuthenticationException
 
     width and height are needed for Fortinet paging setting.
 
@@ -2663,19 +2813,17 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
             msg = &#34;Connection to device timed-out: {device_type} {ip}:{port}&#34;.format(
                 device_type=self.device_type, ip=self.host, port=self.port
             )
-            raise NetMikoTimeoutException(msg)
+            raise NetmikoTimeoutException(msg)
         except paramiko.ssh_exception.AuthenticationException as auth_err:
             self.paramiko_cleanup()
             msg = &#34;Authentication failure: unable to connect {device_type} {ip}:{port}&#34;.format(
                 device_type=self.device_type, ip=self.host, port=self.port
             )
-            msg += self.RETURN + text_type(auth_err)
-            raise NetMikoAuthenticationException(msg)
+            msg += self.RETURN + str(auth_err)
+            raise NetmikoAuthenticationException(msg)
 
         if self.verbose:
-            print(
-                &#34;SSH connection established to {}:{}&#34;.format(self.host, self.port)
-            )
+            print(f&#34;SSH connection established to {self.host}:{self.port}&#34;)
 
         # Use invoke_shell to establish an &#39;interactive session&#39;
         if width and height:
@@ -2717,10 +2865,13 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
     output = &#34;&#34;
     if self.check_config_mode():
         self.write_channel(self.normalize_cmd(exit_config))
-        output = self.read_until_pattern(pattern=pattern)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output += self.read_until_pattern(pattern=re.escape(exit_config.strip()))
+        if not re.search(pattern, output, flags=re.M):
+            output += self.read_until_pattern(pattern=pattern)
         if self.check_config_mode():
             raise ValueError(&#34;Failed to exit configuration mode&#34;)
-    log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+    log.debug(f&#34;exit_config_mode: {output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -2766,24 +2917,26 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
     delay_factor = self.select_delay_factor(delay_factor)
     self.clear_buffer()
     self.write_channel(self.RETURN)
-    time.sleep(delay_factor * 0.1)
+    sleep_time = delay_factor * 0.1
+    time.sleep(sleep_time)
 
     # Initial attempt to get prompt
     prompt = self.read_channel()
-    if self.ansi_escape_codes:
-        prompt = self.strip_ansi_escape_codes(prompt)
 
     # Check if the only thing you received was a newline
     count = 0
     prompt = prompt.strip()
-    while count &lt;= 10 and not prompt:
+    while count &lt;= 12 and not prompt:
         prompt = self.read_channel().strip()
-        if prompt:
-            if self.ansi_escape_codes:
-                prompt = self.strip_ansi_escape_codes(prompt).strip()
-        else:
+        if not prompt:
             self.write_channel(self.RETURN)
-            time.sleep(delay_factor * 0.1)
+            # log.debug(f&#34;find_prompt sleep time: {sleep_time}&#34;)
+            time.sleep(sleep_time)
+            if sleep_time &lt;= 3:
+                # Double the sleep_time when it is small
+                sleep_time *= 2
+            else:
+                sleep_time += 1
         count += 1
 
     # If multiple lines in the output take the last line
@@ -2791,9 +2944,10 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
     prompt = prompt.split(self.RESPONSE_RETURN)[-1]
     prompt = prompt.strip()
     if not prompt:
-        raise ValueError(&#34;Unable to find prompt: {}&#34;.format(prompt))
+        raise ValueError(f&#34;Unable to find prompt: {prompt}&#34;)
     time.sleep(delay_factor * 0.1)
     self.clear_buffer()
+    log.debug(f&#34;[find_prompt()]: prompt is {prompt}&#34;)
     return prompt</code></pre>
 </details>
 </dd>
@@ -2897,9 +3051,9 @@ Authentication failure will generate a NetMikoAuthenticationException</p>
 <pre><code class="python">def open_session_log(self, filename, mode=&#34;write&#34;):
     &#34;&#34;&#34;Open the session_log file.&#34;&#34;&#34;
     if mode == &#34;append&#34;:
-        self.session_log = open(filename, mode=&#34;ab&#34;)
+        self.session_log = open(filename, mode=&#34;a&#34;)
     else:
-        self.session_log = open(filename, mode=&#34;wb&#34;)
+        self.session_log = open(filename, mode=&#34;w&#34;)
     self._session_log_close = True</code></pre>
 </details>
 </dd>
@@ -3035,7 +3189,7 @@ In fast_cli choose the lesser of delay_factor of self.global_delay_factor.</p>
 </details>
 </dd>
 <dt id="netmiko.BaseConnection.send_command"><code class="name flex">
-<span>def <span class="ident">send_command</span></span>(<span>self, command_string, expect_string=None, delay_factor=1, max_loops=500, auto_find_prompt=True, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, use_genie=False)</span>
+<span>def <span class="ident">send_command</span></span>(<span>self, command_string, expect_string=None, delay_factor=1, max_loops=500, auto_find_prompt=True, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, textfsm_template=None, use_genie=False)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -3060,6 +3214,8 @@ based upon self.timeout.
 :type normalize: bool</p>
 <p>:param use_textfsm: Process command output through TextFSM template (default: False).
 :type normalize: bool</p>
+<p>:param textfsm_template: Name of template to parse output with; can be fully qualified
+path, relative path, or name of file in current directory. (default: None).</p>
 <p>:param use_genie: Process command output through PyATS/Genie parser (default: False).
 :type normalize: bool</p></section>
 <details class="source">
@@ -3075,6 +3231,7 @@ based upon self.timeout.
     strip_command=True,
     normalize=True,
     use_textfsm=False,
+    textfsm_template=None,
     use_genie=False,
 ):
     &#34;&#34;&#34;Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -3108,6 +3265,9 @@ based upon self.timeout.
     :param use_textfsm: Process command output through TextFSM template (default: False).
     :type normalize: bool
 
+    :param textfsm_template: Name of template to parse output with; can be fully qualified
+        path, relative path, or name of file in current directory. (default: None).
+
     :param use_genie: Process command output through PyATS/Genie parser (default: False).
     :type normalize: bool
     &#34;&#34;&#34;
@@ -3140,6 +3300,20 @@ based upon self.timeout.
     time.sleep(delay_factor * loop_delay)
     self.clear_buffer()
     self.write_channel(command_string)
+    new_data = &#34;&#34;
+
+    cmd = command_string.strip()
+    # if cmd is just and &#34;enter&#34; skip this section
+    if cmd:
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        new_data = self.read_until_pattern(pattern=re.escape(cmd))
+        new_data = self.normalize_linefeeds(new_data)
+        # Strip off everything before the command echo (to avoid false positives on the prompt)
+        if new_data.count(cmd) == 1:
+            new_data = new_data.split(cmd)[1:]
+            new_data = self.RESPONSE_RETURN.join(new_data)
+            new_data = new_data.lstrip()
+            new_data = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
 
     i = 1
     output = &#34;&#34;
@@ -3148,11 +3322,7 @@ based upon self.timeout.
 
     # Keep reading data until search_pattern is found or until max_loops is reached.
     while i &lt;= max_loops:
-        new_data = self.read_channel()
         if new_data:
-            if self.ansi_escape_codes:
-                new_data = self.strip_ansi_escape_codes(new_data)
-
             output += new_data
             past_three_reads.append(new_data)
 
@@ -3173,6 +3343,7 @@ based upon self.timeout.
 
         time.sleep(delay_factor * loop_delay)
         i += 1
+        new_data = self.read_channel()
     else:  # nobreak
         raise IOError(
             &#34;Search pattern never detected in send_command_expect: {}&#34;.format(
@@ -3188,17 +3359,23 @@ based upon self.timeout.
     )
 
     # If both TextFSM and Genie are set, try TextFSM then Genie
-    for parser_flag, parser_func in (
-        (use_textfsm, get_structured_data),
-        (use_genie, get_structured_data_genie),
-    ):
-        if parser_flag:
-            structured_output = parser_func(
-                output, platform=self.device_type, command=command_string.strip()
-            )
-            # If we have structured data; return it.
-            if not isinstance(structured_output, string_types):
-                return structured_output
+    if use_textfsm:
+        structured_output = get_structured_data(
+            output,
+            platform=self.device_type,
+            command=command_string.strip(),
+            template=textfsm_template,
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
+    if use_genie:
+        structured_output = get_structured_data_genie(
+            output, platform=self.device_type, command=command_string.strip()
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
     return output</code></pre>
 </details>
 </dd>
@@ -3226,7 +3403,7 @@ based upon self.timeout.
 </details>
 </dd>
 <dt id="netmiko.BaseConnection.send_command_timing"><code class="name flex">
-<span>def <span class="ident">send_command_timing</span></span>(<span>self, command_string, delay_factor=1, max_loops=150, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, use_genie=False)</span>
+<span>def <span class="ident">send_command_timing</span></span>(<span>self, command_string, delay_factor=1, max_loops=150, strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False, textfsm_template=None, use_genie=False, cmd_echo=False)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Execute command_string on the SSH channel using a delay-based mechanism. Generally
@@ -3245,9 +3422,14 @@ based upon self.timeout.
 <p>:param normalize: Ensure the proper enter is sent at end of command (default: True).
 :type normalize: bool</p>
 <p>:param use_textfsm: Process command output through TextFSM template (default: False).
-:type normalize: bool</p>
+:type use_textfsm: bool</p>
+<p>:param textfsm_template: Name of template to parse output with; can be fully qualified
+path, relative path, or name of file in current directory. (default: None).
+:type textfsm_template: str</p>
 <p>:param use_genie: Process command output through PyATS/Genie parser (default: False).
-:type normalize: bool</p></section>
+:type use_genie: bool</p>
+<p>:param cmd_echo: Verify command echo before proceeding (default: False).
+:type cmd_echo: bool</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def send_command_timing(
@@ -3259,7 +3441,9 @@ based upon self.timeout.
     strip_command=True,
     normalize=True,
     use_textfsm=False,
+    textfsm_template=None,
     use_genie=False,
+    cmd_echo=False,
 ):
     &#34;&#34;&#34;Execute command_string on the SSH channel using a delay-based mechanism. Generally
     used for show commands.
@@ -3284,10 +3468,17 @@ based upon self.timeout.
     :type normalize: bool
 
     :param use_textfsm: Process command output through TextFSM template (default: False).
-    :type normalize: bool
+    :type use_textfsm: bool
+
+    :param textfsm_template: Name of template to parse output with; can be fully qualified
+        path, relative path, or name of file in current directory. (default: None).
+    :type textfsm_template: str
 
     :param use_genie: Process command output through PyATS/Genie parser (default: False).
-    :type normalize: bool
+    :type use_genie: bool
+
+    :param cmd_echo: Verify command echo before proceeding (default: False).
+    :type cmd_echo: bool
     &#34;&#34;&#34;
     output = &#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor)
@@ -3296,7 +3487,27 @@ based upon self.timeout.
         command_string = self.normalize_cmd(command_string)
 
     self.write_channel(command_string)
-    output = self._read_channel_timing(
+
+    cmd = command_string.strip()
+    # if cmd is just an &#34;enter&#34; skip this section
+    if cmd and cmd_echo:
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        new_data = self.read_until_pattern(pattern=re.escape(cmd))
+        new_data = self.normalize_linefeeds(new_data)
+
+        # Strip off everything before the command echo
+        if new_data.count(cmd) == 1:
+            new_data = new_data.split(cmd)[1:]
+            new_data = self.RESPONSE_RETURN.join(new_data)
+            new_data = new_data.lstrip()
+            output = f&#34;{cmd}{self.RESPONSE_RETURN}{new_data}&#34;
+        else:
+            # cmd is in the actual output (not just echoed)
+            output = new_data
+
+    log.debug(f&#34;send_command_timing current output: {output}&#34;)
+
+    output += self._read_channel_timing(
         delay_factor=delay_factor, max_loops=max_loops
     )
     output = self._sanitize_output(
@@ -3305,18 +3516,27 @@ based upon self.timeout.
         command_string=command_string,
         strip_prompt=strip_prompt,
     )
+
     # If both TextFSM and Genie are set, try TextFSM then Genie
-    for parser_flag, parser_func in (
-        (use_textfsm, get_structured_data),
-        (use_genie, get_structured_data_genie),
-    ):
-        if parser_flag:
-            structured_output = parser_func(
-                output, platform=self.device_type, command=command_string.strip()
-            )
-            # If we have structured data; return it.
-            if not isinstance(structured_output, string_types):
-                return structured_output
+    if use_textfsm:
+        structured_output = get_structured_data(
+            output,
+            platform=self.device_type,
+            command=command_string.strip(),
+            template=textfsm_template,
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
+    if use_genie:
+        structured_output = get_structured_data_genie(
+            output, platform=self.device_type, command=command_string.strip()
+        )
+        # If we have structured data; return it.
+        if not isinstance(structured_output, str):
+            return structured_output
+
+    log.debug(f&#34;send_command_timing final output: {output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -3354,7 +3574,7 @@ SSH channel.</p>
 </details>
 </dd>
 <dt id="netmiko.BaseConnection.send_config_set"><code class="name flex">
-<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=True, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None)</span>
+<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=True, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None, cmd_verify=True, enter_config_mode=True)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Send configuration commands down the SSH channel.</p>
@@ -3374,7 +3594,11 @@ The commands will be executed one after the other.</p>
 <p>:param strip_command: Determines whether or not to strip the command
 :type strip_command: bool</p>
 <p>:param config_mode_command: The command to enter into config mode
-:type config_mode_command: str</p></section>
+:type config_mode_command: str</p>
+<p>:param cmd_verify: Whether or not to verify command echo for each command in config_set
+:type cmd_verify: bool</p>
+<p>:param enter_config_mode: Do you enter config mode before sending config commands
+:type exit_config_mode: bool</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def send_config_set(
@@ -3386,6 +3610,8 @@ The commands will be executed one after the other.</p>
     strip_prompt=False,
     strip_command=False,
     config_mode_command=None,
+    cmd_verify=True,
+    enter_config_mode=True,
 ):
     &#34;&#34;&#34;
     Send configuration commands down the SSH channel.
@@ -3415,34 +3641,64 @@ The commands will be executed one after the other.</p>
 
     :param config_mode_command: The command to enter into config mode
     :type config_mode_command: str
+
+    :param cmd_verify: Whether or not to verify command echo for each command in config_set
+    :type cmd_verify: bool
+
+    :param enter_config_mode: Do you enter config mode before sending config commands
+    :type exit_config_mode: bool
+
     &#34;&#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor)
     if config_commands is None:
         return &#34;&#34;
-    elif isinstance(config_commands, string_types):
+    elif isinstance(config_commands, str):
         config_commands = (config_commands,)
 
     if not hasattr(config_commands, &#34;__iter__&#34;):
         raise ValueError(&#34;Invalid argument passed into send_config_set&#34;)
 
     # Send config commands
-    cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
-    output = self.config_mode(*cfg_mode_args)
-    for cmd in config_commands:
-        self.write_channel(self.normalize_cmd(cmd))
-        if self.fast_cli:
-            pass
-        else:
+    if enter_config_mode:
+        cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
+        output = self.config_mode(*cfg_mode_args)
+
+    if self.fast_cli:
+        for cmd in config_commands:
+            self.write_channel(self.normalize_cmd(cmd))
+        # Gather output
+        output += self._read_channel_timing(
+            delay_factor=delay_factor, max_loops=max_loops
+        )
+    elif not cmd_verify:
+        for cmd in config_commands:
+            self.write_channel(self.normalize_cmd(cmd))
             time.sleep(delay_factor * 0.05)
+        # Gather output
+        output += self._read_channel_timing(
+            delay_factor=delay_factor, max_loops=max_loops
+        )
+    else:
+        for cmd in config_commands:
+            self.write_channel(self.normalize_cmd(cmd))
+
+            # Make sure command is echoed
+            new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
+            output += new_output
+
+            # We might capture next prompt in the original read
+            pattern = f&#34;(?:{re.escape(self.base_prompt)}|#)&#34;
+            if not re.search(pattern, new_output):
+                # Make sure trailing prompt comes back (after command)
+                # NX-OS has fast-buffering problem where it immediately echoes command
+                # Even though the device hasn&#39;t caught up with processing command.
+                new_output = self.read_until_pattern(pattern=pattern)
+                output += new_output
 
-    # Gather output
-    output += self._read_channel_timing(
-        delay_factor=delay_factor, max_loops=max_loops
-    )
     if exit_config_mode:
         output += self.exit_config_mode()
     output = self._sanitize_output(output)
-    log.debug(&#34;{}&#34;.format(output))
+    log.debug(f&#34;{output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -3553,7 +3809,7 @@ entering/exiting config mode.</p>
     &#34;&#34;&#34;
     prompt = self.find_prompt(delay_factor=delay_factor)
     if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-        raise ValueError(&#34;Router prompt not found: {0}&#34;.format(repr(prompt)))
+        raise ValueError(f&#34;Router prompt not found: {repr(prompt)}&#34;)
     # Strip off trailing terminator
     self.base_prompt = prompt[:-1]
     return self.base_prompt</code></pre>
@@ -3589,9 +3845,8 @@ This causes the output to get distorted when accessed programmatically.</p>
     delay_factor = self.select_delay_factor(delay_factor)
     command = self.normalize_cmd(command)
     self.write_channel(command)
-    output = self.read_until_prompt()
-    if self.ansi_escape_codes:
-        output = self.strip_ansi_escape_codes(output)
+    # Make sure you read until you detect the command echo (avoid getting out of sync)
+    output = self.read_until_pattern(pattern=re.escape(command.strip()))
     return output</code></pre>
 </details>
 </dd>
@@ -3677,7 +3932,7 @@ Get cursor position</p>
     :type string_buffer: str
     &#34;&#34;&#34;  # noqa
     log.debug(&#34;In strip_ansi_escape_codes&#34;)
-    log.debug(&#34;repr = {}&#34;.format(repr(string_buffer)))
+    log.debug(f&#34;repr = {repr(string_buffer)}&#34;)
 
     code_position_cursor = chr(27) + r&#34;\[\d+;\d+H&#34;
     code_show_cursor = chr(27) + r&#34;\[\?25h&#34;
@@ -3733,8 +3988,9 @@ Get cursor position</p>
     # CODE_NEXT_LINE must substitute with return
     output = re.sub(code_next_line, self.RETURN, output)
 
-    log.debug(&#34;new_output = {0}&#34;.format(output))
-    log.debug(&#34;repr = {0}&#34;.format(repr(output)))
+    log.debug(&#34;Stripping ANSI escape codes&#34;)
+    log.debug(f&#34;new_output = {output}&#34;)
+    log.debug(f&#34;repr = {repr(output)}&#34;)
 
     return output</code></pre>
 </details>
@@ -3768,12 +4024,17 @@ Get cursor position</p>
     # Check for line wrap (remove backspaces)
     if backspace_char in output:
         output = output.replace(backspace_char, &#34;&#34;)
+
+    # Juniper has a weird case where the echoed command will be &#34; \n&#34;
+    # i.e. there is an extra space there.
+    cmd = command_string.strip()
+    if output.startswith(cmd):
         output_lines = output.split(self.RESPONSE_RETURN)
         new_output = output_lines[1:]
         return self.RESPONSE_RETURN.join(new_output)
     else:
-        command_length = len(command_string)
-        return output[command_length:]</code></pre>
+        # command_string isn&#39;t there; do nothing
+        return output</code></pre>
 </details>
 </dd>
 <dt id="netmiko.BaseConnection.strip_prompt"><code class="name flex">
@@ -3882,8 +4143,8 @@ Get cursor position</p>
             i += 1
         except EOFError:
             self.remote_conn.close()
-            msg = &#34;Login failed: {}&#34;.format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f&#34;Login failed: {self.host}&#34;
+            raise NetmikoAuthenticationException(msg)
 
     # Last try to see if we already logged in
     self.write_channel(self.TELNET_RETURN)
@@ -3895,9 +4156,9 @@ Get cursor position</p>
     ):
         return return_msg
 
-    msg = &#34;Login failed: {}&#34;.format(self.host)
+    msg = f&#34;Login failed: {self.host}&#34;
     self.remote_conn.close()
-    raise NetMikoAuthenticationException(msg)</code></pre>
+    raise NetmikoAuthenticationException(msg)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.BaseConnection.write_channel"><code class="name flex">
@@ -3927,7 +4188,7 @@ Get cursor position</p>
 </dd>
 <dt id="netmiko.InLineTransfer"><code class="flex name class">
 <span>class <span class="ident">InLineTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file=None, dest_file=None, file_system=None, direction='put', source_config=None)</span>
+<span>(</span><span>ssh_conn, source_file=None, dest_file=None, file_system=None, direction='put', source_config=None, socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Use TCL on Cisco IOS to directly transfer file.</p></section>
@@ -3944,6 +4205,7 @@ Get cursor position</p>
         file_system=None,
         direction=&#34;put&#34;,
         source_config=None,
+        socket_timeout=10.0,
     ):
         if source_file and source_config:
             msg = &#34;Invalid call to InLineTransfer both source_file and source_config specified.&#34;
@@ -3970,6 +4232,8 @@ Get cursor position</p>
         else:
             self.file_system = file_system
 
+        self.socket_timeout = socket_timeout
+
     @staticmethod
     def _read_file(file_name):
         with io.open(file_name, &#34;rt&#34;, encoding=&#34;utf-8&#34;) as f:
@@ -3977,7 +4241,7 @@ Get cursor position</p>
 
     @staticmethod
     def _tcl_newline_rationalize(tcl_string):
-        &#34;&#34;&#34;
+        r&#34;&#34;&#34;
         When using put inside a TCL {} section the newline is considered a new TCL
         statement and causes a missing curly-brace message. Convert &#34;\n&#34; to &#34;\r&#34;. TCL
         will convert the &#34;\r&#34; to a &#34;\n&#34; i.e. you will see a &#34;\n&#34; inside the file on the
@@ -4009,9 +4273,7 @@ Get cursor position</p>
         )
         for pattern in cmd_failed:
             if pattern in output:
-                raise ValueError(
-                    &#34;Failed to enter tclsh mode on router: {}&#34;.format(output)
-                )
+                raise ValueError(f&#34;Failed to enter tclsh mode on router: {output}&#34;)
         return output
 
     def _exit_tcl_mode(self):
@@ -4042,10 +4304,7 @@ Get cursor position</p>
         return hashlib.md5(file_contents).hexdigest()
 
     def config_md5(self, source_config):
-        &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
-        file_contents = source_config + &#34;\n&#34;  # Cisco IOS automatically adds this
-        file_contents = file_contents.encode(&#34;UTF-8&#34;)
-        return hashlib.md5(file_contents).hexdigest()
+        return super().file_md5(source_config, add_newline=True)
 
     def put_file(self):
         curlybrace = r&#34;{&#34;
@@ -4116,12 +4375,24 @@ Get cursor position</p>
 <span>def <span class="ident">config_md5</span></span>(<span>self, source_config)</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Compute MD5 hash of file.</p></section>
+<section class="desc"></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def config_md5(self, source_config):
+    return super().file_md5(source_config, add_newline=True)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.InLineTransfer.file_md5"><code class="name flex">
+<span>def <span class="ident">file_md5</span></span>(<span>self, file_name)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Compute MD5 hash of file.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def file_md5(self, file_name):
     &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
-    file_contents = source_config + &#34;\n&#34;  # Cisco IOS automatically adds this
+    file_contents = self._read_file(file_name)
+    file_contents = file_contents + &#34;\n&#34;  # Cisco IOS automatically adds this
     file_contents = file_contents.encode(&#34;UTF-8&#34;)
     return hashlib.md5(file_contents).hexdigest()</code></pre>
 </details>
@@ -4137,7 +4408,6 @@ Get cursor position</p>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.disable_scp" href="scp_handler.html#netmiko.scp_handler.BaseFileTransfer.disable_scp">disable_scp</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.enable_scp" href="scp_handler.html#netmiko.scp_handler.BaseFileTransfer.enable_scp">enable_scp</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.establish_scp_conn" href="scp_handler.html#netmiko.scp_handler.BaseFileTransfer.establish_scp_conn">establish_scp_conn</a></code></li>
-<li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.file_md5" href="scp_handler.html#netmiko.scp_handler.BaseFileTransfer.file_md5">file_md5</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.get_file" href="scp_handler.html#netmiko.scp_handler.BaseFileTransfer.get_file">get_file</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.local_space_available" href="scp_handler.html#netmiko.scp_handler.BaseFileTransfer.local_space_available">local_space_available</a></code></li>
 <li><code><a title="netmiko.cisco.cisco_ios.CiscoIosFileTransfer.process_md5" href="scp_handler.html#netmiko.scp_handler.BaseFileTransfer.process_md5">process_md5</a></code></li>
@@ -4152,7 +4422,7 @@ Get cursor position</p>
 </li>
 </ul>
 </dd>
-<dt id="netmiko.NetMikoAuthenticationException"><code class="flex name class">
+<dt id="netmiko.NetmikoAuthenticationException"><code class="flex name class">
 <span>class <span class="ident">NetMikoAuthenticationException</span></span>
 <span>(</span><span>*args, **kwargs)</span>
 </code></dt>
@@ -4160,7 +4430,7 @@ Get cursor position</p>
 <section class="desc"><p>SSH authentication exception based on Paramiko AuthenticationException.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">class NetMikoAuthenticationException(AuthenticationException):
+<pre><code class="python">class NetmikoAuthenticationException(AuthenticationException):
     &#34;&#34;&#34;SSH authentication exception based on Paramiko AuthenticationException.&#34;&#34;&#34;
 
     pass</code></pre>
@@ -4173,7 +4443,7 @@ Get cursor position</p>
 <li>builtins.BaseException</li>
 </ul>
 </dd>
-<dt id="netmiko.NetMikoTimeoutException"><code class="flex name class">
+<dt id="netmiko.NetmikoTimeoutException"><code class="flex name class">
 <span>class <span class="ident">NetMikoTimeoutException</span></span>
 <span>(</span><span>*args, **kwargs)</span>
 </code></dt>
@@ -4181,7 +4451,7 @@ Get cursor position</p>
 <section class="desc"><p>SSH session timed trying to connect to the device.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">class NetMikoTimeoutException(SSHException):
+<pre><code class="python">class NetmikoTimeoutException(SSHException):
     &#34;&#34;&#34;SSH session timed trying to connect to the device.&#34;&#34;&#34;
 
     pass</code></pre>
@@ -4193,15 +4463,15 @@ Get cursor position</p>
 <li>builtins.BaseException</li>
 </ul>
 </dd>
-<dt id="netmiko.NetMikoAuthenticationException"><code class="flex name class">
-<span>class <span class="ident">NetmikoAuthError</span></span>
+<dt id="netmiko.NetmikoAuthenticationException"><code class="flex name class">
+<span>class <span class="ident">NetmikoAuthenticationException</span></span>
 <span>(</span><span>*args, **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>SSH authentication exception based on Paramiko AuthenticationException.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">class NetMikoAuthenticationException(AuthenticationException):
+<pre><code class="python">class NetmikoAuthenticationException(AuthenticationException):
     &#34;&#34;&#34;SSH authentication exception based on Paramiko AuthenticationException.&#34;&#34;&#34;
 
     pass</code></pre>
@@ -4214,15 +4484,15 @@ Get cursor position</p>
 <li>builtins.BaseException</li>
 </ul>
 </dd>
-<dt id="netmiko.NetMikoTimeoutException"><code class="flex name class">
-<span>class <span class="ident">NetmikoTimeoutError</span></span>
+<dt id="netmiko.NetmikoTimeoutException"><code class="flex name class">
+<span>class <span class="ident">NetmikoTimeoutException</span></span>
 <span>(</span><span>*args, **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>SSH session timed trying to connect to the device.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">class NetMikoTimeoutException(SSHException):
+<pre><code class="python">class NetmikoTimeoutException(SSHException):
     &#34;&#34;&#34;SSH session timed trying to connect to the device.&#34;&#34;&#34;
 
     pass</code></pre>
@@ -4236,7 +4506,7 @@ Get cursor position</p>
 </dd>
 <dt id="netmiko.SCPConn"><code class="flex name class">
 <span>class <span class="ident">SCPConn</span></span>
-<span>(</span><span>ssh_conn)</span>
+<span>(</span><span>ssh_conn, socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Establish a secure copy channel to the remote network device.</p>
@@ -4250,8 +4520,9 @@ Get cursor position</p>
     Must close the SCP connection to get the file to write to the remote filesystem
     &#34;&#34;&#34;
 
-    def __init__(self, ssh_conn):
+    def __init__(self, ssh_conn, socket_timeout=10.0):
         self.ssh_ctl_chan = ssh_conn
+        self.socket_timeout = socket_timeout
         self.establish_scp_conn()
 
     def establish_scp_conn(self):
@@ -4259,7 +4530,9 @@ Get cursor position</p>
         ssh_connect_params = self.ssh_ctl_chan._connect_params_dict()
         self.scp_conn = self.ssh_ctl_chan._build_ssh_client()
         self.scp_conn.connect(**ssh_connect_params)
-        self.scp_client = scp.SCPClient(self.scp_conn.get_transport())
+        self.scp_client = scp.SCPClient(
+            self.scp_conn.get_transport(), socket_timeout=self.socket_timeout
+        )
 
     def scp_transfer_file(self, source_file, dest_file):
         &#34;&#34;&#34;Put file using SCP (for backwards compatibility).&#34;&#34;&#34;
@@ -4303,7 +4576,9 @@ Get cursor position</p>
     ssh_connect_params = self.ssh_ctl_chan._connect_params_dict()
     self.scp_conn = self.ssh_ctl_chan._build_ssh_client()
     self.scp_conn.connect(**ssh_connect_params)
-    self.scp_client = scp.SCPClient(self.scp_conn.get_transport())</code></pre>
+    self.scp_client = scp.SCPClient(
+        self.scp_conn.get_transport(), socket_timeout=self.socket_timeout
+    )</code></pre>
 </details>
 </dd>
 <dt id="netmiko.SCPConn.scp_get_file"><code class="name flex">
@@ -4463,7 +4738,6 @@ Try to determine the device type.</p>
         self.connection.write_channel(cmd + &#34;\n&#34;)
         time.sleep(1)
         output = self.connection._read_channel_timing()
-        output = self.connection.strip_ansi_escape_codes(output)
         output = self.connection.strip_backspaces(output)
         return output
 
@@ -4629,14 +4903,15 @@ Try to determine the device type.</p>
 <li><code><a title="netmiko.mrv" href="mrv/index.html">netmiko.mrv</a></code></li>
 <li><code><a title="netmiko.netapp" href="netapp/index.html">netmiko.netapp</a></code></li>
 <li><code><a title="netmiko.netmiko_globals" href="netmiko_globals.html">netmiko.netmiko_globals</a></code></li>
+<li><code><a title="netmiko.nokia" href="nokia/index.html">netmiko.nokia</a></code></li>
 <li><code><a title="netmiko.oneaccess" href="oneaccess/index.html">netmiko.oneaccess</a></code></li>
 <li><code><a title="netmiko.ovs" href="ovs/index.html">netmiko.ovs</a></code></li>
 <li><code><a title="netmiko.paloalto" href="paloalto/index.html">netmiko.paloalto</a></code></li>
 <li><code><a title="netmiko.pluribus" href="pluribus/index.html">netmiko.pluribus</a></code></li>
-<li><code><a title="netmiko.py23_compat" href="py23_compat.html">netmiko.py23_compat</a></code></li>
 <li><code><a title="netmiko.quanta" href="quanta/index.html">netmiko.quanta</a></code></li>
 <li><code><a title="netmiko.rad" href="rad/index.html">netmiko.rad</a></code></li>
 <li><code><a title="netmiko.ruckus" href="ruckus/index.html">netmiko.ruckus</a></code></li>
+<li><code><a title="netmiko.ruijie" href="ruijie/index.html">netmiko.ruijie</a></code></li>
 <li><code><a title="netmiko.scp_functions" href="scp_functions.html">netmiko.scp_functions</a></code></li>
 <li><code><a title="netmiko.scp_handler" href="scp_handler.html">netmiko.scp_handler</a></code></li>
 <li><code><a title="netmiko.snmp_autodetect" href="snmp_autodetect.html">netmiko.snmp_autodetect</a></code></li>
@@ -4710,19 +4985,20 @@ Try to determine the device type.</p>
 <h4><code><a title="netmiko.InLineTransfer" href="#netmiko.InLineTransfer">InLineTransfer</a></code></h4>
 <ul class="">
 <li><code><a title="netmiko.InLineTransfer.config_md5" href="#netmiko.InLineTransfer.config_md5">config_md5</a></code></li>
+<li><code><a title="netmiko.InLineTransfer.file_md5" href="#netmiko.InLineTransfer.file_md5">file_md5</a></code></li>
 </ul>
 </li>
 <li>
-<h4><code><a title="netmiko.NetMikoAuthenticationException" href="#netmiko.NetMikoAuthenticationException">NetMikoAuthenticationException</a></code></h4>
+<h4><code><a title="netmiko.NetmikoAuthenticationException" href="#netmiko.NetmikoAuthenticationException">NetmikoAuthenticationException</a></code></h4>
 </li>
 <li>
-<h4><code><a title="netmiko.NetMikoTimeoutException" href="#netmiko.NetMikoTimeoutException">NetMikoTimeoutException</a></code></h4>
+<h4><code><a title="netmiko.NetmikoTimeoutException" href="#netmiko.NetmikoTimeoutException">NetmikoTimeoutException</a></code></h4>
 </li>
 <li>
-<h4><code><a title="netmiko.NetMikoAuthenticationException" href="#netmiko.NetMikoAuthenticationException">NetMikoAuthenticationException</a></code></h4>
+<h4><code><a title="netmiko.NetmikoAuthenticationException" href="#netmiko.NetmikoAuthenticationException">NetmikoAuthenticationException</a></code></h4>
 </li>
 <li>
-<h4><code><a title="netmiko.NetMikoTimeoutException" href="#netmiko.NetMikoTimeoutException">NetMikoTimeoutException</a></code></h4>
+<h4><code><a title="netmiko.NetmikoTimeoutException" href="#netmiko.NetmikoTimeoutException">NetmikoTimeoutException</a></code></h4>
 </li>
 <li>
 <h4><code><a title="netmiko.SCPConn" href="#netmiko.SCPConn">SCPConn</a></code></h4>
@@ -4746,7 +5022,7 @@ Try to determine the device type.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ipinfusion/index.html b/docs/netmiko/ipinfusion/index.html
index 0adb12bf543c1118ee1fdc3e0664d9061ec8eaaa..801a7e4cacf7d407a459f48fea21270a27ab5bda 100644
--- a/docs/netmiko/ipinfusion/index.html
+++ b/docs/netmiko/ipinfusion/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ipinfusion API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.ipinfusion.ipinfusion_ocnos import (
+<pre><code class="python">from netmiko.ipinfusion.ipinfusion_ocnos import (
     IpInfusionOcNOSSSH,
     IpInfusionOcNOSTelnet,
 )
@@ -169,6 +168,10 @@ __all__ = [&#34;IpInfusionOcNOSSSH&#34;, &#34;IpInfusionOcNOSTelnet&#34;]</code>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -354,6 +357,10 @@ Telnet driver.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -385,7 +392,7 @@ Telnet driver.</p>
     ):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(IpInfusionOcNOSTelnet, self).telnet_login(
+        return super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
@@ -481,7 +488,7 @@ Telnet driver.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ipinfusion/ipinfusion_ocnos.html b/docs/netmiko/ipinfusion/ipinfusion_ocnos.html
index e23c2b4171beeb2eeaf8ded494e25a8c048cd3f9..8598350fcc12e03c75e3fb3df7ffdb7463cb3cc3 100644
--- a/docs/netmiko/ipinfusion/ipinfusion_ocnos.html
+++ b/docs/netmiko/ipinfusion/ipinfusion_ocnos.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ipinfusion.ipinfusion_ocnos API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from telnetlib import IAC, DO, DONT, WILL, WONT, SB, SE, TTYPE
 from netmiko.cisco_base_connection import CiscoBaseConnection
 
@@ -34,7 +33,7 @@ class IpInfusionOcNOSBase(CiscoBaseConnection):
     def __init__(self, *args, **kwargs):
         if kwargs.get(&#34;default_enter&#34;) is None:
             kwargs[&#34;default_enter&#34;] = &#34;\r&#34;
-        return super(IpInfusionOcNOSBase, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         self._test_channel_read()
@@ -47,7 +46,7 @@ class IpInfusionOcNOSBase(CiscoBaseConnection):
 
     def save_config(self, cmd=&#34;write&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config Using write command&#34;&#34;&#34;
-        return super(IpInfusionOcNOSBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -86,7 +85,7 @@ class IpInfusionOcNOSTelnet(IpInfusionOcNOSBase):
     ):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(IpInfusionOcNOSTelnet, self).telnet_login(
+        return super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
@@ -227,6 +226,10 @@ class IpInfusionOcNOSTelnet(IpInfusionOcNOSBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -236,7 +239,7 @@ class IpInfusionOcNOSTelnet(IpInfusionOcNOSBase):
     def __init__(self, *args, **kwargs):
         if kwargs.get(&#34;default_enter&#34;) is None:
             kwargs[&#34;default_enter&#34;] = &#34;\r&#34;
-        return super(IpInfusionOcNOSBase, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         self._test_channel_read()
@@ -249,7 +252,7 @@ class IpInfusionOcNOSTelnet(IpInfusionOcNOSBase):
 
     def save_config(self, cmd=&#34;write&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves Config Using write command&#34;&#34;&#34;
-        return super(IpInfusionOcNOSBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -274,7 +277,7 @@ class IpInfusionOcNOSTelnet(IpInfusionOcNOSBase):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves Config Using write command&#34;&#34;&#34;
-    return super(IpInfusionOcNOSBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -449,6 +452,10 @@ class IpInfusionOcNOSTelnet(IpInfusionOcNOSBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -634,6 +641,10 @@ Telnet driver.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -665,7 +676,7 @@ Telnet driver.</p>
     ):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(IpInfusionOcNOSTelnet, self).telnet_login(
+        return super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
@@ -762,7 +773,7 @@ Telnet driver.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/juniper/index.html b/docs/netmiko/juniper/index.html
index 80a9e9f9221f341c5fe4939c7cb44186fc448ea9..76e7e2bd1d9af5d4738090879a014131bef3ac0b 100644
--- a/docs/netmiko/juniper/index.html
+++ b/docs/netmiko/juniper/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.juniper API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,10 +22,10 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.juniper.juniper import JuniperSSH, JuniperTelnet, JuniperFileTransfer
+<pre><code class="python">from netmiko.juniper.juniper import JuniperSSH, JuniperTelnet, JuniperFileTransfer
+from netmiko.juniper.juniper_screenos import JuniperScreenOsSSH
 
-__all__ = [&#34;JuniperSSH&#34;, &#34;JuniperTelnet&#34;, &#34;JuniperFileTransfer&#34;]</code></pre>
+__all__ = [&#34;JuniperSSH&#34;, &#34;JuniperTelnet&#34;, &#34;JuniperFileTransfer&#34;, &#34;JuniperScreenOsSSH&#34;]</code></pre>
 </details>
 </section>
 <section>
@@ -35,6 +35,10 @@ __all__ = [&#34;JuniperSSH&#34;, &#34;JuniperTelnet&#34;, &#34;JuniperFileTransf
 <dd>
 <section class="desc"></section>
 </dd>
+<dt><code class="name"><a title="netmiko.juniper.juniper_screenos" href="juniper_screenos.html">netmiko.juniper.juniper_screenos</a></code></dt>
+<dd>
+<section class="desc"></section>
+</dd>
 </dl>
 </section>
 <section>
@@ -46,7 +50,7 @@ __all__ = [&#34;JuniperSSH&#34;, &#34;JuniperTelnet&#34;, &#34;JuniperFileTransf
 <dl>
 <dt id="netmiko.juniper.JuniperFileTransfer"><code class="flex name class">
 <span>class <span class="ident">JuniperFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Juniper SCP File Transfer driver.</p></section>
@@ -56,14 +60,21 @@ __all__ = [&#34;JuniperSSH&#34;, &#34;JuniperTelnet&#34;, &#34;JuniperFileTransf
     &#34;&#34;&#34;Juniper SCP File Transfer driver.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=&#34;/var/tmp&#34;, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/var/tmp&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(JuniperFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -81,9 +92,7 @@ __all__ = [&#34;JuniperSSH&#34;, &#34;JuniperTelnet&#34;, &#34;JuniperFileTransf
         )
 
     def remote_md5(self, base_cmd=&#34;file checksum md5&#34;, remote_file=None):
-        return super(JuniperFileTransfer, self).remote_md5(
-            base_cmd=base_cmd, remote_file=remote_file
-        )
+        return super().remote_md5(base_cmd=base_cmd, remote_file=remote_file)
 
     def enable_scp(self, cmd=None):
         raise NotImplementedError
@@ -122,7 +131,7 @@ __all__ = [&#34;JuniperSSH&#34;, &#34;JuniperTelnet&#34;, &#34;JuniperFileTransf
 </dd>
 <dt id="netmiko.juniper.JuniperSSH"><code class="flex name class">
 <span>class <span class="ident">JuniperSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with Juniper Networks devices.</p>
@@ -245,6 +254,10 @@ Overrides several methods for Juniper-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -306,6 +319,337 @@ Overrides several methods for Juniper-specific compatibility.</p>
 </li>
 </ul>
 </dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH"><code class="flex name class">
+<span>class <span class="ident">JuniperScreenOsSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Implement methods for interacting with Juniper ScreenOS devices.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class JuniperScreenOsSSH(BaseConnection):
+    &#34;&#34;&#34;
+    Implement methods for interacting with Juniper ScreenOS devices.
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        &#34;&#34;&#34;
+        Prepare the session after the connection has been established.
+
+        Disable paging (the &#39;--more--&#39; prompts).
+        Set the base prompt for interaction (&#39;&gt;&#39;).
+        &#34;&#34;&#34;
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;set console page 0&#34;)
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return True
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return False
+
+    def config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
+        &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
+        return self.send_command(command_string=cmd)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.check_config_mode"><code class="name flex">
+<span>def <span class="ident">check_config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No configuration mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return False</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.check_enable_mode"><code class="name flex">
+<span>def <span class="ident">check_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return True</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.config_mode"><code class="name flex">
+<span>def <span class="ident">config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No configuration mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.enable"><code class="name flex">
+<span>def <span class="ident">enable</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def enable(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.exit_config_mode"><code class="name flex">
+<span>def <span class="ident">exit_config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No configuration mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.exit_enable_mode"><code class="name flex">
+<span>def <span class="ident">exit_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, cmd='save config', confirm=False, confirm_response='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Save Config.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
+    &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
+    return self.send_command(command_string=cmd)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.JuniperScreenOsSSH.session_preparation"><code class="name flex">
+<span>def <span class="ident">session_preparation</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Prepare the session after the connection has been established.</p>
+<p>Disable paging (the '&ndash;more&ndash;' prompts).
+Set the base prompt for interaction ('&gt;').</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def session_preparation(self):
+    &#34;&#34;&#34;
+    Prepare the session after the connection has been established.
+
+    Disable paging (the &#39;--more--&#39; prompts).
+    Set the base prompt for interaction (&#39;&gt;&#39;).
+    &#34;&#34;&#34;
+    self._test_channel_read()
+    self.set_base_prompt()
+    self.disable_paging(command=&#34;set console page 0&#34;)
+    # Clear the read buffer
+    time.sleep(0.3 * self.global_delay_factor)
+    self.clear_buffer()</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.base_connection.BaseConnection.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
 <dt id="netmiko.juniper.JuniperTelnet"><code class="flex name class">
 <span>class <span class="ident">JuniperTelnet</span></span>
 <span>(</span><span>*args, **kwargs)</span>
@@ -431,6 +775,10 @@ Overrides several methods for Juniper-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -438,7 +786,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(JuniperTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -512,6 +860,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
 <li><h3><a href="#header-submodules">Sub-modules</a></h3>
 <ul>
 <li><code><a title="netmiko.juniper.juniper" href="juniper.html">netmiko.juniper.juniper</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos" href="juniper_screenos.html">netmiko.juniper.juniper_screenos</a></code></li>
 </ul>
 </li>
 <li><h3><a href="#header-classes">Classes</a></h3>
@@ -523,6 +872,19 @@ Overrides several methods for Juniper-specific compatibility.</p>
 <h4><code><a title="netmiko.juniper.JuniperSSH" href="#netmiko.juniper.JuniperSSH">JuniperSSH</a></code></h4>
 </li>
 <li>
+<h4><code><a title="netmiko.juniper.JuniperScreenOsSSH" href="#netmiko.juniper.JuniperScreenOsSSH">JuniperScreenOsSSH</a></code></h4>
+<ul class="two-column">
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.check_config_mode" href="#netmiko.juniper.JuniperScreenOsSSH.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.check_enable_mode" href="#netmiko.juniper.JuniperScreenOsSSH.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.config_mode" href="#netmiko.juniper.JuniperScreenOsSSH.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.enable" href="#netmiko.juniper.JuniperScreenOsSSH.enable">enable</a></code></li>
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.exit_config_mode" href="#netmiko.juniper.JuniperScreenOsSSH.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.exit_enable_mode" href="#netmiko.juniper.JuniperScreenOsSSH.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.save_config" href="#netmiko.juniper.JuniperScreenOsSSH.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.juniper.JuniperScreenOsSSH.session_preparation" href="#netmiko.juniper.JuniperScreenOsSSH.session_preparation">session_preparation</a></code></li>
+</ul>
+</li>
+<li>
 <h4><code><a title="netmiko.juniper.JuniperTelnet" href="#netmiko.juniper.JuniperTelnet">JuniperTelnet</a></code></h4>
 </li>
 </ul>
@@ -531,7 +893,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/juniper/juniper.html b/docs/netmiko/juniper/juniper.html
index 70c683552c061c11bd333b742d29d958823ed24d..05876cf77e9798fa646663109e8be4bdc88a3cf5 100644
--- a/docs/netmiko/juniper/juniper.html
+++ b/docs/netmiko/juniper/juniper.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.juniper.juniper API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,14 +22,11 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-import re
+<pre><code class="python">import re
 import time
 
 from netmiko.base_connection import BaseConnection
 from netmiko.scp_handler import BaseFileTransfer
-from netmiko.py23_compat import text_type
 
 
 class JuniperBase(BaseConnection):
@@ -50,6 +47,7 @@ class JuniperBase(BaseConnection):
         self._test_channel_read()
         self.enter_cli_mode()
         self.set_base_prompt()
+        self._disable_complete_on_space()
         self.disable_paging(command=&#34;set cli screen-length 0&#34;)
         self.set_terminal_width(command=&#34;set cli screen-width 511&#34;)
         # Clear the read buffer
@@ -64,6 +62,21 @@ class JuniperBase(BaseConnection):
         &#34;&#34;&#34;Return to the Juniper CLI.&#34;&#34;&#34;
         return self.send_command(&#34;exit&#34;, expect_string=r&#34;[#&gt;]&#34;)
 
+    def _disable_complete_on_space(self):
+        &#34;&#34;&#34;
+        Juniper tries to auto complete commands when you type a &#34;space&#34; character.
+
+        This is a bad idea for automation as what your program is sending no longer matches
+        the command echo from the device. So we disable this behavior.
+        &#34;&#34;&#34;
+        delay_factor = self.select_delay_factor(delay_factor=0)
+        time.sleep(delay_factor * 0.1)
+        command = &#34;set cli complete-on-space off&#34;
+        self.write_channel(self.normalize_cmd(command))
+        time.sleep(delay_factor * 0.1)
+        output = self.read_channel()
+        return output
+
     def enter_cli_mode(self):
         &#34;&#34;&#34;Check if at shell prompt root@ and go into CLI.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor=0)
@@ -96,11 +109,11 @@ class JuniperBase(BaseConnection):
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(JuniperBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(JuniperBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit configuration-mode&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
@@ -166,7 +179,7 @@ class JuniperBase(BaseConnection):
             commit_marker = &#34;configuration check succeeds&#34;
         elif confirm:
             if confirm_delay:
-                command_string = &#34;commit confirmed &#34; + text_type(confirm_delay)
+                command_string = &#34;commit confirmed &#34; + str(confirm_delay)
             else:
                 command_string = &#34;commit confirmed&#34;
             commit_marker = &#34;commit confirmed will be automatically rolled back in&#34;
@@ -175,7 +188,7 @@ class JuniperBase(BaseConnection):
         if comment:
             if &#39;&#34;&#39; in comment:
                 raise ValueError(&#34;Invalid comment contains double quote&#34;)
-            comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+            comment = f&#39;&#34;{comment}&#34;&#39;
             command_string += &#34; comment &#34; + comment
 
         if and_quit:
@@ -202,15 +215,13 @@ class JuniperBase(BaseConnection):
             )
 
         if commit_marker not in output:
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
         return output
 
     def strip_prompt(self, *args, **kwargs):
         &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-        a_string = super(JuniperBase, self).strip_prompt(*args, **kwargs)
+        a_string = super().strip_prompt(*args, **kwargs)
         return self.strip_context_items(a_string)
 
     def strip_context_items(self, a_string):
@@ -250,21 +261,28 @@ class JuniperTelnet(JuniperBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(JuniperTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
 
 class JuniperFileTransfer(BaseFileTransfer):
     &#34;&#34;&#34;Juniper SCP File Transfer driver.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=&#34;/var/tmp&#34;, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/var/tmp&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(JuniperFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -282,9 +300,7 @@ class JuniperFileTransfer(BaseFileTransfer):
         )
 
     def remote_md5(self, base_cmd=&#34;file checksum md5&#34;, remote_file=None):
-        return super(JuniperFileTransfer, self).remote_md5(
-            base_cmd=base_cmd, remote_file=remote_file
-        )
+        return super().remote_md5(base_cmd=base_cmd, remote_file=remote_file)
 
     def enable_scp(self, cmd=None):
         raise NotImplementedError
@@ -304,7 +320,7 @@ class JuniperFileTransfer(BaseFileTransfer):
 <dl>
 <dt id="netmiko.juniper.juniper.JuniperBase"><code class="flex name class">
 <span>class <span class="ident">JuniperBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with Juniper Networks devices.</p>
@@ -427,6 +443,10 @@ Overrides several methods for Juniper-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -448,6 +468,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
         self._test_channel_read()
         self.enter_cli_mode()
         self.set_base_prompt()
+        self._disable_complete_on_space()
         self.disable_paging(command=&#34;set cli screen-length 0&#34;)
         self.set_terminal_width(command=&#34;set cli screen-width 511&#34;)
         # Clear the read buffer
@@ -462,6 +483,21 @@ Overrides several methods for Juniper-specific compatibility.</p>
         &#34;&#34;&#34;Return to the Juniper CLI.&#34;&#34;&#34;
         return self.send_command(&#34;exit&#34;, expect_string=r&#34;[#&gt;]&#34;)
 
+    def _disable_complete_on_space(self):
+        &#34;&#34;&#34;
+        Juniper tries to auto complete commands when you type a &#34;space&#34; character.
+
+        This is a bad idea for automation as what your program is sending no longer matches
+        the command echo from the device. So we disable this behavior.
+        &#34;&#34;&#34;
+        delay_factor = self.select_delay_factor(delay_factor=0)
+        time.sleep(delay_factor * 0.1)
+        command = &#34;set cli complete-on-space off&#34;
+        self.write_channel(self.normalize_cmd(command))
+        time.sleep(delay_factor * 0.1)
+        output = self.read_channel()
+        return output
+
     def enter_cli_mode(self):
         &#34;&#34;&#34;Check if at shell prompt root@ and go into CLI.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor=0)
@@ -494,11 +530,11 @@ Overrides several methods for Juniper-specific compatibility.</p>
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(JuniperBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(JuniperBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit configuration-mode&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
@@ -564,7 +600,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
             commit_marker = &#34;configuration check succeeds&#34;
         elif confirm:
             if confirm_delay:
-                command_string = &#34;commit confirmed &#34; + text_type(confirm_delay)
+                command_string = &#34;commit confirmed &#34; + str(confirm_delay)
             else:
                 command_string = &#34;commit confirmed&#34;
             commit_marker = &#34;commit confirmed will be automatically rolled back in&#34;
@@ -573,7 +609,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
         if comment:
             if &#39;&#34;&#39; in comment:
                 raise ValueError(&#34;Invalid comment contains double quote&#34;)
-            comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+            comment = f&#39;&#34;{comment}&#34;&#39;
             command_string += &#34; comment &#34; + comment
 
         if and_quit:
@@ -600,15 +636,13 @@ Overrides several methods for Juniper-specific compatibility.</p>
             )
 
         if commit_marker not in output:
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
         return output
 
     def strip_prompt(self, *args, **kwargs):
         &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-        a_string = super(JuniperBase, self).strip_prompt(*args, **kwargs)
+        a_string = super().strip_prompt(*args, **kwargs)
         return self.strip_context_items(a_string)
 
     def strip_context_items(self, a_string):
@@ -659,7 +693,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;]&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(JuniperBase, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.juniper.juniper.JuniperBase.check_enable_mode"><code class="name flex">
@@ -745,7 +779,7 @@ command_string = commit check</p></section>
         commit_marker = &#34;configuration check succeeds&#34;
     elif confirm:
         if confirm_delay:
-            command_string = &#34;commit confirmed &#34; + text_type(confirm_delay)
+            command_string = &#34;commit confirmed &#34; + str(confirm_delay)
         else:
             command_string = &#34;commit confirmed&#34;
         commit_marker = &#34;commit confirmed will be automatically rolled back in&#34;
@@ -754,7 +788,7 @@ command_string = commit check</p></section>
     if comment:
         if &#39;&#34;&#39; in comment:
             raise ValueError(&#34;Invalid comment contains double quote&#34;)
-        comment = &#39;&#34;{0}&#34;&#39;.format(comment)
+        comment = f&#39;&#34;{comment}&#34;&#39;
         command_string += &#34; comment &#34; + comment
 
     if and_quit:
@@ -781,9 +815,7 @@ command_string = commit check</p></section>
         )
 
     if commit_marker not in output:
-        raise ValueError(
-            &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
 
     return output</code></pre>
 </details>
@@ -797,7 +829,7 @@ command_string = commit check</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(JuniperBase, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.juniper.juniper.JuniperBase.enable"><code class="name flex">
@@ -892,6 +924,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
     self._test_channel_read()
     self.enter_cli_mode()
     self.set_base_prompt()
+    self._disable_complete_on_space()
     self.disable_paging(command=&#34;set cli screen-length 0&#34;)
     self.set_terminal_width(command=&#34;set cli screen-width 511&#34;)
     # Clear the read buffer
@@ -949,7 +982,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def strip_prompt(self, *args, **kwargs):
     &#34;&#34;&#34;Strip the trailing router prompt from the output.&#34;&#34;&#34;
-    a_string = super(JuniperBase, self).strip_prompt(*args, **kwargs)
+    a_string = super().strip_prompt(*args, **kwargs)
     return self.strip_context_items(a_string)</code></pre>
 </details>
 </dd>
@@ -995,7 +1028,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 </dd>
 <dt id="netmiko.juniper.juniper.JuniperFileTransfer"><code class="flex name class">
 <span>class <span class="ident">JuniperFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Juniper SCP File Transfer driver.</p></section>
@@ -1005,14 +1038,21 @@ Set the base prompt for interaction ('&gt;').</p></section>
     &#34;&#34;&#34;Juniper SCP File Transfer driver.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=&#34;/var/tmp&#34;, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/var/tmp&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(JuniperFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -1030,9 +1070,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
         )
 
     def remote_md5(self, base_cmd=&#34;file checksum md5&#34;, remote_file=None):
-        return super(JuniperFileTransfer, self).remote_md5(
-            base_cmd=base_cmd, remote_file=remote_file
-        )
+        return super().remote_md5(base_cmd=base_cmd, remote_file=remote_file)
 
     def enable_scp(self, cmd=None):
         raise NotImplementedError
@@ -1071,7 +1109,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 </dd>
 <dt id="netmiko.juniper.juniper.JuniperSSH"><code class="flex name class">
 <span>class <span class="ident">JuniperSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with Juniper Networks devices.</p>
@@ -1194,6 +1232,10 @@ Overrides several methods for Juniper-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1380,6 +1422,10 @@ Overrides several methods for Juniper-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1387,7 +1433,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(JuniperTelnet, self).__init__(*args, **kwargs)</code></pre>
+        super().__init__(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -1491,7 +1537,7 @@ Overrides several methods for Juniper-specific compatibility.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/juniper/juniper_screenos.html b/docs/netmiko/juniper/juniper_screenos.html
new file mode 100644
index 0000000000000000000000000000000000000000..193a9fb4442bf76af399ed6a5f289a6fc9e26256
--- /dev/null
+++ b/docs/netmiko/juniper/juniper_screenos.html
@@ -0,0 +1,457 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.6.3" />
+<title>netmiko.juniper.juniper_screenos API documentation</title>
+<meta name="description" content="" />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>netmiko.juniper.juniper_screenos</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">import time
+from netmiko.base_connection import BaseConnection
+
+
+class JuniperScreenOsSSH(BaseConnection):
+    &#34;&#34;&#34;
+    Implement methods for interacting with Juniper ScreenOS devices.
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        &#34;&#34;&#34;
+        Prepare the session after the connection has been established.
+
+        Disable paging (the &#39;--more--&#39; prompts).
+        Set the base prompt for interaction (&#39;&gt;&#39;).
+        &#34;&#34;&#34;
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;set console page 0&#34;)
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return True
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return False
+
+    def config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
+        &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
+        return self.send_command(command_string=cmd)</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH"><code class="flex name class">
+<span>class <span class="ident">JuniperScreenOsSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Implement methods for interacting with Juniper ScreenOS devices.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class JuniperScreenOsSSH(BaseConnection):
+    &#34;&#34;&#34;
+    Implement methods for interacting with Juniper ScreenOS devices.
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        &#34;&#34;&#34;
+        Prepare the session after the connection has been established.
+
+        Disable paging (the &#39;--more--&#39; prompts).
+        Set the base prompt for interaction (&#39;&gt;&#39;).
+        &#34;&#34;&#34;
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command=&#34;set console page 0&#34;)
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return True
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return False
+
+    def config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def exit_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
+        &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
+        return self.send_command(command_string=cmd)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.check_config_mode"><code class="name flex">
+<span>def <span class="ident">check_config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No configuration mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return False</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.check_enable_mode"><code class="name flex">
+<span>def <span class="ident">check_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return True</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.config_mode"><code class="name flex">
+<span>def <span class="ident">config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No configuration mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.enable"><code class="name flex">
+<span>def <span class="ident">enable</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def enable(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.exit_config_mode"><code class="name flex">
+<span>def <span class="ident">exit_config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No configuration mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No configuration mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.exit_enable_mode"><code class="name flex">
+<span>def <span class="ident">exit_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>No enable mode on Juniper ScreenOS.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;No enable mode on Juniper ScreenOS.&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, cmd='save config', confirm=False, confirm_response='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Save Config.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, cmd=&#34;save config&#34;, confirm=False, confirm_response=&#34;&#34;):
+    &#34;&#34;&#34;Save Config.&#34;&#34;&#34;
+    return self.send_command(command_string=cmd)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.session_preparation"><code class="name flex">
+<span>def <span class="ident">session_preparation</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Prepare the session after the connection has been established.</p>
+<p>Disable paging (the '&ndash;more&ndash;' prompts).
+Set the base prompt for interaction ('&gt;').</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def session_preparation(self):
+    &#34;&#34;&#34;
+    Prepare the session after the connection has been established.
+
+    Disable paging (the &#39;--more--&#39; prompts).
+    Set the base prompt for interaction (&#39;&gt;&#39;).
+    &#34;&#34;&#34;
+    self._test_channel_read()
+    self.set_base_prompt()
+    self.disable_paging(command=&#34;set console page 0&#34;)
+    # Clear the read buffer
+    time.sleep(0.3 * self.global_delay_factor)
+    self.clear_buffer()</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.base_connection.BaseConnection.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="netmiko.juniper" href="index.html">netmiko.juniper</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH">JuniperScreenOsSSH</a></code></h4>
+<ul class="two-column">
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.check_config_mode" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.check_enable_mode" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.config_mode" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.enable" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.enable">enable</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.exit_config_mode" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.exit_enable_mode" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.save_config" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.session_preparation" href="#netmiko.juniper.juniper_screenos.JuniperScreenOsSSH.session_preparation">session_preparation</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/netmiko/keymile/index.html b/docs/netmiko/keymile/index.html
index 85b3233c97170776681432858c76c5f7d2488045..50645e78b4f5fd4bc1dd90da952683b7cb11cc15 100644
--- a/docs/netmiko/keymile/index.html
+++ b/docs/netmiko/keymile/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.keymile API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.keymile.keymile_ssh import KeymileSSH
+<pre><code class="python">from netmiko.keymile.keymile_ssh import KeymileSSH
 from netmiko.keymile.keymile_nos_ssh import KeymileNOSSSH
 
 __all__ = [&#34;KeymileSSH&#34;, &#34;KeymileNOSSSH&#34;]</code></pre>
@@ -51,7 +50,7 @@ __all__ = [&#34;KeymileSSH&#34;, &#34;KeymileNOSSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.keymile.KeymileNOSSSH"><code class="flex name class">
 <span>class <span class="ident">KeymileNOSSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Common Methods for IOS (both SSH and telnet).</p>
@@ -171,6 +170,10 @@ __all__ = [&#34;KeymileSSH&#34;, &#34;KeymileNOSSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -185,18 +188,14 @@ __all__ = [&#34;KeymileSSH&#34;, &#34;KeymileNOSSSH&#34;]</code></pre>
     def _test_channel_read(self, count=40, pattern=&#34;&#34;):
         &#34;&#34;&#34;Since Keymile NOS always returns True on paramiko.connect() we
         check the output for substring Login incorrect after connecting.&#34;&#34;&#34;
-        output = super(KeymileNOSSSH, self)._test_channel_read(
-            count=count, pattern=pattern
-        )
+        output = super()._test_channel_read(count=count, pattern=pattern)
         pattern = r&#34;Login incorrect&#34;
         if re.search(pattern, output):
             self.paramiko_cleanup()
             msg = &#34;Authentication failure: unable to connect&#34;
-            msg += &#34;{device_type} {host}:{port}&#34;.format(
-                device_type=self.device_type, host=self.host, port=self.port
-            )
+            msg += f&#34;{self.device_type} {self.host}:{self.port}&#34;
             msg += self.RESPONSE_RETURN + &#34;Login incorrect&#34;
-            raise NetMikoAuthenticationException(msg)
+            raise NetmikoAuthenticationException(msg)
         else:
             return output
 
@@ -397,13 +396,17 @@ check the output for substring Login incorrect after connecting.</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class KeymileSSH(CiscoIosBase):
     def __init__(self, **kwargs):
         kwargs.setdefault(&#34;default_enter&#34;, &#34;\r\n&#34;)
-        return super(KeymileSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -444,13 +447,11 @@ check the output for substring Login incorrect after connecting.</p></section>
         &#34;&#34;&#34;Remove appending empty line and prompt from output&#34;&#34;&#34;
         self._write_session_log(a_string)
         a_string = a_string[:-1]
-        return super(KeymileSSH, self).strip_prompt(a_string=a_string)
+        return super().strip_prompt(a_string=a_string)
 
     def set_base_prompt(self, pri_prompt_terminator=&#34;&gt;&#34;, **kwargs):
         &#34;&#34;&#34; set prompt termination  to &gt;&#34;&#34;&#34;
-        return super(KeymileSSH, self).set_base_prompt(
-            pri_prompt_terminator=pri_prompt_terminator
-        )</code></pre>
+        return super().set_base_prompt(pri_prompt_terminator=pri_prompt_terminator)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -554,9 +555,7 @@ to &gt;</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def set_base_prompt(self, pri_prompt_terminator=&#34;&gt;&#34;, **kwargs):
     &#34;&#34;&#34; set prompt termination  to &gt;&#34;&#34;&#34;
-    return super(KeymileSSH, self).set_base_prompt(
-        pri_prompt_terminator=pri_prompt_terminator
-    )</code></pre>
+    return super().set_base_prompt(pri_prompt_terminator=pri_prompt_terminator)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.keymile.KeymileSSH.strip_prompt"><code class="name flex">
@@ -570,7 +569,7 @@ to &gt;</p></section>
     &#34;&#34;&#34;Remove appending empty line and prompt from output&#34;&#34;&#34;
     self._write_session_log(a_string)
     a_string = a_string[:-1]
-    return super(KeymileSSH, self).strip_prompt(a_string=a_string)</code></pre>
+    return super().strip_prompt(a_string=a_string)</code></pre>
 </details>
 </dd>
 </dl>
@@ -661,7 +660,7 @@ to &gt;</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/keymile/keymile_nos_ssh.html b/docs/netmiko/keymile/keymile_nos_ssh.html
index ff5ab3a839046bd31771164d10c4bfa162013ef9..28abd11eedbf302394dcccbb002b51ea531b0e9d 100644
--- a/docs/netmiko/keymile/keymile_nos_ssh.html
+++ b/docs/netmiko/keymile/keymile_nos_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.keymile.keymile_nos_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -27,7 +27,7 @@ import re
 
 
 from netmiko.cisco.cisco_ios import CiscoIosBase
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 
 
 class KeymileNOSSSH(CiscoIosBase):
@@ -41,18 +41,14 @@ class KeymileNOSSSH(CiscoIosBase):
     def _test_channel_read(self, count=40, pattern=&#34;&#34;):
         &#34;&#34;&#34;Since Keymile NOS always returns True on paramiko.connect() we
         check the output for substring Login incorrect after connecting.&#34;&#34;&#34;
-        output = super(KeymileNOSSSH, self)._test_channel_read(
-            count=count, pattern=pattern
-        )
+        output = super()._test_channel_read(count=count, pattern=pattern)
         pattern = r&#34;Login incorrect&#34;
         if re.search(pattern, output):
             self.paramiko_cleanup()
             msg = &#34;Authentication failure: unable to connect&#34;
-            msg += &#34;{device_type} {host}:{port}&#34;.format(
-                device_type=self.device_type, host=self.host, port=self.port
-            )
+            msg += f&#34;{self.device_type} {self.host}:{self.port}&#34;
             msg += self.RESPONSE_RETURN + &#34;Login incorrect&#34;
-            raise NetMikoAuthenticationException(msg)
+            raise NetmikoAuthenticationException(msg)
         else:
             return output
 
@@ -73,7 +69,7 @@ class KeymileNOSSSH(CiscoIosBase):
 <dl>
 <dt id="netmiko.keymile.keymile_nos_ssh.KeymileNOSSSH"><code class="flex name class">
 <span>class <span class="ident">KeymileNOSSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Common Methods for IOS (both SSH and telnet).</p>
@@ -193,6 +189,10 @@ class KeymileNOSSSH(CiscoIosBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -207,18 +207,14 @@ class KeymileNOSSSH(CiscoIosBase):
     def _test_channel_read(self, count=40, pattern=&#34;&#34;):
         &#34;&#34;&#34;Since Keymile NOS always returns True on paramiko.connect() we
         check the output for substring Login incorrect after connecting.&#34;&#34;&#34;
-        output = super(KeymileNOSSSH, self)._test_channel_read(
-            count=count, pattern=pattern
-        )
+        output = super()._test_channel_read(count=count, pattern=pattern)
         pattern = r&#34;Login incorrect&#34;
         if re.search(pattern, output):
             self.paramiko_cleanup()
             msg = &#34;Authentication failure: unable to connect&#34;
-            msg += &#34;{device_type} {host}:{port}&#34;.format(
-                device_type=self.device_type, host=self.host, port=self.port
-            )
+            msg += f&#34;{self.device_type} {self.host}:{self.port}&#34;
             msg += self.RESPONSE_RETURN + &#34;Login incorrect&#34;
-            raise NetMikoAuthenticationException(msg)
+            raise NetmikoAuthenticationException(msg)
         else:
             return output
 
@@ -325,7 +321,7 @@ check the output for substring Login incorrect after connecting.</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/keymile/keymile_ssh.html b/docs/netmiko/keymile/keymile_ssh.html
index b663494b4fc658123b7768ef11c67384c2498cda..9aae4c72caf348a3379a31c591cfe2bdda1184a2 100644
--- a/docs/netmiko/keymile/keymile_ssh.html
+++ b/docs/netmiko/keymile/keymile_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.keymile.keymile_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -30,7 +30,7 @@ from netmiko.cisco.cisco_ios import CiscoIosBase
 class KeymileSSH(CiscoIosBase):
     def __init__(self, **kwargs):
         kwargs.setdefault(&#34;default_enter&#34;, &#34;\r\n&#34;)
-        return super(KeymileSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -71,13 +71,11 @@ class KeymileSSH(CiscoIosBase):
         &#34;&#34;&#34;Remove appending empty line and prompt from output&#34;&#34;&#34;
         self._write_session_log(a_string)
         a_string = a_string[:-1]
-        return super(KeymileSSH, self).strip_prompt(a_string=a_string)
+        return super().strip_prompt(a_string=a_string)
 
     def set_base_prompt(self, pri_prompt_terminator=&#34;&gt;&#34;, **kwargs):
         &#34;&#34;&#34; set prompt termination  to &gt;&#34;&#34;&#34;
-        return super(KeymileSSH, self).set_base_prompt(
-            pri_prompt_terminator=pri_prompt_terminator
-        )</code></pre>
+        return super().set_base_prompt(pri_prompt_terminator=pri_prompt_terminator)</code></pre>
 </details>
 </section>
 <section>
@@ -211,13 +209,17 @@ class KeymileSSH(CiscoIosBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class KeymileSSH(CiscoIosBase):
     def __init__(self, **kwargs):
         kwargs.setdefault(&#34;default_enter&#34;, &#34;\r\n&#34;)
-        return super(KeymileSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -258,13 +260,11 @@ class KeymileSSH(CiscoIosBase):
         &#34;&#34;&#34;Remove appending empty line and prompt from output&#34;&#34;&#34;
         self._write_session_log(a_string)
         a_string = a_string[:-1]
-        return super(KeymileSSH, self).strip_prompt(a_string=a_string)
+        return super().strip_prompt(a_string=a_string)
 
     def set_base_prompt(self, pri_prompt_terminator=&#34;&gt;&#34;, **kwargs):
         &#34;&#34;&#34; set prompt termination  to &gt;&#34;&#34;&#34;
-        return super(KeymileSSH, self).set_base_prompt(
-            pri_prompt_terminator=pri_prompt_terminator
-        )</code></pre>
+        return super().set_base_prompt(pri_prompt_terminator=pri_prompt_terminator)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -368,9 +368,7 @@ to &gt;</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def set_base_prompt(self, pri_prompt_terminator=&#34;&gt;&#34;, **kwargs):
     &#34;&#34;&#34; set prompt termination  to &gt;&#34;&#34;&#34;
-    return super(KeymileSSH, self).set_base_prompt(
-        pri_prompt_terminator=pri_prompt_terminator
-    )</code></pre>
+    return super().set_base_prompt(pri_prompt_terminator=pri_prompt_terminator)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.keymile.keymile_ssh.KeymileSSH.strip_prompt"><code class="name flex">
@@ -384,7 +382,7 @@ to &gt;</p></section>
     &#34;&#34;&#34;Remove appending empty line and prompt from output&#34;&#34;&#34;
     self._write_session_log(a_string)
     a_string = a_string[:-1]
-    return super(KeymileSSH, self).strip_prompt(a_string=a_string)</code></pre>
+    return super().strip_prompt(a_string=a_string)</code></pre>
 </details>
 </dd>
 </dl>
@@ -463,7 +461,7 @@ to &gt;</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/linux/index.html b/docs/netmiko/linux/index.html
index 517b4fc483b28c48fc2922ab6d28687d11afd0d3..86cefba27e116f78ebe50e1c40073244888897b5 100644
--- a/docs/netmiko/linux/index.html
+++ b/docs/netmiko/linux/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.linux API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.linux.linux_ssh import LinuxSSH, LinuxFileTransfer
+<pre><code class="python">from netmiko.linux.linux_ssh import LinuxSSH, LinuxFileTransfer
 
 __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 <dl>
 <dt id="netmiko.linux.LinuxFileTransfer"><code class="flex name class">
 <span>class <span class="ident">LinuxFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Linux SCP File Transfer driver.</p>
@@ -61,14 +60,21 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
     &#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=&#34;/var/tmp&#34;, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/var/tmp&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(LinuxFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -91,7 +97,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=2
         )
@@ -142,7 +148,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 </dd>
 <dt id="netmiko.linux.LinuxSSH"><code class="flex name class">
 <span>class <span class="ident">LinuxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -262,6 +268,10 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -269,7 +279,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
         self.ansi_escape_codes = True
-        return super(LinuxSSH, self).session_preparation()
+        return super().session_preparation()
 
     def _enter_shell(self):
         &#34;&#34;&#34;Already in shell.&#34;&#34;&#34;
@@ -290,7 +300,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
         delay_factor=1,
     ):
         &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-        return super(LinuxSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -300,7 +310,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
         &#34;&#34;&#34;Can&#39;t exit from root (if root)&#34;&#34;&#34;
         if self.username == &#34;root&#34;:
             exit_config_mode = False
-        return super(LinuxSSH, self).send_config_set(
+        return super().send_config_set(
             config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
@@ -308,7 +318,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
         &#34;&#34;&#34;Verify root&#34;&#34;&#34;
         return self.check_enable_mode(check_string=check_string)
 
-    def config_mode(self, config_command=&#34;sudo su&#34;):
+    def config_mode(self, config_command=&#34;sudo -s&#34;):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
         return self.enable(cmd=config_command)
 
@@ -317,7 +327,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 
     def check_enable_mode(self, check_string=LINUX_PROMPT_ROOT):
         &#34;&#34;&#34;Verify root&#34;&#34;&#34;
-        return super(LinuxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def exit_enable_mode(self, exit_command=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
@@ -331,7 +341,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
                 raise ValueError(&#34;Failed to exit enable mode.&#34;)
         return output
 
-    def enable(self, cmd=&#34;sudo su&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
+    def enable(self, cmd=&#34;sudo -s&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor=0)
         output = &#34;&#34;
@@ -344,7 +354,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
                     self.write_channel(self.normalize_cmd(self.secret))
                 self.set_base_prompt()
             except socket.timeout:
-                raise NetMikoTimeoutException(
+                raise NetmikoTimeoutException(
                     &#34;Timed-out reading channel, data not available.&#34;
                 )
             if not self.check_enable_mode():
@@ -398,7 +408,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def check_enable_mode(self, check_string=LINUX_PROMPT_ROOT):
     &#34;&#34;&#34;Verify root&#34;&#34;&#34;
-    return super(LinuxSSH, self).check_enable_mode(check_string=check_string)</code></pre>
+    return super().check_enable_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.linux.LinuxSSH.cleanup"><code class="name flex">
@@ -415,13 +425,13 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 </details>
 </dd>
 <dt id="netmiko.linux.LinuxSSH.config_mode"><code class="name flex">
-<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='sudo su')</span>
+<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='sudo -s')</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Attempt to become root.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def config_mode(self, config_command=&#34;sudo su&#34;):
+<pre><code class="python">def config_mode(self, config_command=&#34;sudo -s&#34;):
     &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
     return self.enable(cmd=config_command)</code></pre>
 </details>
@@ -439,13 +449,13 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 </details>
 </dd>
 <dt id="netmiko.linux.LinuxSSH.enable"><code class="name flex">
-<span>def <span class="ident">enable</span></span>(<span>self, cmd='sudo su', pattern='ssword', re_flags=<RegexFlag.IGNORECASE: 2>)</span>
+<span>def <span class="ident">enable</span></span>(<span>self, cmd='sudo -s', pattern='ssword', re_flags=<RegexFlag.IGNORECASE: 2>)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Attempt to become root.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def enable(self, cmd=&#34;sudo su&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
+<pre><code class="python">def enable(self, cmd=&#34;sudo -s&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
     &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor=0)
     output = &#34;&#34;
@@ -458,7 +468,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
                 self.write_channel(self.normalize_cmd(self.secret))
             self.set_base_prompt()
         except socket.timeout:
-            raise NetMikoTimeoutException(
+            raise NetmikoTimeoutException(
                 &#34;Timed-out reading channel, data not available.&#34;
             )
         if not self.check_enable_mode():
@@ -513,7 +523,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
     &#34;&#34;&#34;Can&#39;t exit from root (if root)&#34;&#34;&#34;
     if self.username == &#34;root&#34;:
         exit_config_mode = False
-    return super(LinuxSSH, self).send_config_set(
+    return super().send_config_set(
         config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
     )</code></pre>
 </details>
@@ -528,7 +538,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 <pre><code class="python">def session_preparation(self):
     &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
     self.ansi_escape_codes = True
-    return super(LinuxSSH, self).session_preparation()</code></pre>
+    return super().session_preparation()</code></pre>
 </details>
 </dd>
 <dt id="netmiko.linux.LinuxSSH.set_base_prompt"><code class="name flex">
@@ -545,7 +555,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
     delay_factor=1,
 ):
     &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-    return super(LinuxSSH, self).set_base_prompt(
+    return super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -636,7 +646,7 @@ __all__ = [&#34;LinuxSSH&#34;, &#34;LinuxFileTransfer&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/linux/linux_ssh.html b/docs/netmiko/linux/linux_ssh.html
index 76411e2edaa859360ecbeebc75c80d0acf337bda..e10fc0e9324cec4745057fc0576729d066a1e619 100644
--- a/docs/netmiko/linux/linux_ssh.html
+++ b/docs/netmiko/linux/linux_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.linux.linux_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,16 +22,14 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-import os
+<pre><code class="python">import os
 import re
 import socket
 import time
 
 from netmiko.cisco_base_connection import CiscoSSHConnection
 from netmiko.cisco_base_connection import CiscoFileTransfer
-from netmiko.ssh_exception import NetMikoTimeoutException
+from netmiko.ssh_exception import NetmikoTimeoutException
 
 LINUX_PROMPT_PRI = os.getenv(&#34;NETMIKO_LINUX_PROMPT_PRI&#34;, &#34;$&#34;)
 LINUX_PROMPT_ALT = os.getenv(&#34;NETMIKO_LINUX_PROMPT_ALT&#34;, &#34;#&#34;)
@@ -42,7 +40,7 @@ class LinuxSSH(CiscoSSHConnection):
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
         self.ansi_escape_codes = True
-        return super(LinuxSSH, self).session_preparation()
+        return super().session_preparation()
 
     def _enter_shell(self):
         &#34;&#34;&#34;Already in shell.&#34;&#34;&#34;
@@ -63,7 +61,7 @@ class LinuxSSH(CiscoSSHConnection):
         delay_factor=1,
     ):
         &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-        return super(LinuxSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -73,7 +71,7 @@ class LinuxSSH(CiscoSSHConnection):
         &#34;&#34;&#34;Can&#39;t exit from root (if root)&#34;&#34;&#34;
         if self.username == &#34;root&#34;:
             exit_config_mode = False
-        return super(LinuxSSH, self).send_config_set(
+        return super().send_config_set(
             config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
@@ -81,7 +79,7 @@ class LinuxSSH(CiscoSSHConnection):
         &#34;&#34;&#34;Verify root&#34;&#34;&#34;
         return self.check_enable_mode(check_string=check_string)
 
-    def config_mode(self, config_command=&#34;sudo su&#34;):
+    def config_mode(self, config_command=&#34;sudo -s&#34;):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
         return self.enable(cmd=config_command)
 
@@ -90,7 +88,7 @@ class LinuxSSH(CiscoSSHConnection):
 
     def check_enable_mode(self, check_string=LINUX_PROMPT_ROOT):
         &#34;&#34;&#34;Verify root&#34;&#34;&#34;
-        return super(LinuxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def exit_enable_mode(self, exit_command=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
@@ -104,7 +102,7 @@ class LinuxSSH(CiscoSSHConnection):
                 raise ValueError(&#34;Failed to exit enable mode.&#34;)
         return output
 
-    def enable(self, cmd=&#34;sudo su&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
+    def enable(self, cmd=&#34;sudo -s&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor=0)
         output = &#34;&#34;
@@ -117,7 +115,7 @@ class LinuxSSH(CiscoSSHConnection):
                     self.write_channel(self.normalize_cmd(self.secret))
                 self.set_base_prompt()
             except socket.timeout:
-                raise NetMikoTimeoutException(
+                raise NetmikoTimeoutException(
                     &#34;Timed-out reading channel, data not available.&#34;
                 )
             if not self.check_enable_mode():
@@ -146,14 +144,21 @@ class LinuxFileTransfer(CiscoFileTransfer):
     &#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=&#34;/var/tmp&#34;, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/var/tmp&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(LinuxFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -176,7 +181,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=2
         )
@@ -207,7 +212,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
 <dl>
 <dt id="netmiko.linux.linux_ssh.LinuxFileTransfer"><code class="flex name class">
 <span>class <span class="ident">LinuxFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system='/var/tmp', direction='put', **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Linux SCP File Transfer driver.</p>
@@ -222,14 +227,21 @@ class LinuxFileTransfer(CiscoFileTransfer):
     &#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=&#34;/var/tmp&#34;, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=&#34;/var/tmp&#34;,
+        direction=&#34;put&#34;,
+        **kwargs,
     ):
-        return super(LinuxFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=&#34;&#34;):
@@ -252,7 +264,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=2
         )
@@ -303,7 +315,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
 </dd>
 <dt id="netmiko.linux.linux_ssh.LinuxSSH"><code class="flex name class">
 <span>class <span class="ident">LinuxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -423,6 +435,10 @@ class LinuxFileTransfer(CiscoFileTransfer):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -430,7 +446,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
         self.ansi_escape_codes = True
-        return super(LinuxSSH, self).session_preparation()
+        return super().session_preparation()
 
     def _enter_shell(self):
         &#34;&#34;&#34;Already in shell.&#34;&#34;&#34;
@@ -451,7 +467,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
         delay_factor=1,
     ):
         &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-        return super(LinuxSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -461,7 +477,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
         &#34;&#34;&#34;Can&#39;t exit from root (if root)&#34;&#34;&#34;
         if self.username == &#34;root&#34;:
             exit_config_mode = False
-        return super(LinuxSSH, self).send_config_set(
+        return super().send_config_set(
             config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
@@ -469,7 +485,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
         &#34;&#34;&#34;Verify root&#34;&#34;&#34;
         return self.check_enable_mode(check_string=check_string)
 
-    def config_mode(self, config_command=&#34;sudo su&#34;):
+    def config_mode(self, config_command=&#34;sudo -s&#34;):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
         return self.enable(cmd=config_command)
 
@@ -478,7 +494,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
 
     def check_enable_mode(self, check_string=LINUX_PROMPT_ROOT):
         &#34;&#34;&#34;Verify root&#34;&#34;&#34;
-        return super(LinuxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def exit_enable_mode(self, exit_command=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
@@ -492,7 +508,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
                 raise ValueError(&#34;Failed to exit enable mode.&#34;)
         return output
 
-    def enable(self, cmd=&#34;sudo su&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
+    def enable(self, cmd=&#34;sudo -s&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
         delay_factor = self.select_delay_factor(delay_factor=0)
         output = &#34;&#34;
@@ -505,7 +521,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
                     self.write_channel(self.normalize_cmd(self.secret))
                 self.set_base_prompt()
             except socket.timeout:
-                raise NetMikoTimeoutException(
+                raise NetmikoTimeoutException(
                     &#34;Timed-out reading channel, data not available.&#34;
                 )
             if not self.check_enable_mode():
@@ -559,7 +575,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
 <summary>Source code</summary>
 <pre><code class="python">def check_enable_mode(self, check_string=LINUX_PROMPT_ROOT):
     &#34;&#34;&#34;Verify root&#34;&#34;&#34;
-    return super(LinuxSSH, self).check_enable_mode(check_string=check_string)</code></pre>
+    return super().check_enable_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.linux.linux_ssh.LinuxSSH.cleanup"><code class="name flex">
@@ -576,13 +592,13 @@ class LinuxFileTransfer(CiscoFileTransfer):
 </details>
 </dd>
 <dt id="netmiko.linux.linux_ssh.LinuxSSH.config_mode"><code class="name flex">
-<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='sudo su')</span>
+<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='sudo -s')</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Attempt to become root.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def config_mode(self, config_command=&#34;sudo su&#34;):
+<pre><code class="python">def config_mode(self, config_command=&#34;sudo -s&#34;):
     &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
     return self.enable(cmd=config_command)</code></pre>
 </details>
@@ -600,13 +616,13 @@ class LinuxFileTransfer(CiscoFileTransfer):
 </details>
 </dd>
 <dt id="netmiko.linux.linux_ssh.LinuxSSH.enable"><code class="name flex">
-<span>def <span class="ident">enable</span></span>(<span>self, cmd='sudo su', pattern='ssword', re_flags=<RegexFlag.IGNORECASE: 2>)</span>
+<span>def <span class="ident">enable</span></span>(<span>self, cmd='sudo -s', pattern='ssword', re_flags=<RegexFlag.IGNORECASE: 2>)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Attempt to become root.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def enable(self, cmd=&#34;sudo su&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
+<pre><code class="python">def enable(self, cmd=&#34;sudo -s&#34;, pattern=&#34;ssword&#34;, re_flags=re.IGNORECASE):
     &#34;&#34;&#34;Attempt to become root.&#34;&#34;&#34;
     delay_factor = self.select_delay_factor(delay_factor=0)
     output = &#34;&#34;
@@ -619,7 +635,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
                 self.write_channel(self.normalize_cmd(self.secret))
             self.set_base_prompt()
         except socket.timeout:
-            raise NetMikoTimeoutException(
+            raise NetmikoTimeoutException(
                 &#34;Timed-out reading channel, data not available.&#34;
             )
         if not self.check_enable_mode():
@@ -674,7 +690,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
     &#34;&#34;&#34;Can&#39;t exit from root (if root)&#34;&#34;&#34;
     if self.username == &#34;root&#34;:
         exit_config_mode = False
-    return super(LinuxSSH, self).send_config_set(
+    return super().send_config_set(
         config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
     )</code></pre>
 </details>
@@ -689,7 +705,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
 <pre><code class="python">def session_preparation(self):
     &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
     self.ansi_escape_codes = True
-    return super(LinuxSSH, self).session_preparation()</code></pre>
+    return super().session_preparation()</code></pre>
 </details>
 </dd>
 <dt id="netmiko.linux.linux_ssh.LinuxSSH.set_base_prompt"><code class="name flex">
@@ -706,7 +722,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
     delay_factor=1,
 ):
     &#34;&#34;&#34;Determine base prompt.&#34;&#34;&#34;
-    return super(LinuxSSH, self).set_base_prompt(
+    return super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -792,7 +808,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/mellanox/index.html b/docs/netmiko/mellanox/index.html
index ef4b3a2c0dca726ca516d36a78e5708902df6154..76af52860ba8f0cfaa45ede257d993e740e6cca6 100644
--- a/docs/netmiko/mellanox/index.html
+++ b/docs/netmiko/mellanox/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.mellanox API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.mellanox.mellanox_mlnxos_ssh import MellanoxMlnxosSSH
+<pre><code class="python">from netmiko.mellanox.mellanox_mlnxos_ssh import MellanoxMlnxosSSH
 
 __all__ = [&#34;MellanoxMlnxosSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;MellanoxMlnxosSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.mellanox.MellanoxMlnxosSSH"><code class="flex name class">
 <span>class <span class="ident">MellanoxMlnxosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Mellanox MLNX-OS Switch support.</p>
@@ -166,6 +165,10 @@ __all__ = [&#34;MellanoxMlnxosSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -185,19 +188,13 @@ __all__ = [&#34;MellanoxMlnxosSSH&#34;]</code></pre>
         return output
 
     def config_mode(self, config_command=&#34;config term&#34;, pattern=&#34;#&#34;):
-        return super(MellanoxMlnxosSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;(config&#34;, pattern=r&#34;#&#34;):
-        return super(MellanoxMlnxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def disable_paging(self, command=&#34;no cli session paging enable&#34;, delay_factor=1):
-        return super(MellanoxMlnxosSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Mellanox does not support a single command to completely exit configuration mode.
@@ -218,7 +215,7 @@ __all__ = [&#34;MellanoxMlnxosSSH&#34;]</code></pre>
         if self.check_config_mode():
             raise ValueError(&#34;Failed to exit configuration mode&#34;)
 
-        log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+        log.debug(f&#34;exit_config_mode: {output}&#34;)
         return output
 
     def save_config(
@@ -286,7 +283,7 @@ __all__ = [&#34;MellanoxMlnxosSSH&#34;]</code></pre>
     if self.check_config_mode():
         raise ValueError(&#34;Failed to exit configuration mode&#34;)
 
-    log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+    log.debug(f&#34;exit_config_mode: {output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -389,7 +386,7 @@ __all__ = [&#34;MellanoxMlnxosSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/mellanox/mellanox_mlnxos_ssh.html b/docs/netmiko/mellanox/mellanox_mlnxos_ssh.html
index 38eee1379604cd2f4b0a38af79942969eac8a2ac..be8a2533efb699425caa77ca4dd47f117ecb491e 100644
--- a/docs/netmiko/mellanox/mellanox_mlnxos_ssh.html
+++ b/docs/netmiko/mellanox/mellanox_mlnxos_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.mellanox.mellanox_mlnxos_ssh API documentation</title>
 <meta name="description" content="Mellanox MLNX-OS Switch support." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Mellanox MLNX-OS Switch support.&#34;&#34;&#34;
-from __future__ import unicode_literals
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
 from netmiko import log
@@ -46,19 +45,13 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
         return output
 
     def config_mode(self, config_command=&#34;config term&#34;, pattern=&#34;#&#34;):
-        return super(MellanoxMlnxosSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;(config&#34;, pattern=r&#34;#&#34;):
-        return super(MellanoxMlnxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def disable_paging(self, command=&#34;no cli session paging enable&#34;, delay_factor=1):
-        return super(MellanoxMlnxosSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Mellanox does not support a single command to completely exit configuration mode.
@@ -79,7 +72,7 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
         if self.check_config_mode():
             raise ValueError(&#34;Failed to exit configuration mode&#34;)
 
-        log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+        log.debug(f&#34;exit_config_mode: {output}&#34;)
         return output
 
     def save_config(
@@ -104,7 +97,7 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.mellanox.mellanox_mlnxos_ssh.MellanoxMlnxosSSH"><code class="flex name class">
 <span>class <span class="ident">MellanoxMlnxosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Mellanox MLNX-OS Switch support.</p>
@@ -224,6 +217,10 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -243,19 +240,13 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
         return output
 
     def config_mode(self, config_command=&#34;config term&#34;, pattern=&#34;#&#34;):
-        return super(MellanoxMlnxosSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;(config&#34;, pattern=r&#34;#&#34;):
-        return super(MellanoxMlnxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def disable_paging(self, command=&#34;no cli session paging enable&#34;, delay_factor=1):
-        return super(MellanoxMlnxosSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Mellanox does not support a single command to completely exit configuration mode.
@@ -276,7 +267,7 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
         if self.check_config_mode():
             raise ValueError(&#34;Failed to exit configuration mode&#34;)
 
-        log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+        log.debug(f&#34;exit_config_mode: {output}&#34;)
         return output
 
     def save_config(
@@ -344,7 +335,7 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
     if self.check_config_mode():
         raise ValueError(&#34;Failed to exit configuration mode&#34;)
 
-    log.debug(&#34;exit_config_mode: {}&#34;.format(output))
+    log.debug(f&#34;exit_config_mode: {output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -442,7 +433,7 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/mikrotik/index.html b/docs/netmiko/mikrotik/index.html
index 29874c5b7339d56de35e1f99ff01bffa2e3c9ff5..c291343af51cea3fdb72566d6d1fcc2ac0ef796b 100644
--- a/docs/netmiko/mikrotik/index.html
+++ b/docs/netmiko/mikrotik/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.mikrotik API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -166,6 +166,10 @@ __all__ = [&#34;MikrotikRouterOsSSH&#34;, &#34;MikrotikSwitchOsSSH&#34;]</code><
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -351,6 +355,10 @@ __all__ = [&#34;MikrotikRouterOsSSH&#34;, &#34;MikrotikSwitchOsSSH&#34;]</code><
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -447,7 +455,7 @@ __all__ = [&#34;MikrotikRouterOsSSH&#34;, &#34;MikrotikSwitchOsSSH&#34;]</code><
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/mikrotik/mikrotik_ssh.html b/docs/netmiko/mikrotik/mikrotik_ssh.html
index 041fead1a6492da04694433162af2fdfffd481c6..e998f7e7ea1d503d251630171b31110281b926d7 100644
--- a/docs/netmiko/mikrotik/mikrotik_ssh.html
+++ b/docs/netmiko/mikrotik/mikrotik_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.mikrotik.mikrotik_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -34,7 +34,7 @@ class MikrotikBase(CiscoSSHConnection):
 
         self._in_config_mode = False
 
-        return super(MikrotikBase, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self, *args, **kwargs):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -54,7 +54,7 @@ class MikrotikBase(CiscoSSHConnection):
         &#34;&#34;&#34;
         self.username += &#34;+cetw511h4098&#34;
 
-    def disable_paging(self):
+    def disable_paging(self, *args, **kwargs):
         &#34;&#34;&#34;Microtik does not have paging by default.&#34;&#34;&#34;
         return &#34;&#34;
 
@@ -263,6 +263,10 @@ class MikrotikSwitchOsSSH(MikrotikBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -275,7 +279,7 @@ class MikrotikSwitchOsSSH(MikrotikBase):
 
         self._in_config_mode = False
 
-        return super(MikrotikBase, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self, *args, **kwargs):
         &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
@@ -295,7 +299,7 @@ class MikrotikSwitchOsSSH(MikrotikBase):
         &#34;&#34;&#34;
         self.username += &#34;+cetw511h4098&#34;
 
-    def disable_paging(self):
+    def disable_paging(self, *args, **kwargs):
         &#34;&#34;&#34;Microtik does not have paging by default.&#34;&#34;&#34;
         return &#34;&#34;
 
@@ -411,13 +415,13 @@ class MikrotikSwitchOsSSH(MikrotikBase):
 </details>
 </dd>
 <dt id="netmiko.mikrotik.mikrotik_ssh.MikrotikBase.disable_paging"><code class="name flex">
-<span>def <span class="ident">disable_paging</span></span>(<span>self)</span>
+<span>def <span class="ident">disable_paging</span></span>(<span>self, *args, **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Microtik does not have paging by default.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def disable_paging(self):
+<pre><code class="python">def disable_paging(self, *args, **kwargs):
     &#34;&#34;&#34;Microtik does not have paging by default.&#34;&#34;&#34;
     return &#34;&#34;</code></pre>
 </details>
@@ -709,6 +713,10 @@ trim the last two lines from the output.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -894,6 +902,10 @@ trim the last two lines from the output.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1001,7 +1013,7 @@ trim the last two lines from the output.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/mrv/index.html b/docs/netmiko/mrv/index.html
index 1bee9fcb79debd2e70118e4ba12b1cc0b080830a..75f88d986349272ce3b13480ad08d28b4576e536 100644
--- a/docs/netmiko/mrv/index.html
+++ b/docs/netmiko/mrv/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.mrv API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.mrv.mrv_lx import MrvLxSSH
+<pre><code class="python">from netmiko.mrv.mrv_lx import MrvLxSSH
 from netmiko.mrv.mrv_ssh import MrvOptiswitchSSH
 
 __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
@@ -51,7 +50,7 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.mrv.MrvLxSSH"><code class="flex name class">
 <span>class <span class="ident">MrvLxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>MRV Communications Driver (LX).</p>
@@ -171,6 +170,10 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -189,15 +192,15 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 
     def check_enable_mode(self, check_string=&#34;&gt;&gt;&#34;):
         &#34;&#34;&#34;MRV has a &gt;&gt; for enable mode instead of # like Cisco&#34;&#34;&#34;
-        return super(MrvLxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;assword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Enter enable mode.&#34;&#34;&#34;
-        return super(MrvLxSSH, self).enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(MrvLxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -218,7 +221,7 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def check_enable_mode(self, check_string=&#34;&gt;&gt;&#34;):
     &#34;&#34;&#34;MRV has a &gt;&gt; for enable mode instead of # like Cisco&#34;&#34;&#34;
-    return super(MrvLxSSH, self).check_enable_mode(check_string=check_string)</code></pre>
+    return super().check_enable_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.mrv.MrvLxSSH.save_config"><code class="name flex">
@@ -230,7 +233,7 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(MrvLxSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -301,7 +304,7 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 </dd>
 <dt id="netmiko.mrv.MrvOptiswitchSSH"><code class="flex name class">
 <span>class <span class="ident">MrvOptiswitchSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>MRV Communications Driver (OptiSwitch).</p>
@@ -421,6 +424,10 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -456,7 +463,7 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 
     def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(MrvOptiswitchSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -501,7 +508,7 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(MrvOptiswitchSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -615,7 +622,7 @@ __all__ = [&#34;MrvOptiswitchSSH&#34;, &#34;MrvLxSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/mrv/mrv_lx.html b/docs/netmiko/mrv/mrv_lx.html
index ccf3a6f44f7a4dd41a2694d3baaa6b75eb03374d..f85b3ded80a4310e18ac70c4e6ab6c2d67722305 100644
--- a/docs/netmiko/mrv/mrv_lx.html
+++ b/docs/netmiko/mrv/mrv_lx.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.mrv.mrv_lx API documentation</title>
 <meta name="description" content="MRV Communications Driver (LX)." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;MRV Communications Driver (LX).&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 import re
 
@@ -46,15 +45,15 @@ class MrvLxSSH(CiscoSSHConnection):
 
     def check_enable_mode(self, check_string=&#34;&gt;&gt;&#34;):
         &#34;&#34;&#34;MRV has a &gt;&gt; for enable mode instead of # like Cisco&#34;&#34;&#34;
-        return super(MrvLxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;assword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Enter enable mode.&#34;&#34;&#34;
-        return super(MrvLxSSH, self).enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(MrvLxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -70,7 +69,7 @@ class MrvLxSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.mrv.mrv_lx.MrvLxSSH"><code class="flex name class">
 <span>class <span class="ident">MrvLxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>MRV Communications Driver (LX).</p>
@@ -190,6 +189,10 @@ class MrvLxSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -208,15 +211,15 @@ class MrvLxSSH(CiscoSSHConnection):
 
     def check_enable_mode(self, check_string=&#34;&gt;&gt;&#34;):
         &#34;&#34;&#34;MRV has a &gt;&gt; for enable mode instead of # like Cisco&#34;&#34;&#34;
-        return super(MrvLxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def enable(self, cmd=&#34;enable&#34;, pattern=&#34;assword&#34;, re_flags=re.IGNORECASE):
         &#34;&#34;&#34;Enter enable mode.&#34;&#34;&#34;
-        return super(MrvLxSSH, self).enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(MrvLxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -237,7 +240,7 @@ class MrvLxSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def check_enable_mode(self, check_string=&#34;&gt;&gt;&#34;):
     &#34;&#34;&#34;MRV has a &gt;&gt; for enable mode instead of # like Cisco&#34;&#34;&#34;
-    return super(MrvLxSSH, self).check_enable_mode(check_string=check_string)</code></pre>
+    return super().check_enable_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.mrv.mrv_lx.MrvLxSSH.save_config"><code class="name flex">
@@ -249,7 +252,7 @@ class MrvLxSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(MrvLxSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -348,7 +351,7 @@ class MrvLxSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/mrv/mrv_ssh.html b/docs/netmiko/mrv/mrv_ssh.html
index d6833cce13007de918ddf43cb415faf65fcf9257..af5bea68ad8035a4dd68ae1182fe35c91ccf30c0 100644
--- a/docs/netmiko/mrv/mrv_ssh.html
+++ b/docs/netmiko/mrv/mrv_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.mrv.mrv_ssh API documentation</title>
 <meta name="description" content="MRV Communications Driver (OptiSwitch)." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;MRV Communications Driver (OptiSwitch).&#34;&#34;&#34;
-from __future__ import unicode_literals
 import time
 import re
 
@@ -63,7 +62,7 @@ class MrvOptiswitchSSH(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(MrvOptiswitchSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -79,7 +78,7 @@ class MrvOptiswitchSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.mrv.mrv_ssh.MrvOptiswitchSSH"><code class="flex name class">
 <span>class <span class="ident">MrvOptiswitchSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>MRV Communications Driver (OptiSwitch).</p>
@@ -199,6 +198,10 @@ class MrvOptiswitchSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -234,7 +237,7 @@ class MrvOptiswitchSSH(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(MrvOptiswitchSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -279,7 +282,7 @@ class MrvOptiswitchSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;save config flash&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(MrvOptiswitchSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -379,7 +382,7 @@ class MrvOptiswitchSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/netapp/index.html b/docs/netmiko/netapp/index.html
index c131b753983ded33e997525b84965e17077d8172..df81a163eaeb1a1e16faf2aee89d8ca42b592eec 100644
--- a/docs/netmiko/netapp/index.html
+++ b/docs/netmiko/netapp/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.netapp API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.netapp.netapp_cdot_ssh import NetAppcDotSSH
+<pre><code class="python">from netmiko.netapp.netapp_cdot_ssh import NetAppcDotSSH
 
 __all__ = [&#34;NetAppcDotSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;NetAppcDotSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.netapp.NetAppcDotSSH"><code class="flex name class">
 <span>class <span class="ident">NetAppcDotSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -167,6 +166,10 @@ __all__ = [&#34;NetAppcDotSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -186,15 +189,15 @@ __all__ = [&#34;NetAppcDotSSH&#34;]</code></pre>
         return output
 
     def check_config_mode(self, check_string=&#34;*&gt;&#34;):
-        return super(NetAppcDotSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(
         self, config_command=&#34;set -privilege diagnostic -confirmations off&#34;
     ):
-        return super(NetAppcDotSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;set -privilege admin -confirmations off&#34;):
-        return super(NetAppcDotSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def enable(self, *args, **kwargs):
         &#34;&#34;&#34;No enable mode on NetApp.&#34;&#34;&#34;
@@ -336,7 +339,7 @@ __all__ = [&#34;NetAppcDotSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/netapp/netapp_cdot_ssh.html b/docs/netmiko/netapp/netapp_cdot_ssh.html
index 06e1de1d0433662c1ba69c8dd6a7040b8e9e755a..bced1ac063674a072d0bea84211d23e45f9a3766 100644
--- a/docs/netmiko/netapp/netapp_cdot_ssh.html
+++ b/docs/netmiko/netapp/netapp_cdot_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.netapp.netapp_cdot_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-from netmiko.base_connection import BaseConnection
+<pre><code class="python">from netmiko.base_connection import BaseConnection
 
 
 class NetAppcDotSSH(BaseConnection):
@@ -43,15 +41,15 @@ class NetAppcDotSSH(BaseConnection):
         return output
 
     def check_config_mode(self, check_string=&#34;*&gt;&#34;):
-        return super(NetAppcDotSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(
         self, config_command=&#34;set -privilege diagnostic -confirmations off&#34;
     ):
-        return super(NetAppcDotSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;set -privilege admin -confirmations off&#34;):
-        return super(NetAppcDotSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def enable(self, *args, **kwargs):
         &#34;&#34;&#34;No enable mode on NetApp.&#34;&#34;&#34;
@@ -75,7 +73,7 @@ class NetAppcDotSSH(BaseConnection):
 <dl>
 <dt id="netmiko.netapp.netapp_cdot_ssh.NetAppcDotSSH"><code class="flex name class">
 <span>class <span class="ident">NetAppcDotSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Defines vendor independent methods.</p>
@@ -196,6 +194,10 @@ class NetAppcDotSSH(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -215,15 +217,15 @@ class NetAppcDotSSH(BaseConnection):
         return output
 
     def check_config_mode(self, check_string=&#34;*&gt;&#34;):
-        return super(NetAppcDotSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(
         self, config_command=&#34;set -privilege diagnostic -confirmations off&#34;
     ):
-        return super(NetAppcDotSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;set -privilege admin -confirmations off&#34;):
-        return super(NetAppcDotSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def enable(self, *args, **kwargs):
         &#34;&#34;&#34;No enable mode on NetApp.&#34;&#34;&#34;
@@ -360,7 +362,7 @@ class NetAppcDotSSH(BaseConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/netmiko_globals.html b/docs/netmiko/netmiko_globals.html
index 4d9a2782e9cc1d46859678c171250747c89904ea..ed9d9d90320d2f04bca43e2facf7a8cefd2499ec 100644
--- a/docs/netmiko/netmiko_globals.html
+++ b/docs/netmiko/netmiko_globals.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.netmiko_globals API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-
-MAX_BUFFER = 65535
+<pre><code class="python">MAX_BUFFER = 65535
 BACKSPACE_CHAR = &#34;\x08&#34;</code></pre>
 </details>
 </section>
@@ -52,7 +50,7 @@ BACKSPACE_CHAR = &#34;\x08&#34;</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/nokia/index.html b/docs/netmiko/nokia/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..6a317fc1be238ec783caa4dfe3a7b413525a5d8f
--- /dev/null
+++ b/docs/netmiko/nokia/index.html
@@ -0,0 +1,603 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.6.3" />
+<title>netmiko.nokia API documentation</title>
+<meta name="description" content="" />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>netmiko.nokia</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">from netmiko.nokia.nokia_sros_ssh import NokiaSrosSSH
+
+__all__ = [&#34;NokiaSrosSSH&#34;]</code></pre>
+</details>
+</section>
+<section>
+<h2 class="section-title" id="header-submodules">Sub-modules</h2>
+<dl>
+<dt><code class="name"><a title="netmiko.nokia.nokia_sros_ssh" href="nokia_sros_ssh.html">netmiko.nokia.nokia_sros_ssh</a></code></dt>
+<dd>
+<section class="desc"></section>
+</dd>
+</dl>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="netmiko.nokia.NokiaSrosSSH"><code class="flex name class">
+<span>class <span class="ident">NokiaSrosSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Implement methods for interacting with Nokia SR OS devices.</p>
+<p>Not applicable in Nokia SR OS (disabled):
+- enable()
+- exit_enable_mode()
+- check_enable_mode()</p>
+<p>Overriden methods to adapt Nokia SR OS behavior (changed):
+- session_preparation()
+- set_base_prompt()
+- config_mode()
+- exit_config_mode()
+- check_config_mode()
+- save_config()
+- commit()
+- strip_prompt()</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class NokiaSrosSSH(BaseConnection):
+    &#34;&#34;&#34;
+    Implement methods for interacting with Nokia SR OS devices.
+
+    Not applicable in Nokia SR OS (disabled):
+        - enable()
+        - exit_enable_mode()
+        - check_enable_mode()
+
+    Overriden methods to adapt Nokia SR OS behavior (changed):
+        - session_preparation()
+        - set_base_prompt()
+        - config_mode()
+        - exit_config_mode()
+        - check_config_mode()
+        - save_config()
+        - commit()
+        - strip_prompt()
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        self._test_channel_read()
+        self.set_base_prompt()
+        # &#34;@&#34; indicates model-driven CLI (vs Classical CLI)
+        if &#34;@&#34; in self.base_prompt:
+            self.disable_paging(command=&#34;environment more false&#34;)
+            self.set_terminal_width(command=&#34;environment console width 512&#34;)
+        else:
+            self.disable_paging(command=&#34;environment no more&#34;)
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def set_base_prompt(self, *args, **kwargs):
+        &#34;&#34;&#34;Remove the &gt; when navigating into the different config level.&#34;&#34;&#34;
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
+        match = re.search(r&#34;\*?(.*?)(&gt;.*)*#&#34;, cur_base_prompt)
+        if match:
+            # strip off &gt;... from base_prompt; strip off leading *
+            self.base_prompt = match.group(1)
+            return self.base_prompt
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return True
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def config_mode(self, config_command=&#34;edit-config exclusive&#34;, pattern=r&#34;\(ex\)\[&#34;):
+        &#34;&#34;&#34;Enable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+        output = &#34;&#34;
+        # Only model-driven CLI supports config-mode
+        if &#34;@&#34; in self.base_prompt:
+            output += super().config_mode(
+                config_command=config_command, pattern=pattern
+            )
+        return output
+
+    def exit_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Disable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+        output = self._exit_all()
+        # Model-driven CLI
+        if &#34;@&#34; in self.base_prompt and &#34;(ex)[&#34; in output:
+            # Asterisk indicates changes were made.
+            if &#34;*(ex)[&#34; in output:
+                log.warning(&#34;Uncommitted changes! Discarding changes!&#34;)
+                output += self._discard()
+            cmd = &#34;quit-config&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+        if self.check_config_mode():
+            raise ValueError(&#34;Failed to exit configuration mode&#34;)
+        return output
+
+    def check_config_mode(self, check_string=r&#34;(ex)[&#34;, pattern=r&#34;@&#34;):
+        &#34;&#34;&#34;Check config mode for Nokia SR OS&#34;&#34;&#34;
+        if &#34;@&#34; not in self.base_prompt:
+            # Classical CLI
+            return False
+        else:
+            # Model-driven CLI look for &#34;exclusive&#34;
+            return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        &#34;&#34;&#34;Persist configuration to cflash for Nokia SR OS&#34;&#34;&#34;
+        output = self.send_command(command_string=&#34;/admin save&#34;)
+        return output
+
+    def send_config_set(self, config_commands=None, exit_config_mode=None, **kwargs):
+        &#34;&#34;&#34;Model driven CLI requires you not exit from configuration mode.&#34;&#34;&#34;
+        if exit_config_mode is None:
+            # Set to False if model-driven CLI
+            exit_config_mode = False if &#34;@&#34; in self.base_prompt else True
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )
+
+    def commit(self, *args, **kwargs):
+        &#34;&#34;&#34;Activate changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+        output = self._exit_all()
+        if &#34;@&#34; in self.base_prompt and &#34;*(ex)[&#34; in output:
+            log.info(&#34;Apply uncommitted changes!&#34;)
+            cmd = &#34;commit&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+            output += self.read_until_pattern(r&#34;@&#34;)
+        return output
+
+    def _exit_all(self):
+        &#34;&#34;&#34;Return to the &#39;root&#39; context.&#34;&#34;&#34;
+        exit_cmd = &#34;exit all&#34;
+        self.write_channel(self.normalize_cmd(exit_cmd))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        return self.read_until_pattern(pattern=re.escape(exit_cmd))
+
+    def _discard(self):
+        &#34;&#34;&#34;Discard changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+        output = &#34;&#34;
+        if &#34;@&#34; in self.base_prompt:
+            cmd = &#34;discard&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            new_output = self.read_until_pattern(pattern=re.escape(cmd))
+            if &#34;@&#34; not in new_output:
+                new_output += self.read_until_prompt()
+            output += new_output
+        return output
+
+    def strip_prompt(self, *args, **kwargs):
+        &#34;&#34;&#34;Strip prompt from the output.&#34;&#34;&#34;
+        output = super().strip_prompt(*args, **kwargs)
+        if &#34;@&#34; in self.base_prompt:
+            # Remove context prompt too
+            strips = r&#34;[\r\n]*\!?\*?(\((ex|gl|pr|ro)\))?\[\S*\][\r\n]*&#34;
+            return re.sub(strips, &#34;&#34;, output)
+        else:
+            return output</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.nokia.NokiaSrosSSH.check_config_mode"><code class="name flex">
+<span>def <span class="ident">check_config_mode</span></span>(<span>self, check_string='(ex)[', pattern='@')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Check config mode for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_config_mode(self, check_string=r&#34;(ex)[&#34;, pattern=r&#34;@&#34;):
+    &#34;&#34;&#34;Check config mode for Nokia SR OS&#34;&#34;&#34;
+    if &#34;@&#34; not in self.base_prompt:
+        # Classical CLI
+        return False
+    else:
+        # Model-driven CLI look for &#34;exclusive&#34;
+        return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.check_enable_mode"><code class="name flex">
+<span>def <span class="ident">check_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Nokia SR OS does not support enable-mode</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+    return True</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.commit"><code class="name flex">
+<span>def <span class="ident">commit</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Activate changes from private candidate for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def commit(self, *args, **kwargs):
+    &#34;&#34;&#34;Activate changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+    output = self._exit_all()
+    if &#34;@&#34; in self.base_prompt and &#34;*(ex)[&#34; in output:
+        log.info(&#34;Apply uncommitted changes!&#34;)
+        cmd = &#34;commit&#34;
+        self.write_channel(self.normalize_cmd(cmd))
+        output += self.read_until_pattern(pattern=re.escape(cmd))
+        output += self.read_until_pattern(r&#34;@&#34;)
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.config_mode"><code class="name flex">
+<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='edit-config exclusive', pattern='\\(ex\\)\\[')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Enable config edit-mode for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def config_mode(self, config_command=&#34;edit-config exclusive&#34;, pattern=r&#34;\(ex\)\[&#34;):
+    &#34;&#34;&#34;Enable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+    output = &#34;&#34;
+    # Only model-driven CLI supports config-mode
+    if &#34;@&#34; in self.base_prompt:
+        output += super().config_mode(
+            config_command=config_command, pattern=pattern
+        )
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.enable"><code class="name flex">
+<span>def <span class="ident">enable</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Nokia SR OS does not support enable-mode</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def enable(self, *args, **kwargs):
+    &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.exit_config_mode"><code class="name flex">
+<span>def <span class="ident">exit_config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Disable config edit-mode for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;Disable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+    output = self._exit_all()
+    # Model-driven CLI
+    if &#34;@&#34; in self.base_prompt and &#34;(ex)[&#34; in output:
+        # Asterisk indicates changes were made.
+        if &#34;*(ex)[&#34; in output:
+            log.warning(&#34;Uncommitted changes! Discarding changes!&#34;)
+            output += self._discard()
+        cmd = &#34;quit-config&#34;
+        self.write_channel(self.normalize_cmd(cmd))
+        output += self.read_until_pattern(pattern=re.escape(cmd))
+    if self.check_config_mode():
+        raise ValueError(&#34;Failed to exit configuration mode&#34;)
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.exit_enable_mode"><code class="name flex">
+<span>def <span class="ident">exit_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Nokia SR OS does not support enable-mode</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Persist configuration to cflash for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, *args, **kwargs):
+    &#34;&#34;&#34;Persist configuration to cflash for Nokia SR OS&#34;&#34;&#34;
+    output = self.send_command(command_string=&#34;/admin save&#34;)
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.send_config_set"><code class="name flex">
+<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=None, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Model driven CLI requires you not exit from configuration mode.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def send_config_set(self, config_commands=None, exit_config_mode=None, **kwargs):
+    &#34;&#34;&#34;Model driven CLI requires you not exit from configuration mode.&#34;&#34;&#34;
+    if exit_config_mode is None:
+        # Set to False if model-driven CLI
+        exit_config_mode = False if &#34;@&#34; in self.base_prompt else True
+    return super().send_config_set(
+        config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+    )</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.set_base_prompt"><code class="name flex">
+<span>def <span class="ident">set_base_prompt</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Remove the &gt; when navigating into the different config level.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def set_base_prompt(self, *args, **kwargs):
+    &#34;&#34;&#34;Remove the &gt; when navigating into the different config level.&#34;&#34;&#34;
+    cur_base_prompt = super().set_base_prompt(*args, **kwargs)
+    match = re.search(r&#34;\*?(.*?)(&gt;.*)*#&#34;, cur_base_prompt)
+    if match:
+        # strip off &gt;... from base_prompt; strip off leading *
+        self.base_prompt = match.group(1)
+        return self.base_prompt</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.NokiaSrosSSH.strip_prompt"><code class="name flex">
+<span>def <span class="ident">strip_prompt</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Strip prompt from the output.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def strip_prompt(self, *args, **kwargs):
+    &#34;&#34;&#34;Strip prompt from the output.&#34;&#34;&#34;
+    output = super().strip_prompt(*args, **kwargs)
+    if &#34;@&#34; in self.base_prompt:
+        # Remove context prompt too
+        strips = r&#34;[\r\n]*\!?\*?(\((ex|gl|pr|ro)\))?\[\S*\][\r\n]*&#34;
+        return re.sub(strips, &#34;&#34;, output)
+    else:
+        return output</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.base_connection.BaseConnection.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="netmiko" href="../index.html">netmiko</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-submodules">Sub-modules</a></h3>
+<ul>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh" href="nokia_sros_ssh.html">netmiko.nokia.nokia_sros_ssh</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="netmiko.nokia.NokiaSrosSSH" href="#netmiko.nokia.NokiaSrosSSH">NokiaSrosSSH</a></code></h4>
+<ul class="two-column">
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.check_config_mode" href="#netmiko.nokia.NokiaSrosSSH.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.check_enable_mode" href="#netmiko.nokia.NokiaSrosSSH.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.commit" href="#netmiko.nokia.NokiaSrosSSH.commit">commit</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.config_mode" href="#netmiko.nokia.NokiaSrosSSH.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.enable" href="#netmiko.nokia.NokiaSrosSSH.enable">enable</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.exit_config_mode" href="#netmiko.nokia.NokiaSrosSSH.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.exit_enable_mode" href="#netmiko.nokia.NokiaSrosSSH.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.save_config" href="#netmiko.nokia.NokiaSrosSSH.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.send_config_set" href="#netmiko.nokia.NokiaSrosSSH.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.set_base_prompt" href="#netmiko.nokia.NokiaSrosSSH.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.nokia.NokiaSrosSSH.strip_prompt" href="#netmiko.nokia.NokiaSrosSSH.strip_prompt">strip_prompt</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/netmiko/nokia/nokia_sros_ssh.html b/docs/netmiko/nokia/nokia_sros_ssh.html
new file mode 100644
index 0000000000000000000000000000000000000000..b843a0c3532366bf55d95f6c6e6af774ec5e4395
--- /dev/null
+++ b/docs/netmiko/nokia/nokia_sros_ssh.html
@@ -0,0 +1,746 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.6.3" />
+<title>netmiko.nokia.nokia_sros_ssh API documentation</title>
+<meta name="description" content="" />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>netmiko.nokia.nokia_sros_ssh</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright (c) 2014 - 2019 Kirk Byers
+# Copyright (c) 2014 - 2019 Twin Bridges Technology
+# Copyright (c) 2019 NOKIA Inc.
+# MIT License - See License file at:
+#   https://github.com/ktbyers/netmiko/blob/develop/LICENSE
+
+import re
+import time
+
+from netmiko import log
+from netmiko.base_connection import BaseConnection
+
+
+class NokiaSrosSSH(BaseConnection):
+    &#34;&#34;&#34;
+    Implement methods for interacting with Nokia SR OS devices.
+
+    Not applicable in Nokia SR OS (disabled):
+        - enable()
+        - exit_enable_mode()
+        - check_enable_mode()
+
+    Overriden methods to adapt Nokia SR OS behavior (changed):
+        - session_preparation()
+        - set_base_prompt()
+        - config_mode()
+        - exit_config_mode()
+        - check_config_mode()
+        - save_config()
+        - commit()
+        - strip_prompt()
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        self._test_channel_read()
+        self.set_base_prompt()
+        # &#34;@&#34; indicates model-driven CLI (vs Classical CLI)
+        if &#34;@&#34; in self.base_prompt:
+            self.disable_paging(command=&#34;environment more false&#34;)
+            self.set_terminal_width(command=&#34;environment console width 512&#34;)
+        else:
+            self.disable_paging(command=&#34;environment no more&#34;)
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def set_base_prompt(self, *args, **kwargs):
+        &#34;&#34;&#34;Remove the &gt; when navigating into the different config level.&#34;&#34;&#34;
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
+        match = re.search(r&#34;\*?(.*?)(&gt;.*)*#&#34;, cur_base_prompt)
+        if match:
+            # strip off &gt;... from base_prompt; strip off leading *
+            self.base_prompt = match.group(1)
+            return self.base_prompt
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return True
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def config_mode(self, config_command=&#34;edit-config exclusive&#34;, pattern=r&#34;\(ex\)\[&#34;):
+        &#34;&#34;&#34;Enable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+        output = &#34;&#34;
+        # Only model-driven CLI supports config-mode
+        if &#34;@&#34; in self.base_prompt:
+            output += super().config_mode(
+                config_command=config_command, pattern=pattern
+            )
+        return output
+
+    def exit_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Disable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+        output = self._exit_all()
+        # Model-driven CLI
+        if &#34;@&#34; in self.base_prompt and &#34;(ex)[&#34; in output:
+            # Asterisk indicates changes were made.
+            if &#34;*(ex)[&#34; in output:
+                log.warning(&#34;Uncommitted changes! Discarding changes!&#34;)
+                output += self._discard()
+            cmd = &#34;quit-config&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+        if self.check_config_mode():
+            raise ValueError(&#34;Failed to exit configuration mode&#34;)
+        return output
+
+    def check_config_mode(self, check_string=r&#34;(ex)[&#34;, pattern=r&#34;@&#34;):
+        &#34;&#34;&#34;Check config mode for Nokia SR OS&#34;&#34;&#34;
+        if &#34;@&#34; not in self.base_prompt:
+            # Classical CLI
+            return False
+        else:
+            # Model-driven CLI look for &#34;exclusive&#34;
+            return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        &#34;&#34;&#34;Persist configuration to cflash for Nokia SR OS&#34;&#34;&#34;
+        output = self.send_command(command_string=&#34;/admin save&#34;)
+        return output
+
+    def send_config_set(self, config_commands=None, exit_config_mode=None, **kwargs):
+        &#34;&#34;&#34;Model driven CLI requires you not exit from configuration mode.&#34;&#34;&#34;
+        if exit_config_mode is None:
+            # Set to False if model-driven CLI
+            exit_config_mode = False if &#34;@&#34; in self.base_prompt else True
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )
+
+    def commit(self, *args, **kwargs):
+        &#34;&#34;&#34;Activate changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+        output = self._exit_all()
+        if &#34;@&#34; in self.base_prompt and &#34;*(ex)[&#34; in output:
+            log.info(&#34;Apply uncommitted changes!&#34;)
+            cmd = &#34;commit&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+            output += self.read_until_pattern(r&#34;@&#34;)
+        return output
+
+    def _exit_all(self):
+        &#34;&#34;&#34;Return to the &#39;root&#39; context.&#34;&#34;&#34;
+        exit_cmd = &#34;exit all&#34;
+        self.write_channel(self.normalize_cmd(exit_cmd))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        return self.read_until_pattern(pattern=re.escape(exit_cmd))
+
+    def _discard(self):
+        &#34;&#34;&#34;Discard changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+        output = &#34;&#34;
+        if &#34;@&#34; in self.base_prompt:
+            cmd = &#34;discard&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            new_output = self.read_until_pattern(pattern=re.escape(cmd))
+            if &#34;@&#34; not in new_output:
+                new_output += self.read_until_prompt()
+            output += new_output
+        return output
+
+    def strip_prompt(self, *args, **kwargs):
+        &#34;&#34;&#34;Strip prompt from the output.&#34;&#34;&#34;
+        output = super().strip_prompt(*args, **kwargs)
+        if &#34;@&#34; in self.base_prompt:
+            # Remove context prompt too
+            strips = r&#34;[\r\n]*\!?\*?(\((ex|gl|pr|ro)\))?\[\S*\][\r\n]*&#34;
+            return re.sub(strips, &#34;&#34;, output)
+        else:
+            return output</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH"><code class="flex name class">
+<span>class <span class="ident">NokiaSrosSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Implement methods for interacting with Nokia SR OS devices.</p>
+<p>Not applicable in Nokia SR OS (disabled):
+- enable()
+- exit_enable_mode()
+- check_enable_mode()</p>
+<p>Overriden methods to adapt Nokia SR OS behavior (changed):
+- session_preparation()
+- set_base_prompt()
+- config_mode()
+- exit_config_mode()
+- check_config_mode()
+- save_config()
+- commit()
+- strip_prompt()</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class NokiaSrosSSH(BaseConnection):
+    &#34;&#34;&#34;
+    Implement methods for interacting with Nokia SR OS devices.
+
+    Not applicable in Nokia SR OS (disabled):
+        - enable()
+        - exit_enable_mode()
+        - check_enable_mode()
+
+    Overriden methods to adapt Nokia SR OS behavior (changed):
+        - session_preparation()
+        - set_base_prompt()
+        - config_mode()
+        - exit_config_mode()
+        - check_config_mode()
+        - save_config()
+        - commit()
+        - strip_prompt()
+    &#34;&#34;&#34;
+
+    def session_preparation(self):
+        self._test_channel_read()
+        self.set_base_prompt()
+        # &#34;@&#34; indicates model-driven CLI (vs Classical CLI)
+        if &#34;@&#34; in self.base_prompt:
+            self.disable_paging(command=&#34;environment more false&#34;)
+            self.set_terminal_width(command=&#34;environment console width 512&#34;)
+        else:
+            self.disable_paging(command=&#34;environment no more&#34;)
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def set_base_prompt(self, *args, **kwargs):
+        &#34;&#34;&#34;Remove the &gt; when navigating into the different config level.&#34;&#34;&#34;
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
+        match = re.search(r&#34;\*?(.*?)(&gt;.*)*#&#34;, cur_base_prompt)
+        if match:
+            # strip off &gt;... from base_prompt; strip off leading *
+            self.base_prompt = match.group(1)
+            return self.base_prompt
+
+    def enable(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def check_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return True
+
+    def exit_enable_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+        return &#34;&#34;
+
+    def config_mode(self, config_command=&#34;edit-config exclusive&#34;, pattern=r&#34;\(ex\)\[&#34;):
+        &#34;&#34;&#34;Enable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+        output = &#34;&#34;
+        # Only model-driven CLI supports config-mode
+        if &#34;@&#34; in self.base_prompt:
+            output += super().config_mode(
+                config_command=config_command, pattern=pattern
+            )
+        return output
+
+    def exit_config_mode(self, *args, **kwargs):
+        &#34;&#34;&#34;Disable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+        output = self._exit_all()
+        # Model-driven CLI
+        if &#34;@&#34; in self.base_prompt and &#34;(ex)[&#34; in output:
+            # Asterisk indicates changes were made.
+            if &#34;*(ex)[&#34; in output:
+                log.warning(&#34;Uncommitted changes! Discarding changes!&#34;)
+                output += self._discard()
+            cmd = &#34;quit-config&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+        if self.check_config_mode():
+            raise ValueError(&#34;Failed to exit configuration mode&#34;)
+        return output
+
+    def check_config_mode(self, check_string=r&#34;(ex)[&#34;, pattern=r&#34;@&#34;):
+        &#34;&#34;&#34;Check config mode for Nokia SR OS&#34;&#34;&#34;
+        if &#34;@&#34; not in self.base_prompt:
+            # Classical CLI
+            return False
+        else:
+            # Model-driven CLI look for &#34;exclusive&#34;
+            return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        &#34;&#34;&#34;Persist configuration to cflash for Nokia SR OS&#34;&#34;&#34;
+        output = self.send_command(command_string=&#34;/admin save&#34;)
+        return output
+
+    def send_config_set(self, config_commands=None, exit_config_mode=None, **kwargs):
+        &#34;&#34;&#34;Model driven CLI requires you not exit from configuration mode.&#34;&#34;&#34;
+        if exit_config_mode is None:
+            # Set to False if model-driven CLI
+            exit_config_mode = False if &#34;@&#34; in self.base_prompt else True
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )
+
+    def commit(self, *args, **kwargs):
+        &#34;&#34;&#34;Activate changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+        output = self._exit_all()
+        if &#34;@&#34; in self.base_prompt and &#34;*(ex)[&#34; in output:
+            log.info(&#34;Apply uncommitted changes!&#34;)
+            cmd = &#34;commit&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+            output += self.read_until_pattern(r&#34;@&#34;)
+        return output
+
+    def _exit_all(self):
+        &#34;&#34;&#34;Return to the &#39;root&#39; context.&#34;&#34;&#34;
+        exit_cmd = &#34;exit all&#34;
+        self.write_channel(self.normalize_cmd(exit_cmd))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        return self.read_until_pattern(pattern=re.escape(exit_cmd))
+
+    def _discard(self):
+        &#34;&#34;&#34;Discard changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+        output = &#34;&#34;
+        if &#34;@&#34; in self.base_prompt:
+            cmd = &#34;discard&#34;
+            self.write_channel(self.normalize_cmd(cmd))
+            new_output = self.read_until_pattern(pattern=re.escape(cmd))
+            if &#34;@&#34; not in new_output:
+                new_output += self.read_until_prompt()
+            output += new_output
+        return output
+
+    def strip_prompt(self, *args, **kwargs):
+        &#34;&#34;&#34;Strip prompt from the output.&#34;&#34;&#34;
+        output = super().strip_prompt(*args, **kwargs)
+        if &#34;@&#34; in self.base_prompt:
+            # Remove context prompt too
+            strips = r&#34;[\r\n]*\!?\*?(\((ex|gl|pr|ro)\))?\[\S*\][\r\n]*&#34;
+            return re.sub(strips, &#34;&#34;, output)
+        else:
+            return output</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.check_config_mode"><code class="name flex">
+<span>def <span class="ident">check_config_mode</span></span>(<span>self, check_string='(ex)[', pattern='@')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Check config mode for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_config_mode(self, check_string=r&#34;(ex)[&#34;, pattern=r&#34;@&#34;):
+    &#34;&#34;&#34;Check config mode for Nokia SR OS&#34;&#34;&#34;
+    if &#34;@&#34; not in self.base_prompt:
+        # Classical CLI
+        return False
+    else:
+        # Model-driven CLI look for &#34;exclusive&#34;
+        return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.check_enable_mode"><code class="name flex">
+<span>def <span class="ident">check_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Nokia SR OS does not support enable-mode</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def check_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+    return True</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.commit"><code class="name flex">
+<span>def <span class="ident">commit</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Activate changes from private candidate for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def commit(self, *args, **kwargs):
+    &#34;&#34;&#34;Activate changes from private candidate for Nokia SR OS&#34;&#34;&#34;
+    output = self._exit_all()
+    if &#34;@&#34; in self.base_prompt and &#34;*(ex)[&#34; in output:
+        log.info(&#34;Apply uncommitted changes!&#34;)
+        cmd = &#34;commit&#34;
+        self.write_channel(self.normalize_cmd(cmd))
+        output += self.read_until_pattern(pattern=re.escape(cmd))
+        output += self.read_until_pattern(r&#34;@&#34;)
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.config_mode"><code class="name flex">
+<span>def <span class="ident">config_mode</span></span>(<span>self, config_command='edit-config exclusive', pattern='\\(ex\\)\\[')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Enable config edit-mode for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def config_mode(self, config_command=&#34;edit-config exclusive&#34;, pattern=r&#34;\(ex\)\[&#34;):
+    &#34;&#34;&#34;Enable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+    output = &#34;&#34;
+    # Only model-driven CLI supports config-mode
+    if &#34;@&#34; in self.base_prompt:
+        output += super().config_mode(
+            config_command=config_command, pattern=pattern
+        )
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.enable"><code class="name flex">
+<span>def <span class="ident">enable</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Nokia SR OS does not support enable-mode</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def enable(self, *args, **kwargs):
+    &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.exit_config_mode"><code class="name flex">
+<span>def <span class="ident">exit_config_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Disable config edit-mode for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_config_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;Disable config edit-mode for Nokia SR OS&#34;&#34;&#34;
+    output = self._exit_all()
+    # Model-driven CLI
+    if &#34;@&#34; in self.base_prompt and &#34;(ex)[&#34; in output:
+        # Asterisk indicates changes were made.
+        if &#34;*(ex)[&#34; in output:
+            log.warning(&#34;Uncommitted changes! Discarding changes!&#34;)
+            output += self._discard()
+        cmd = &#34;quit-config&#34;
+        self.write_channel(self.normalize_cmd(cmd))
+        output += self.read_until_pattern(pattern=re.escape(cmd))
+    if self.check_config_mode():
+        raise ValueError(&#34;Failed to exit configuration mode&#34;)
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.exit_enable_mode"><code class="name flex">
+<span>def <span class="ident">exit_enable_mode</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Nokia SR OS does not support enable-mode</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def exit_enable_mode(self, *args, **kwargs):
+    &#34;&#34;&#34;Nokia SR OS does not support enable-mode&#34;&#34;&#34;
+    return &#34;&#34;</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Persist configuration to cflash for Nokia SR OS</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, *args, **kwargs):
+    &#34;&#34;&#34;Persist configuration to cflash for Nokia SR OS&#34;&#34;&#34;
+    output = self.send_command(command_string=&#34;/admin save&#34;)
+    return output</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.send_config_set"><code class="name flex">
+<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=None, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Model driven CLI requires you not exit from configuration mode.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def send_config_set(self, config_commands=None, exit_config_mode=None, **kwargs):
+    &#34;&#34;&#34;Model driven CLI requires you not exit from configuration mode.&#34;&#34;&#34;
+    if exit_config_mode is None:
+        # Set to False if model-driven CLI
+        exit_config_mode = False if &#34;@&#34; in self.base_prompt else True
+    return super().send_config_set(
+        config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+    )</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.set_base_prompt"><code class="name flex">
+<span>def <span class="ident">set_base_prompt</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Remove the &gt; when navigating into the different config level.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def set_base_prompt(self, *args, **kwargs):
+    &#34;&#34;&#34;Remove the &gt; when navigating into the different config level.&#34;&#34;&#34;
+    cur_base_prompt = super().set_base_prompt(*args, **kwargs)
+    match = re.search(r&#34;\*?(.*?)(&gt;.*)*#&#34;, cur_base_prompt)
+    if match:
+        # strip off &gt;... from base_prompt; strip off leading *
+        self.base_prompt = match.group(1)
+        return self.base_prompt</code></pre>
+</details>
+</dd>
+<dt id="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.strip_prompt"><code class="name flex">
+<span>def <span class="ident">strip_prompt</span></span>(<span>self, *args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Strip prompt from the output.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def strip_prompt(self, *args, **kwargs):
+    &#34;&#34;&#34;Strip prompt from the output.&#34;&#34;&#34;
+    output = super().strip_prompt(*args, **kwargs)
+    if &#34;@&#34; in self.base_prompt:
+        # Remove context prompt too
+        strips = r&#34;[\r\n]*\!?\*?(\((ex|gl|pr|ro)\))?\[\S*\][\r\n]*&#34;
+        return re.sub(strips, &#34;&#34;, output)
+    else:
+        return output</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.base_connection.BaseConnection.cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.session_preparation" href="../base_connection.html#netmiko.base_connection.BaseConnection.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.telnet_login" href="../base_connection.html#netmiko.base_connection.BaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.base_connection.BaseConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="netmiko.nokia" href="index.html">netmiko.nokia</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH">NokiaSrosSSH</a></code></h4>
+<ul class="two-column">
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.check_config_mode" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.check_enable_mode" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.commit" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.commit">commit</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.config_mode" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.enable" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.enable">enable</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.exit_config_mode" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.exit_enable_mode" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.save_config" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.send_config_set" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.set_base_prompt" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.strip_prompt" href="#netmiko.nokia.nokia_sros_ssh.NokiaSrosSSH.strip_prompt">strip_prompt</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/netmiko/oneaccess/index.html b/docs/netmiko/oneaccess/index.html
index 56b9a22b6b7aa7e5f3e5ff435129485ecf4414ce..025a3c4b41e50c1513305a7275b92da0f699df60 100644
--- a/docs/netmiko/oneaccess/index.html
+++ b/docs/netmiko/oneaccess/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.oneaccess API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.oneaccess.oneaccess_oneos import OneaccessOneOSSSH, OneaccessOneOSTelnet
+<pre><code class="python">from netmiko.oneaccess.oneaccess_oneos import OneaccessOneOSSSH, OneaccessOneOSTelnet
 
 __all__ = [&#34;OneaccessOneOSSSH&#34;, &#34;OneaccessOneOSTelnet&#34;]</code></pre>
 </details>
@@ -209,7 +208,7 @@ __all__ = [&#34;OneaccessOneOSSSH&#34;, &#34;OneaccessOneOSTelnet&#34;]</code></
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/oneaccess/oneaccess_oneos.html b/docs/netmiko/oneaccess/oneaccess_oneos.html
index dce693829d4ea13e0e0797fb05bf2c0707042e67..966e530ea893a5883397fe193cf176530ab0c135 100644
--- a/docs/netmiko/oneaccess/oneaccess_oneos.html
+++ b/docs/netmiko/oneaccess/oneaccess_oneos.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.oneaccess.oneaccess_oneos API documentation</title>
 <meta name="description" content="Netmiko driver for OneAccess ONEOS" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,10 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Netmiko driver for OneAccess ONEOS&#34;&#34;&#34;
-
-from __future__ import print_function
-from __future__ import unicode_literals
-
 from netmiko.cisco_base_connection import CiscoBaseConnection
 import time
 
@@ -37,7 +33,7 @@ class OneaccessOneOSBase(CiscoBaseConnection):
         &#34;&#34;&#34;Init connection - similar as Cisco&#34;&#34;&#34;
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(OneaccessOneOSBase, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare connection - disable paging&#34;&#34;&#34;
@@ -51,7 +47,7 @@ class OneaccessOneOSBase(CiscoBaseConnection):
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save config: write mem&#34;&#34;&#34;
-        return super(OneaccessOneOSBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -87,7 +83,7 @@ class OneaccessOneOSTelnet(OneaccessOneOSBase):
         &#34;&#34;&#34;Init connection - similar as Cisco&#34;&#34;&#34;
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(OneaccessOneOSBase, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare connection - disable paging&#34;&#34;&#34;
@@ -101,7 +97,7 @@ class OneaccessOneOSTelnet(OneaccessOneOSBase):
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Save config: write mem&#34;&#34;&#34;
-        return super(OneaccessOneOSBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -126,7 +122,7 @@ class OneaccessOneOSTelnet(OneaccessOneOSBase):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Save config: write mem&#34;&#34;&#34;
-    return super(OneaccessOneOSBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -363,7 +359,7 @@ class OneaccessOneOSTelnet(OneaccessOneOSBase):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ovs/index.html b/docs/netmiko/ovs/index.html
index 32f6042a2cc955d64ea305bb77f925841fb339d7..5010bbffdbc77fd8777e4ad441a5224512d3645e 100644
--- a/docs/netmiko/ovs/index.html
+++ b/docs/netmiko/ovs/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ovs API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.ovs.ovs_linux_ssh import OvsLinuxSSH
+<pre><code class="python">from netmiko.ovs.ovs_linux_ssh import OvsLinuxSSH
 
 __all__ = [&#34;OvsLinuxSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;OvsLinuxSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.ovs.OvsLinuxSSH"><code class="flex name class">
 <span>class <span class="ident">OvsLinuxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -166,6 +165,10 @@ __all__ = [&#34;OvsLinuxSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -257,7 +260,7 @@ __all__ = [&#34;OvsLinuxSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ovs/ovs_linux_ssh.html b/docs/netmiko/ovs/ovs_linux_ssh.html
index 317f6fdfdfc8363d19cc117744831e88cb86bbf5..c9fc253b071011b7542fb142ad7d11d53539bfe6 100644
--- a/docs/netmiko/ovs/ovs_linux_ssh.html
+++ b/docs/netmiko/ovs/ovs_linux_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ovs.ovs_linux_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.linux.linux_ssh import LinuxSSH
+<pre><code class="python">from netmiko.linux.linux_ssh import LinuxSSH
 
 
 class OvsLinuxSSH(LinuxSSH):
@@ -41,7 +40,7 @@ class OvsLinuxSSH(LinuxSSH):
 <dl>
 <dt id="netmiko.ovs.ovs_linux_ssh.OvsLinuxSSH"><code class="flex name class">
 <span>class <span class="ident">OvsLinuxSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -161,6 +160,10 @@ class OvsLinuxSSH(LinuxSSH):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -247,7 +250,7 @@ class OvsLinuxSSH(LinuxSSH):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/paloalto/index.html b/docs/netmiko/paloalto/index.html
index a6996bc11212308b8f2f00c8b1ed8567d9de9f76..61dda196f3fb24a621b0027aa056ecc72e9202af 100644
--- a/docs/netmiko/paloalto/index.html
+++ b/docs/netmiko/paloalto/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.paloalto API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.paloalto.paloalto_panos import PaloAltoPanosSSH, PaloAltoPanosTelnet
+<pre><code class="python">from netmiko.paloalto.paloalto_panos import PaloAltoPanosSSH, PaloAltoPanosTelnet
 
 __all__ = [&#34;PaloAltoPanosSSH&#34;, &#34;PaloAltoPanosTelnet&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;PaloAltoPanosSSH&#34;, &#34;PaloAltoPanosTelnet&#34;]</code></pr
 <dl>
 <dt id="netmiko.paloalto.PaloAltoPanosSSH"><code class="flex name class">
 <span>class <span class="ident">PaloAltoPanosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with PaloAlto devices.</p>
@@ -169,6 +168,10 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -231,7 +234,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
 </dd>
 <dt id="netmiko.paloalto.PaloAltoPanosTelnet"><code class="flex name class">
 <span>class <span class="ident">PaloAltoPanosTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with PaloAlto devices.</p>
@@ -354,6 +357,10 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -447,7 +454,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/paloalto/paloalto_panos.html b/docs/netmiko/paloalto/paloalto_panos.html
index 52f96242a1640aa21a6722ae097ba8495a6261e4..eb91ca1950622833ca40a2ba8e0252c21197f935 100644
--- a/docs/netmiko/paloalto/paloalto_panos.html
+++ b/docs/netmiko/paloalto/paloalto_panos.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.paloalto.paloalto_panos API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 import re
 from netmiko.base_connection import BaseConnection
 
@@ -64,19 +63,15 @@ class PaloAltoPanosBase(BaseConnection):
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(PaloAltoPanosBase, self).check_config_mode(
-            check_string=check_string
-        )
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(PaloAltoPanosBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=r&#34;&gt;&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-        return super(PaloAltoPanosBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def commit(
         self,
@@ -121,7 +116,7 @@ class PaloAltoPanosBase(BaseConnection):
         if partial:
             command_string += &#34; partial&#34;
             if vsys:
-                command_string += &#34; {0}&#34;.format(vsys)
+                command_string += f&#34; {vsys}&#34;
             if device_and_network:
                 command_string += &#34; device-and-network&#34;
             if policy_and_objects:
@@ -141,9 +136,7 @@ class PaloAltoPanosBase(BaseConnection):
         )
 
         if commit_marker not in output.lower():
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
         return output
 
     def strip_command(self, command_string, output):
@@ -188,7 +181,7 @@ class PaloAltoPanosBase(BaseConnection):
     def send_command(self, *args, **kwargs):
         &#34;&#34;&#34;Palo Alto requires an extra delay&#34;&#34;&#34;
         kwargs[&#34;delay_factor&#34;] = kwargs.get(&#34;delay_factor&#34;, 2.5)
-        return super(PaloAltoPanosBase, self).send_command(*args, **kwargs)
+        return super().send_command(*args, **kwargs)
 
     def cleanup(self):
         &#34;&#34;&#34;Gracefully exit the SSH session.&#34;&#34;&#34;
@@ -220,7 +213,7 @@ class PaloAltoPanosTelnet(PaloAltoPanosBase):
 <dl>
 <dt id="netmiko.paloalto.paloalto_panos.PaloAltoPanosBase"><code class="flex name class">
 <span>class <span class="ident">PaloAltoPanosBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with PaloAlto devices.</p>
@@ -343,6 +336,10 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -382,19 +379,15 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
 
     def check_config_mode(self, check_string=&#34;]&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(PaloAltoPanosBase, self).check_config_mode(
-            check_string=check_string
-        )
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(PaloAltoPanosBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=r&#34;&gt;&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-        return super(PaloAltoPanosBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def commit(
         self,
@@ -439,7 +432,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
         if partial:
             command_string += &#34; partial&#34;
             if vsys:
-                command_string += &#34; {0}&#34;.format(vsys)
+                command_string += f&#34; {vsys}&#34;
             if device_and_network:
                 command_string += &#34; device-and-network&#34;
             if policy_and_objects:
@@ -459,9 +452,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
         )
 
         if commit_marker not in output.lower():
-            raise ValueError(
-                &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
         return output
 
     def strip_command(self, command_string, output):
@@ -506,7 +497,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
     def send_command(self, *args, **kwargs):
         &#34;&#34;&#34;Palo Alto requires an extra delay&#34;&#34;&#34;
         kwargs[&#34;delay_factor&#34;] = kwargs.get(&#34;delay_factor&#34;, 2.5)
-        return super(PaloAltoPanosBase, self).send_command(*args, **kwargs)
+        return super().send_command(*args, **kwargs)
 
     def cleanup(self):
         &#34;&#34;&#34;Gracefully exit the SSH session.&#34;&#34;&#34;
@@ -538,9 +529,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;]&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(PaloAltoPanosBase, self).check_config_mode(
-        check_string=check_string
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.paloalto.paloalto_panos.PaloAltoPanosBase.check_enable_mode"><code class="name flex">
@@ -631,7 +620,7 @@ Exception</p></section>
     if partial:
         command_string += &#34; partial&#34;
         if vsys:
-            command_string += &#34; {0}&#34;.format(vsys)
+            command_string += f&#34; {vsys}&#34;
         if device_and_network:
             command_string += &#34; device-and-network&#34;
         if policy_and_objects:
@@ -651,9 +640,7 @@ Exception</p></section>
     )
 
     if commit_marker not in output.lower():
-        raise ValueError(
-            &#34;Commit failed with the following errors:\n\n{0}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with the following errors:\n\n{output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -666,7 +653,7 @@ Exception</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(PaloAltoPanosBase, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.paloalto.paloalto_panos.PaloAltoPanosBase.enable"><code class="name flex">
@@ -690,9 +677,7 @@ Exception</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=r&#34;&gt;&#34;):
     &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-    return super(PaloAltoPanosBase, self).exit_config_mode(
-        exit_config=exit_config, pattern=pattern
-    )</code></pre>
+    return super().exit_config_mode(exit_config=exit_config, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.paloalto.paloalto_panos.PaloAltoPanosBase.exit_enable_mode"><code class="name flex">
@@ -717,7 +702,7 @@ Exception</p></section>
 <pre><code class="python">def send_command(self, *args, **kwargs):
     &#34;&#34;&#34;Palo Alto requires an extra delay&#34;&#34;&#34;
     kwargs[&#34;delay_factor&#34;] = kwargs.get(&#34;delay_factor&#34;, 2.5)
-    return super(PaloAltoPanosBase, self).send_command(*args, **kwargs)</code></pre>
+    return super().send_command(*args, **kwargs)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.paloalto.paloalto_panos.PaloAltoPanosBase.send_command_expect"><code class="name flex">
@@ -856,7 +841,7 @@ Set the base prompt for interaction ('&gt;').</p></section>
 </dd>
 <dt id="netmiko.paloalto.paloalto_panos.PaloAltoPanosSSH"><code class="flex name class">
 <span>class <span class="ident">PaloAltoPanosSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with PaloAlto devices.</p>
@@ -979,6 +964,10 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1041,7 +1030,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
 </dd>
 <dt id="netmiko.paloalto.paloalto_panos.PaloAltoPanosTelnet"><code class="flex name class">
 <span>class <span class="ident">PaloAltoPanosTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with PaloAlto devices.</p>
@@ -1164,6 +1153,10 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -1271,7 +1264,7 @@ Overrides several methods for PaloAlto-specific compatibility.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/pluribus/index.html b/docs/netmiko/pluribus/index.html
index 2f98596a5ea92142c3d99edb3ff9d05275c096ef..dadb3c6e7262f4f47e73a5c782efc4c455579a87 100644
--- a/docs/netmiko/pluribus/index.html
+++ b/docs/netmiko/pluribus/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.pluribus API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -166,6 +166,10 @@ __all__ = (&#34;PluribusSSH&#34;,)</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -173,14 +177,12 @@ __all__ = (&#34;PluribusSSH&#34;,)</code></pre>
     &#34;&#34;&#34;Common methods for Pluribus.&#34;&#34;&#34;
 
     def __init__(self, *args, **kwargs):
-        super(PluribusSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
         self._config_mode = False
 
     def disable_paging(self, command=&#34;pager off&#34;, delay_factor=1):
         &#34;&#34;&#34;Make sure paging is disabled.&#34;&#34;&#34;
-        return super(PluribusSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the netmiko session.&#34;&#34;&#34;
@@ -252,9 +254,7 @@ Therefore it can be considered as always in config mode.</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def disable_paging(self, command=&#34;pager off&#34;, delay_factor=1):
     &#34;&#34;&#34;Make sure paging is disabled.&#34;&#34;&#34;
-    return super(PluribusSSH, self).disable_paging(
-        command=command, delay_factor=delay_factor
-    )</code></pre>
+    return super().disable_paging(command=command, delay_factor=delay_factor)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.pluribus.PluribusSSH.exit_config_mode"><code class="name flex">
@@ -368,7 +368,7 @@ Therefore it can be considered as always in config mode.</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/pluribus/pluribus_ssh.html b/docs/netmiko/pluribus/pluribus_ssh.html
index 73175778ec51810c557cb399f6319478b67d8a60..e26673269141fab78ac45fdd85defd93d3460e9b 100644
--- a/docs/netmiko/pluribus/pluribus_ssh.html
+++ b/docs/netmiko/pluribus/pluribus_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.pluribus.pluribus_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.base_connection import BaseConnection
 
 
@@ -31,14 +30,12 @@ class PluribusSSH(BaseConnection):
     &#34;&#34;&#34;Common methods for Pluribus.&#34;&#34;&#34;
 
     def __init__(self, *args, **kwargs):
-        super(PluribusSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
         self._config_mode = False
 
     def disable_paging(self, command=&#34;pager off&#34;, delay_factor=1):
         &#34;&#34;&#34;Make sure paging is disabled.&#34;&#34;&#34;
-        return super(PluribusSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the netmiko session.&#34;&#34;&#34;
@@ -198,6 +195,10 @@ class PluribusSSH(BaseConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -205,14 +206,12 @@ class PluribusSSH(BaseConnection):
     &#34;&#34;&#34;Common methods for Pluribus.&#34;&#34;&#34;
 
     def __init__(self, *args, **kwargs):
-        super(PluribusSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
         self._config_mode = False
 
     def disable_paging(self, command=&#34;pager off&#34;, delay_factor=1):
         &#34;&#34;&#34;Make sure paging is disabled.&#34;&#34;&#34;
-        return super(PluribusSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def session_preparation(self):
         &#34;&#34;&#34;Prepare the netmiko session.&#34;&#34;&#34;
@@ -284,9 +283,7 @@ Therefore it can be considered as always in config mode.</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def disable_paging(self, command=&#34;pager off&#34;, delay_factor=1):
     &#34;&#34;&#34;Make sure paging is disabled.&#34;&#34;&#34;
-    return super(PluribusSSH, self).disable_paging(
-        command=command, delay_factor=delay_factor
-    )</code></pre>
+    return super().disable_paging(command=command, delay_factor=delay_factor)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.pluribus.pluribus_ssh.PluribusSSH.exit_config_mode"><code class="name flex">
@@ -395,7 +392,7 @@ Therefore it can be considered as always in config mode.</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/quanta/index.html b/docs/netmiko/quanta/index.html
index 6ad10e214a4c40ce2df26ac90bd044048ca566c9..0af5c9dce7a7e101f8ee55dba775e322bc42a69a 100644
--- a/docs/netmiko/quanta/index.html
+++ b/docs/netmiko/quanta/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.quanta API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.quanta.quanta_mesh_ssh import QuantaMeshSSH
+<pre><code class="python">from netmiko.quanta.quanta_mesh_ssh import QuantaMeshSSH
 
 __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.quanta.QuantaMeshSSH"><code class="flex name class">
 <span>class <span class="ident">QuantaMeshSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -166,17 +165,21 @@ __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class QuantaMeshSSH(CiscoSSHConnection):
     def disable_paging(self, command=&#34;no pager&#34;, delay_factor=1):
         &#34;&#34;&#34;Disable paging&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).disable_paging(command=command)
+        return super().disable_paging(command=command)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def save_config(
         self,
@@ -185,7 +188,7 @@ __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -206,7 +209,7 @@ __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(QuantaMeshSSH, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.quanta.QuantaMeshSSH.disable_paging"><code class="name flex">
@@ -218,7 +221,7 @@ __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def disable_paging(self, command=&#34;no pager&#34;, delay_factor=1):
     &#34;&#34;&#34;Disable paging&#34;&#34;&#34;
-    return super(QuantaMeshSSH, self).disable_paging(command=command)</code></pre>
+    return super().disable_paging(command=command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.quanta.QuantaMeshSSH.save_config"><code class="name flex">
@@ -235,7 +238,7 @@ __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
     confirm_response=&#34;&#34;,
 ):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(QuantaMeshSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -321,7 +324,7 @@ __all__ = [&#34;QuantaMeshSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/quanta/quanta_mesh_ssh.html b/docs/netmiko/quanta/quanta_mesh_ssh.html
index e9a7e98414a645e5360eb95afe5f21ac061d1720..5e39381f0fe7f7b8796c70c5bfcaa471dfd35050 100644
--- a/docs/netmiko/quanta/quanta_mesh_ssh.html
+++ b/docs/netmiko/quanta/quanta_mesh_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.quanta.quanta_mesh_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,18 +22,17 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.cisco_base_connection import CiscoSSHConnection
+<pre><code class="python">from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
 class QuantaMeshSSH(CiscoSSHConnection):
     def disable_paging(self, command=&#34;no pager&#34;, delay_factor=1):
         &#34;&#34;&#34;Disable paging&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).disable_paging(command=command)
+        return super().disable_paging(command=command)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def save_config(
         self,
@@ -42,7 +41,7 @@ class QuantaMeshSSH(CiscoSSHConnection):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -58,7 +57,7 @@ class QuantaMeshSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.quanta.quanta_mesh_ssh.QuantaMeshSSH"><code class="flex name class">
 <span>class <span class="ident">QuantaMeshSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Base Class for cisco-like behavior.</p>
@@ -178,17 +177,21 @@ class QuantaMeshSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">class QuantaMeshSSH(CiscoSSHConnection):
     def disable_paging(self, command=&#34;no pager&#34;, delay_factor=1):
         &#34;&#34;&#34;Disable paging&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).disable_paging(command=command)
+        return super().disable_paging(command=command)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def save_config(
         self,
@@ -197,7 +200,7 @@ class QuantaMeshSSH(CiscoSSHConnection):
         confirm_response=&#34;&#34;,
     ):
         &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-        return super(QuantaMeshSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -218,7 +221,7 @@ class QuantaMeshSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(QuantaMeshSSH, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.quanta.quanta_mesh_ssh.QuantaMeshSSH.disable_paging"><code class="name flex">
@@ -230,7 +233,7 @@ class QuantaMeshSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def disable_paging(self, command=&#34;no pager&#34;, delay_factor=1):
     &#34;&#34;&#34;Disable paging&#34;&#34;&#34;
-    return super(QuantaMeshSSH, self).disable_paging(command=command)</code></pre>
+    return super().disable_paging(command=command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.quanta.quanta_mesh_ssh.QuantaMeshSSH.save_config"><code class="name flex">
@@ -247,7 +250,7 @@ class QuantaMeshSSH(CiscoSSHConnection):
     confirm_response=&#34;&#34;,
 ):
     &#34;&#34;&#34;Saves Config&#34;&#34;&#34;
-    return super(QuantaMeshSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -328,7 +331,7 @@ class QuantaMeshSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/rad/index.html b/docs/netmiko/rad/index.html
index ebc3c6661f24ea097c5e341dbe9595f3aa2f3a09..127dfe8921cb4a59464147e7b8858bff94d4920f 100644
--- a/docs/netmiko/rad/index.html
+++ b/docs/netmiko/rad/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.rad API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.rad.rad_etx import RadETXSSH
+<pre><code class="python">from netmiko.rad.rad_etx import RadETXSSH
 from netmiko.rad.rad_etx import RadETXTelnet
 
 __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
@@ -167,6 +166,10 @@ __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -176,7 +179,7 @@ __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
     def __init__(self, **kwargs):
         # Found that a global_delay_factor of 2 is needed at minimum for SSH to the Rad ETX.
         kwargs.setdefault(&#34;global_delay_factor&#34;, 2)
-        return super(RadETXSSH, self).__init__(**kwargs)</code></pre>
+        return super().__init__(**kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -233,7 +236,7 @@ __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
 </dd>
 <dt id="netmiko.rad.RadETXTelnet"><code class="flex name class">
 <span>class <span class="ident">RadETXTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>RAD ETX Telnet Support.</p>
@@ -353,6 +356,10 @@ __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -370,7 +377,7 @@ __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
         password&gt; ****
         &#34;&#34;&#34;
         self.TELNET_RETURN = self.RETURN
-        return super(RadETXTelnet, self).telnet_login(
+        return super().telnet_login(
             username_pattern=username_pattern,
             alt_prompt_terminator=alt_prompt_term,
             **kwargs
@@ -403,7 +410,7 @@ __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
     password&gt; ****
     &#34;&#34;&#34;
     self.TELNET_RETURN = self.RETURN
-    return super(RadETXTelnet, self).telnet_login(
+    return super().telnet_login(
         username_pattern=username_pattern,
         alt_prompt_terminator=alt_prompt_term,
         **kwargs
@@ -494,7 +501,7 @@ __all__ = [&#34;RadETXSSH&#34;, &#34;RadETXTelnet&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/rad/rad_etx.html b/docs/netmiko/rad/rad_etx.html
index 0081dd7dfa8d960628cbee6f6ede89c45930e95d..4c3eab1d72e6edcd118be6627e5a630bdbd90f84 100644
--- a/docs/netmiko/rad/rad_etx.html
+++ b/docs/netmiko/rad/rad_etx.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.rad.rad_etx API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from __future__ import print_function
-import time
+<pre><code class="python">import time
 from netmiko.base_connection import BaseConnection
 
 
@@ -67,9 +65,7 @@ class RadETXBase(BaseConnection):
 
     def config_mode(self, config_command=&#34;config&#34;, pattern=&#34;&gt;config&#34;):
         &#34;&#34;&#34;Enter into configuration mode on remote device.&#34;&#34;&#34;
-        return super(RadETXBase, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;&gt;config&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;
@@ -77,15 +73,11 @@ class RadETXBase(BaseConnection):
 
         Rad config starts with baseprompt&gt;config.
         &#34;&#34;&#34;
-        return super(RadETXBase, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit all&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Exit from configuration mode.&#34;&#34;&#34;
-        return super(RadETXBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
 
 class RadETXSSH(RadETXBase):
@@ -94,7 +86,7 @@ class RadETXSSH(RadETXBase):
     def __init__(self, **kwargs):
         # Found that a global_delay_factor of 2 is needed at minimum for SSH to the Rad ETX.
         kwargs.setdefault(&#34;global_delay_factor&#34;, 2)
-        return super(RadETXSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
 
 class RadETXTelnet(RadETXBase):
@@ -111,7 +103,7 @@ class RadETXTelnet(RadETXBase):
         password&gt; ****
         &#34;&#34;&#34;
         self.TELNET_RETURN = self.RETURN
-        return super(RadETXTelnet, self).telnet_login(
+        return super().telnet_login(
             username_pattern=username_pattern,
             alt_prompt_terminator=alt_prompt_term,
             **kwargs
@@ -129,7 +121,7 @@ class RadETXTelnet(RadETXBase):
 <dl>
 <dt id="netmiko.rad.rad_etx.RadETXBase"><code class="flex name class">
 <span>class <span class="ident">RadETXBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>RAD ETX Support, Tested on RAD 203AX, 205A and 220A.</p>
@@ -249,6 +241,10 @@ class RadETXTelnet(RadETXBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -291,9 +287,7 @@ class RadETXTelnet(RadETXBase):
 
     def config_mode(self, config_command=&#34;config&#34;, pattern=&#34;&gt;config&#34;):
         &#34;&#34;&#34;Enter into configuration mode on remote device.&#34;&#34;&#34;
-        return super(RadETXBase, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def check_config_mode(self, check_string=&#34;&gt;config&#34;, pattern=&#34;&#34;):
         &#34;&#34;&#34;
@@ -301,15 +295,11 @@ class RadETXTelnet(RadETXBase):
 
         Rad config starts with baseprompt&gt;config.
         &#34;&#34;&#34;
-        return super(RadETXBase, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit all&#34;, pattern=&#34;#&#34;):
         &#34;&#34;&#34;Exit from configuration mode.&#34;&#34;&#34;
-        return super(RadETXBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )</code></pre>
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -336,9 +326,7 @@ class RadETXTelnet(RadETXBase):
 
     Rad config starts with baseprompt&gt;config.
     &#34;&#34;&#34;
-    return super(RadETXBase, self).check_config_mode(
-        check_string=check_string, pattern=pattern
-    )</code></pre>
+    return super().check_config_mode(check_string=check_string, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.rad.rad_etx.RadETXBase.check_enable_mode"><code class="name flex">
@@ -362,9 +350,7 @@ class RadETXTelnet(RadETXBase):
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;config&#34;, pattern=&#34;&gt;config&#34;):
     &#34;&#34;&#34;Enter into configuration mode on remote device.&#34;&#34;&#34;
-    return super(RadETXBase, self).config_mode(
-        config_command=config_command, pattern=pattern
-    )</code></pre>
+    return super().config_mode(config_command=config_command, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.rad.rad_etx.RadETXBase.enable"><code class="name flex">
@@ -388,9 +374,7 @@ class RadETXTelnet(RadETXBase):
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;exit all&#34;, pattern=&#34;#&#34;):
     &#34;&#34;&#34;Exit from configuration mode.&#34;&#34;&#34;
-    return super(RadETXBase, self).exit_config_mode(
-        exit_config=exit_config, pattern=pattern
-    )</code></pre>
+    return super().exit_config_mode(exit_config=exit_config, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.rad.rad_etx.RadETXBase.exit_enable_mode"><code class="name flex">
@@ -591,6 +575,10 @@ class RadETXTelnet(RadETXBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -600,7 +588,7 @@ class RadETXTelnet(RadETXBase):
     def __init__(self, **kwargs):
         # Found that a global_delay_factor of 2 is needed at minimum for SSH to the Rad ETX.
         kwargs.setdefault(&#34;global_delay_factor&#34;, 2)
-        return super(RadETXSSH, self).__init__(**kwargs)</code></pre>
+        return super().__init__(**kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -657,7 +645,7 @@ class RadETXTelnet(RadETXBase):
 </dd>
 <dt id="netmiko.rad.rad_etx.RadETXTelnet"><code class="flex name class">
 <span>class <span class="ident">RadETXTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>RAD ETX Telnet Support.</p>
@@ -777,6 +765,10 @@ class RadETXTelnet(RadETXBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -794,7 +786,7 @@ class RadETXTelnet(RadETXBase):
         password&gt; ****
         &#34;&#34;&#34;
         self.TELNET_RETURN = self.RETURN
-        return super(RadETXTelnet, self).telnet_login(
+        return super().telnet_login(
             username_pattern=username_pattern,
             alt_prompt_terminator=alt_prompt_term,
             **kwargs
@@ -827,7 +819,7 @@ class RadETXTelnet(RadETXBase):
     password&gt; ****
     &#34;&#34;&#34;
     self.TELNET_RETURN = self.RETURN
-    return super(RadETXTelnet, self).telnet_login(
+    return super().telnet_login(
         username_pattern=username_pattern,
         alt_prompt_terminator=alt_prompt_term,
         **kwargs
@@ -925,7 +917,7 @@ class RadETXTelnet(RadETXBase):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ruckus/index.html b/docs/netmiko/ruckus/index.html
index f5f2741ebe98efd656c2c3c1634c33b09cd99a4d..0acaca05dcb75bc3b18214bf6262bc722328945e 100644
--- a/docs/netmiko/ruckus/index.html
+++ b/docs/netmiko/ruckus/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ruckus API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.ruckus.ruckus_fastiron import RuckusFastironSSH
+<pre><code class="python">from netmiko.ruckus.ruckus_fastiron import RuckusFastironSSH
 from netmiko.ruckus.ruckus_fastiron import RuckusFastironTelnet
 
 __all__ = [&#34;RuckusFastironSSH&#34;, &#34;RuckusFastironTelnet&#34;]</code></pre>
@@ -47,7 +46,7 @@ __all__ = [&#34;RuckusFastironSSH&#34;, &#34;RuckusFastironTelnet&#34;]</code></
 <dl>
 <dt id="netmiko.ruckus.RuckusFastironSSH"><code class="flex name class">
 <span>class <span class="ident">RuckusFastironSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Ruckus FastIron aka ICX support.</p>
@@ -167,6 +166,10 @@ __all__ = [&#34;RuckusFastironSSH&#34;, &#34;RuckusFastironTelnet&#34;]</code></
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -350,6 +353,10 @@ __all__ = [&#34;RuckusFastironSSH&#34;, &#34;RuckusFastironTelnet&#34;]</code></
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -357,7 +364,7 @@ __all__ = [&#34;RuckusFastironSSH&#34;, &#34;RuckusFastironTelnet&#34;]</code></
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(RuckusFastironTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def _process_option(self, tsocket, command, option):
         &#34;&#34;&#34;
@@ -375,7 +382,7 @@ __all__ = [&#34;RuckusFastironSSH&#34;, &#34;RuckusFastironTelnet&#34;]</code></
     def telnet_login(self, *args, **kwargs):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(RuckusFastironTelnet, self).telnet_login(*args, **kwargs)</code></pre>
+        return super().telnet_login(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -465,7 +472,7 @@ __all__ = [&#34;RuckusFastironSSH&#34;, &#34;RuckusFastironTelnet&#34;]</code></
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ruckus/ruckus_fastiron.html b/docs/netmiko/ruckus/ruckus_fastiron.html
index 8318adc37ae85a62eb102701fd1b64c87905d1d0..2f7fbb269495d5f3e9498cbb0e9e86599bbce5c0 100644
--- a/docs/netmiko/ruckus/ruckus_fastiron.html
+++ b/docs/netmiko/ruckus/ruckus_fastiron.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ruckus.ruckus_fastiron API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import re
+<pre><code class="python">import re
 import time
 from telnetlib import DO, DONT, ECHO, IAC, WILL, WONT
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -70,8 +69,13 @@ class RuckusFastironBase(CiscoSSHConnection):
                     output += new_data
                 if &#34;ssword&#34; in new_data:
                     self.write_channel(self.normalize_cmd(self.secret))
-                    output += self.read_until_prompt()
-                    return output
+                    new_data = self.read_until_prompt()
+                    output += new_data
+                    if not re.search(
+                        r&#34;error.*incorrect.*password&#34;, new_data, flags=re.I
+                    ):
+                        return output
+
                 time.sleep(1)
                 i += 1
 
@@ -84,7 +88,7 @@ class RuckusFastironBase(CiscoSSHConnection):
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(RuckusFastironBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -93,7 +97,7 @@ class RuckusFastironTelnet(RuckusFastironBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(RuckusFastironTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def _process_option(self, tsocket, command, option):
         &#34;&#34;&#34;
@@ -111,7 +115,7 @@ class RuckusFastironTelnet(RuckusFastironBase):
     def telnet_login(self, *args, **kwargs):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(RuckusFastironTelnet, self).telnet_login(*args, **kwargs)
+        return super().telnet_login(*args, **kwargs)
 
 
 class RuckusFastironSSH(RuckusFastironBase):
@@ -129,7 +133,7 @@ class RuckusFastironSSH(RuckusFastironBase):
 <dl>
 <dt id="netmiko.ruckus.ruckus_fastiron.RuckusFastironBase"><code class="flex name class">
 <span>class <span class="ident">RuckusFastironBase</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Ruckus FastIron aka ICX support.</p>
@@ -249,6 +253,10 @@ class RuckusFastironSSH(RuckusFastironBase):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -293,8 +301,13 @@ class RuckusFastironSSH(RuckusFastironBase):
                     output += new_data
                 if &#34;ssword&#34; in new_data:
                     self.write_channel(self.normalize_cmd(self.secret))
-                    output += self.read_until_prompt()
-                    return output
+                    new_data = self.read_until_prompt()
+                    output += new_data
+                    if not re.search(
+                        r&#34;error.*incorrect.*password&#34;, new_data, flags=re.I
+                    ):
+                        return output
+
                 time.sleep(1)
                 i += 1
 
@@ -307,7 +320,7 @@ class RuckusFastironSSH(RuckusFastironBase):
 
     def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(RuckusFastironBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -364,8 +377,13 @@ SSH@Lab-ICX7250#</p></section>
                 output += new_data
             if &#34;ssword&#34; in new_data:
                 self.write_channel(self.normalize_cmd(self.secret))
-                output += self.read_until_prompt()
-                return output
+                new_data = self.read_until_prompt()
+                output += new_data
+                if not re.search(
+                    r&#34;error.*incorrect.*password&#34;, new_data, flags=re.I
+                ):
+                    return output
+
             time.sleep(1)
             i += 1
 
@@ -386,7 +404,7 @@ SSH@Lab-ICX7250#</p></section>
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write mem&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(RuckusFastironBase, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -457,7 +475,7 @@ SSH@Lab-ICX7250#</p></section>
 </dd>
 <dt id="netmiko.ruckus.ruckus_fastiron.RuckusFastironSSH"><code class="flex name class">
 <span>class <span class="ident">RuckusFastironSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Ruckus FastIron aka ICX support.</p>
@@ -577,6 +595,10 @@ SSH@Lab-ICX7250#</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -760,6 +782,10 @@ SSH@Lab-ICX7250#</p></section>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -767,7 +793,7 @@ SSH@Lab-ICX7250#</p></section>
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get(&#34;default_enter&#34;)
         kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
-        super(RuckusFastironTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def _process_option(self, tsocket, command, option):
         &#34;&#34;&#34;
@@ -785,7 +811,7 @@ SSH@Lab-ICX7250#</p></section>
     def telnet_login(self, *args, **kwargs):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(RuckusFastironTelnet, self).telnet_login(*args, **kwargs)</code></pre>
+        return super().telnet_login(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -878,7 +904,7 @@ SSH@Lab-ICX7250#</p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ruijie/index.html b/docs/netmiko/ruijie/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..2a90a9a3eed44e7d1a16ffb76a54509e9b0def08
--- /dev/null
+++ b/docs/netmiko/ruijie/index.html
@@ -0,0 +1,460 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.6.3" />
+<title>netmiko.ruijie API documentation</title>
+<meta name="description" content="" />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>netmiko.ruijie</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">from netmiko.ruijie.ruijie_os import RuijieOSSSH, RuijieOSTelnet
+
+__all__ = [&#34;RuijieOSSSH&#34;, &#34;RuijieOSTelnet&#34;]</code></pre>
+</details>
+</section>
+<section>
+<h2 class="section-title" id="header-submodules">Sub-modules</h2>
+<dl>
+<dt><code class="name"><a title="netmiko.ruijie.ruijie_os" href="ruijie_os.html">netmiko.ruijie.ruijie_os</a></code></dt>
+<dd>
+<section class="desc"><p>Ruijie RGOS Support</p></section>
+</dd>
+</dl>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="netmiko.ruijie.RuijieOSSSH"><code class="flex name class">
+<span>class <span class="ident">RuijieOSSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Base Class for cisco-like behavior.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class RuijieOSSSH(RuijieOSBase):
+
+    pass</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></li>
+<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.save_config" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+<dt id="netmiko.ruijie.RuijieOSTelnet"><code class="flex name class">
+<span>class <span class="ident">RuijieOSTelnet</span></span>
+<span>(</span><span>*args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Base Class for cisco-like behavior.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class RuijieOSTelnet(RuijieOSBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get(&#34;default_enter&#34;)
+        kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></li>
+<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.save_config" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation" href="ruijie_os.html#netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="netmiko" href="../index.html">netmiko</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-submodules">Sub-modules</a></h3>
+<ul>
+<li><code><a title="netmiko.ruijie.ruijie_os" href="ruijie_os.html">netmiko.ruijie.ruijie_os</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="netmiko.ruijie.RuijieOSSSH" href="#netmiko.ruijie.RuijieOSSSH">RuijieOSSSH</a></code></h4>
+</li>
+<li>
+<h4><code><a title="netmiko.ruijie.RuijieOSTelnet" href="#netmiko.ruijie.RuijieOSTelnet">RuijieOSTelnet</a></code></h4>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/netmiko/ruijie/ruijie_os.html b/docs/netmiko/ruijie/ruijie_os.html
new file mode 100644
index 0000000000000000000000000000000000000000..f8fa3bc53599da8edd66c7d315b0ef1b6d988bde
--- /dev/null
+++ b/docs/netmiko/ruijie/ruijie_os.html
@@ -0,0 +1,729 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.6.3" />
+<title>netmiko.ruijie.ruijie_os API documentation</title>
+<meta name="description" content="Ruijie RGOS Support" />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>netmiko.ruijie.ruijie_os</code></h1>
+</header>
+<section id="section-intro">
+<p>Ruijie RGOS Support</p>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">&#34;&#34;&#34;Ruijie RGOS Support&#34;&#34;&#34;
+from netmiko.cisco_base_connection import CiscoBaseConnection
+import time
+
+
+class RuijieOSBase(CiscoBaseConnection):
+    def session_preparation(self):
+        &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        self._test_channel_read(pattern=r&#34;[&gt;#]&#34;)
+        self.set_base_prompt()
+        &#34;&#34;&#34;Ruijie OS requires enable mode to set terminal width&#34;&#34;&#34;
+        self.enable()
+        self.disable_paging(command=&#34;terminal length 0&#34;)
+        self.set_terminal_width(command=&#34;terminal width 256&#34;)
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def save_config(self, cmd=&#34;write&#34;, confirm=False, confirm_response=&#34;&#34;):
+        &#34;&#34;&#34;Save config: write&#34;&#34;&#34;
+        return super().save_config(
+            cmd=cmd, confirm=confirm, confirm_response=confirm_response
+        )
+
+
+class RuijieOSSSH(RuijieOSBase):
+
+    pass
+
+
+class RuijieOSTelnet(RuijieOSBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get(&#34;default_enter&#34;)
+        kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="netmiko.ruijie.ruijie_os.RuijieOSBase"><code class="flex name class">
+<span>class <span class="ident">RuijieOSBase</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Base Class for cisco-like behavior.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class RuijieOSBase(CiscoBaseConnection):
+    def session_preparation(self):
+        &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+        self._test_channel_read(pattern=r&#34;[&gt;#]&#34;)
+        self.set_base_prompt()
+        &#34;&#34;&#34;Ruijie OS requires enable mode to set terminal width&#34;&#34;&#34;
+        self.enable()
+        self.disable_paging(command=&#34;terminal length 0&#34;)
+        self.set_terminal_width(command=&#34;terminal width 256&#34;)
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def save_config(self, cmd=&#34;write&#34;, confirm=False, confirm_response=&#34;&#34;):
+        &#34;&#34;&#34;Save config: write&#34;&#34;&#34;
+        return super().save_config(
+            cmd=cmd, confirm=confirm, confirm_response=confirm_response
+        )</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Subclasses</h3>
+<ul class="hlist">
+<li><a title="netmiko.ruijie.ruijie_os.RuijieOSSSH" href="#netmiko.ruijie.ruijie_os.RuijieOSSSH">RuijieOSSSH</a></li>
+<li><a title="netmiko.ruijie.ruijie_os.RuijieOSTelnet" href="#netmiko.ruijie.ruijie_os.RuijieOSTelnet">RuijieOSTelnet</a></li>
+</ul>
+<h3>Methods</h3>
+<dl>
+<dt id="netmiko.ruijie.ruijie_os.RuijieOSBase.save_config"><code class="name flex">
+<span>def <span class="ident">save_config</span></span>(<span>self, cmd='write', confirm=False, confirm_response='')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Save config: write</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def save_config(self, cmd=&#34;write&#34;, confirm=False, confirm_response=&#34;&#34;):
+    &#34;&#34;&#34;Save config: write&#34;&#34;&#34;
+    return super().save_config(
+        cmd=cmd, confirm=confirm, confirm_response=confirm_response
+    )</code></pre>
+</details>
+</dd>
+<dt id="netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation"><code class="name flex">
+<span>def <span class="ident">session_preparation</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Prepare the session after the connection has been established.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">def session_preparation(self):
+    &#34;&#34;&#34;Prepare the session after the connection has been established.&#34;&#34;&#34;
+    self._test_channel_read(pattern=r&#34;[&gt;#]&#34;)
+    self.set_base_prompt()
+    &#34;&#34;&#34;Ruijie OS requires enable mode to set terminal width&#34;&#34;&#34;
+    self.enable()
+    self.disable_paging(command=&#34;terminal length 0&#34;)
+    self.set_terminal_width(command=&#34;terminal width 256&#34;)
+    # Clear the read buffer
+    time.sleep(0.3 * self.global_delay_factor)
+    self.clear_buffer()</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.check_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.cisco_base_connection.CiscoBaseConnection.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+<dt id="netmiko.ruijie.ruijie_os.RuijieOSSSH"><code class="flex name class">
+<span>class <span class="ident">RuijieOSSSH</span></span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Base Class for cisco-like behavior.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class RuijieOSSSH(RuijieOSBase):
+
+    pass</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></li>
+<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.save_config" href="#netmiko.ruijie.ruijie_os.RuijieOSBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation" href="#netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+<dt id="netmiko.ruijie.ruijie_os.RuijieOSTelnet"><code class="flex name class">
+<span>class <span class="ident">RuijieOSTelnet</span></span>
+<span>(</span><span>*args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Base Class for cisco-like behavior.</p>
+<pre><code>    Initialize attributes for establishing connection to target device.
+
+    :param ip: IP address of target device. Not required if `host` is
+        provided.
+    :type ip: str
+
+    :param host: Hostname of target device. Not required if `ip` is
+            provided.
+    :type host: str
+
+    :param username: Username to authenticate against target device if
+            required.
+    :type username: str
+
+    :param password: Password to authenticate against target device if
+            required.
+    :type password: str
+
+    :param secret: The enable password if target device requires one.
+    :type secret: str
+
+    :param port: The destination port used to connect to the target
+            device.
+    :type port: int or None
+
+    :param device_type: Class selection based on device type.
+    :type device_type: str
+
+    :param verbose: Enable additional messages to standard output.
+    :type verbose: bool
+
+    :param global_delay_factor: Multiplication factor affecting Netmiko delays (default: 1).
+    :type global_delay_factor: int
+
+    :param use_keys: Connect to target device using SSH keys.
+    :type use_keys: bool
+
+    :param key_file: Filename path of the SSH key file to use.
+    :type key_file: str
+
+    :param pkey: SSH key object to use.
+    :type pkey: paramiko.PKey
+
+    :param passphrase: Passphrase to use for encrypted key; password will be used for key
+            decryption if not specified.
+    :type passphrase: str
+
+    :param allow_agent: Enable use of SSH key-agent.
+    :type allow_agent: bool
+
+    :param ssh_strict: Automatically reject unknown SSH host keys (default: False, which
+            means unknown SSH host keys will be accepted).
+    :type ssh_strict: bool
+
+    :param system_host_keys: Load host keys from the users known_hosts file.
+    :type system_host_keys: bool
+    :param alt_host_keys: If `True` host keys will be loaded from the file specified in
+            alt_key_file.
+    :type alt_host_keys: bool
+
+    :param alt_key_file: SSH host key file to use (if alt_host_keys=True).
+    :type alt_key_file: str
+
+    :param ssh_config_file: File name of OpenSSH configuration file.
+    :type ssh_config_file: str
+
+    :param timeout: Connection timeout.
+    :type timeout: float
+
+    :param session_timeout: Set a timeout for parallel requests.
+    :type session_timeout: float
+
+    :param auth_timeout: Set a timeout (in seconds) to wait for an authentication response.
+    :type auth_timeout: float
+
+    :param banner_timeout: Set a timeout to wait for the SSH banner (pass to Paramiko).
+    :type banner_timeout: float
+
+    :param keepalive: Send SSH keepalive packets at a specific interval, in seconds.
+            Currently defaults to 0, for backwards compatibility (it will not attempt
+            to keep the connection alive).
+    :type keepalive: int
+
+    :param default_enter: Character(s) to send to correspond to enter key (default:
+</code></pre>
+<p>).
+:type default_enter: str</p>
+<pre><code>    :param response_return: Character(s) to use in normalized return data to represent
+            enter key (default:
+</code></pre>
+<p>)
+:type response_return: str</p>
+<pre><code>    :param fast_cli: Provide a way to optimize for performance. Converts select_delay_factor
+            to select smallest of global and specific. Sets default global_delay_factor to .1
+            (default: False)
+    :type fast_cli: boolean
+
+    :param session_log: File path or BufferedIOBase subclass object to write the session log to.
+    :type session_log: str
+
+    :param session_log_record_writes: The session log generally only records channel reads due
+            to eliminate command duplication due to command echo. You can enable this if you
+            want to record both channel reads and channel writes in the log (default: False).
+    :type session_log_record_writes: boolean
+
+    :param session_log_file_mode: "write" or "append" for session_log file mode
+            (default: "write")
+    :type session_log_file_mode: str
+
+    :param allow_auto_change: Allow automatic configuration changes for terminal settings.
+            (default: False)
+    :type allow_auto_change: bool
+
+    :param encoding: Encoding to be used when writing bytes to the output channel.
+            (default: ascii)
+    :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
+</code></pre></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class RuijieOSTelnet(RuijieOSBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get(&#34;default_enter&#34;)
+        kwargs[&#34;default_enter&#34;] = &#34;\r\n&#34; if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></li>
+<li><a title="netmiko.cisco_base_connection.CiscoBaseConnection" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection">CiscoBaseConnection</a></li>
+<li><a title="netmiko.base_connection.BaseConnection" href="../base_connection.html#netmiko.base_connection.BaseConnection">BaseConnection</a></li>
+</ul>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></b></code>:
+<ul class="hlist">
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_config_mode">check_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.check_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.check_enable_mode">check_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.cleanup" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.cleanup">cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.clear_buffer" href="../base_connection.html#netmiko.base_connection.BaseConnection.clear_buffer">clear_buffer</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.close_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.close_session_log">close_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.commit" href="../base_connection.html#netmiko.base_connection.BaseConnection.commit">commit</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.config_mode">config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disable_paging" href="../base_connection.html#netmiko.base_connection.BaseConnection.disable_paging">disable_paging</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.disconnect" href="../base_connection.html#netmiko.base_connection.BaseConnection.disconnect">disconnect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.enable" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.enable">enable</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.establish_connection" href="../base_connection.html#netmiko.base_connection.BaseConnection.establish_connection">establish_connection</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_config_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_config_mode">exit_config_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.exit_enable_mode" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.exit_enable_mode">exit_enable_mode</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.find_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.find_prompt">find_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.is_alive" href="../base_connection.html#netmiko.base_connection.BaseConnection.is_alive">is_alive</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_cmd" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_cmd">normalize_cmd</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.normalize_linefeeds" href="../base_connection.html#netmiko.base_connection.BaseConnection.normalize_linefeeds">normalize_linefeeds</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.open_session_log" href="../base_connection.html#netmiko.base_connection.BaseConnection.open_session_log">open_session_log</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.paramiko_cleanup" href="../base_connection.html#netmiko.base_connection.BaseConnection.paramiko_cleanup">paramiko_cleanup</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_channel">read_channel</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_pattern">read_until_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt">read_until_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.read_until_prompt_or_pattern" href="../base_connection.html#netmiko.base_connection.BaseConnection.read_until_prompt_or_pattern">read_until_prompt_or_pattern</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.save_config" href="#netmiko.ruijie.ruijie_os.RuijieOSBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.select_delay_factor" href="../base_connection.html#netmiko.base_connection.BaseConnection.select_delay_factor">select_delay_factor</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command">send_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_expect" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_expect">send_command_expect</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_command_timing" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_command_timing">send_command_timing</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_from_file" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_from_file">send_config_from_file</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.send_config_set" href="../base_connection.html#netmiko.base_connection.BaseConnection.send_config_set">send_config_set</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation" href="#netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation">session_preparation</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_base_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_base_prompt">set_base_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.set_terminal_width" href="../base_connection.html#netmiko.base_connection.BaseConnection.set_terminal_width">set_terminal_width</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.special_login_handler" href="../base_connection.html#netmiko.base_connection.BaseConnection.special_login_handler">special_login_handler</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_ansi_escape_codes" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_ansi_escape_codes">strip_ansi_escape_codes</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_backspaces" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_backspaces">strip_backspaces</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_command" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_command">strip_command</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.strip_prompt" href="../base_connection.html#netmiko.base_connection.BaseConnection.strip_prompt">strip_prompt</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.telnet_login" href="../cisco_base_connection.html#netmiko.cisco_base_connection.CiscoBaseConnection.telnet_login">telnet_login</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.write_channel" href="../base_connection.html#netmiko.base_connection.BaseConnection.write_channel">write_channel</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="netmiko.ruijie" href="index.html">netmiko.ruijie</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase" href="#netmiko.ruijie.ruijie_os.RuijieOSBase">RuijieOSBase</a></code></h4>
+<ul class="">
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.save_config" href="#netmiko.ruijie.ruijie_os.RuijieOSBase.save_config">save_config</a></code></li>
+<li><code><a title="netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation" href="#netmiko.ruijie.ruijie_os.RuijieOSBase.session_preparation">session_preparation</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="netmiko.ruijie.ruijie_os.RuijieOSSSH" href="#netmiko.ruijie.ruijie_os.RuijieOSSSH">RuijieOSSSH</a></code></h4>
+</li>
+<li>
+<h4><code><a title="netmiko.ruijie.ruijie_os.RuijieOSTelnet" href="#netmiko.ruijie.ruijie_os.RuijieOSTelnet">RuijieOSTelnet</a></code></h4>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/netmiko/scp_functions.html b/docs/netmiko/scp_functions.html
index 01d0e66049e4857d5e1b90f68317e622b7b819cb..58f45a69f65c0ffcbc2a196403f76f15bfc73adc 100644
--- a/docs/netmiko/scp_functions.html
+++ b/docs/netmiko/scp_functions.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.scp_functions API documentation</title>
 <meta name="description" content="Netmiko SCP operations …" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -35,9 +35,6 @@ SCP requires a separate SSH connection for a control channel.
 
 Currently only supports Cisco IOS and Cisco ASA.
 &#34;&#34;&#34;
-from __future__ import print_function
-from __future__ import unicode_literals
-
 from netmiko import FileTransfer, InLineTransfer
 
 
@@ -57,6 +54,7 @@ def file_transfer(
     disable_md5=False,
     inline_transfer=False,
     overwrite_file=False,
+    socket_timeout=10.0,
 ):
     &#34;&#34;&#34;Use Secure Copy or Inline (IOS-only) to transfer files to/from network devices.
 
@@ -96,6 +94,7 @@ def file_transfer(
         &#34;source_file&#34;: source_file,
         &#34;dest_file&#34;: dest_file,
         &#34;direction&#34;: direction,
+        &#34;socket_timeout&#34;: socket_timeout,
     }
     if file_system is not None:
         scp_args[&#34;file_system&#34;] = file_system
@@ -148,7 +147,7 @@ def file_transfer(
 <h2 class="section-title" id="header-functions">Functions</h2>
 <dl>
 <dt id="netmiko.scp_functions.file_transfer"><code class="name flex">
-<span>def <span class="ident">file_transfer</span></span>(<span>ssh_conn, source_file, dest_file, file_system=None, direction='put', disable_md5=False, inline_transfer=False, overwrite_file=False)</span>
+<span>def <span class="ident">file_transfer</span></span>(<span>ssh_conn, source_file, dest_file, file_system=None, direction='put', disable_md5=False, inline_transfer=False, overwrite_file=False, socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Use Secure Copy or Inline (IOS-only) to transfer files to/from network devices.</p>
@@ -169,6 +168,7 @@ def file_transfer(
     disable_md5=False,
     inline_transfer=False,
     overwrite_file=False,
+    socket_timeout=10.0,
 ):
     &#34;&#34;&#34;Use Secure Copy or Inline (IOS-only) to transfer files to/from network devices.
 
@@ -208,6 +208,7 @@ def file_transfer(
         &#34;source_file&#34;: source_file,
         &#34;dest_file&#34;: dest_file,
         &#34;direction&#34;: direction,
+        &#34;socket_timeout&#34;: socket_timeout,
     }
     if file_system is not None:
         scp_args[&#34;file_system&#34;] = file_system
@@ -292,7 +293,7 @@ def file_transfer(
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/scp_handler.html b/docs/netmiko/scp_handler.html
index c94df15ba8f5018c5dbde982b899a659ba866b41..20604c85b543d8e6cd58df804f827bbdc723587b 100644
--- a/docs/netmiko/scp_handler.html
+++ b/docs/netmiko/scp_handler.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.scp_handler API documentation</title>
 <meta name="description" content="Netmiko SCP operations …" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -35,14 +35,12 @@ SCP requires a separate SSH connection for a control channel.
 
 Currently only supports Cisco IOS and Cisco ASA.
 &#34;&#34;&#34;
-from __future__ import print_function
-from __future__ import unicode_literals
-
 import re
 import os
 import hashlib
 
 import scp
+import platform
 
 
 class SCPConn(object):
@@ -52,8 +50,9 @@ class SCPConn(object):
     Must close the SCP connection to get the file to write to the remote filesystem
     &#34;&#34;&#34;
 
-    def __init__(self, ssh_conn):
+    def __init__(self, ssh_conn, socket_timeout=10.0):
         self.ssh_ctl_chan = ssh_conn
+        self.socket_timeout = socket_timeout
         self.establish_scp_conn()
 
     def establish_scp_conn(self):
@@ -61,7 +60,9 @@ class SCPConn(object):
         ssh_connect_params = self.ssh_ctl_chan._connect_params_dict()
         self.scp_conn = self.ssh_ctl_chan._build_ssh_client()
         self.scp_conn.connect(**ssh_connect_params)
-        self.scp_client = scp.SCPClient(self.scp_conn.get_transport())
+        self.scp_client = scp.SCPClient(
+            self.scp_conn.get_transport(), socket_timeout=self.socket_timeout
+        )
 
     def scp_transfer_file(self, source_file, dest_file):
         &#34;&#34;&#34;Put file using SCP (for backwards compatibility).&#34;&#34;&#34;
@@ -84,12 +85,19 @@ class BaseFileTransfer(object):
     &#34;&#34;&#34;Class to manage SCP file transfer and associated SSH control channel.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=None, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=None,
+        direction=&#34;put&#34;,
+        socket_timeout=10.0,
     ):
         self.ssh_ctl_chan = ssh_conn
         self.source_file = source_file
         self.dest_file = dest_file
         self.direction = direction
+        self.socket_timeout = socket_timeout
 
         auto_flag = (
             &#34;cisco_ios&#34; in ssh_conn.device_type
@@ -124,7 +132,7 @@ class BaseFileTransfer(object):
 
     def establish_scp_conn(self):
         &#34;&#34;&#34;Establish SCP connection.&#34;&#34;&#34;
-        self.scp_conn = SCPConn(self.ssh_ctl_chan)
+        self.scp_conn = SCPConn(self.ssh_ctl_chan, socket_timeout=self.socket_timeout)
 
     def close_scp_chan(self):
         &#34;&#34;&#34;Close the SCP connection to the remote network device.&#34;&#34;&#34;
@@ -133,7 +141,7 @@ class BaseFileTransfer(object):
 
     def remote_space_available(self, search_pattern=r&#34;(\d+) \w+ free&#34;):
         &#34;&#34;&#34;Return space available on remote device.&#34;&#34;&#34;
-        remote_cmd = &#34;dir {}&#34;.format(self.file_system)
+        remote_cmd = f&#34;dir {self.file_system}&#34;
         remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         match = re.search(search_pattern, remote_output)
         if &#34;kbytes&#34; in match.group(0) or &#34;Kbytes&#34; in match.group(0):
@@ -143,7 +151,7 @@ class BaseFileTransfer(object):
     def _remote_space_available_unix(self, search_pattern=&#34;&#34;):
         &#34;&#34;&#34;Return space available on *nix system (BSD/Linux).&#34;&#34;&#34;
         self.ssh_ctl_chan._enter_shell()
-        remote_cmd = &#34;/bin/df -k {}&#34;.format(self.file_system)
+        remote_cmd = f&#34;/bin/df -k {self.file_system}&#34;
         remote_output = self.ssh_ctl_chan.send_command(
             remote_cmd, expect_string=r&#34;[\$#]&#34;
         )
@@ -177,8 +185,17 @@ class BaseFileTransfer(object):
 
     def local_space_available(self):
         &#34;&#34;&#34;Return space available on local filesystem.&#34;&#34;&#34;
-        destination_stats = os.statvfs(&#34;.&#34;)
-        return destination_stats.f_bsize * destination_stats.f_bavail
+        if platform.system() == &#34;Windows&#34;:
+            import ctypes
+
+            free_bytes = ctypes.c_ulonglong(0)
+            ctypes.windll.kernel32.GetDiskFreeSpaceExW(
+                ctypes.c_wchar_p(&#34;.&#34;), None, None, ctypes.pointer(free_bytes)
+            )
+            return free_bytes.value
+        else:
+            destination_stats = os.statvfs(&#34;.&#34;)
+            return destination_stats.f_bsize * destination_stats.f_bavail
 
     def verify_space_available(self, search_pattern=r&#34;(\d+) \w+ free&#34;):
         &#34;&#34;&#34;Verify sufficient space is available on destination file system (return boolean).&#34;&#34;&#34;
@@ -194,7 +211,7 @@ class BaseFileTransfer(object):
         &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
         if self.direction == &#34;put&#34;:
             if not remote_cmd:
-                remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, self.dest_file)
+                remote_cmd = f&#34;dir {self.file_system}/{self.dest_file}&#34;
             remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
             search_string = r&#34;Directory of .*{0}&#34;.format(self.dest_file)
             if (
@@ -214,7 +231,7 @@ class BaseFileTransfer(object):
         &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
         if self.direction == &#34;put&#34;:
             self.ssh_ctl_chan._enter_shell()
-            remote_cmd = &#34;ls {}&#34;.format(self.file_system)
+            remote_cmd = f&#34;ls {self.file_system}&#34;
             remote_out = self.ssh_ctl_chan.send_command(
                 remote_cmd, expect_string=r&#34;[\$#]&#34;
             )
@@ -231,7 +248,7 @@ class BaseFileTransfer(object):
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
         if not remote_cmd:
-            remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, remote_file)
+            remote_cmd = f&#34;dir {self.file_system}/{remote_file}&#34;
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         # Strip out &#34;Directory of flash:/filename line
         remote_out = re.split(r&#34;Directory of .*&#34;, remote_out)
@@ -256,9 +273,9 @@ class BaseFileTransfer(object):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_file = &#34;{}/{}&#34;.format(self.file_system, remote_file)
+        remote_file = f&#34;{self.file_system}/{remote_file}&#34;
         if not remote_cmd:
-            remote_cmd = &#34;ls -l {}&#34;.format(remote_file)
+            remote_cmd = f&#34;ls -l {remote_file}&#34;
 
         self.ssh_ctl_chan._enter_shell()
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd, expect_string=r&#34;[\$#]&#34;)
@@ -280,12 +297,27 @@ class BaseFileTransfer(object):
             &#34;Search pattern not found for remote file size during SCP transfer.&#34;
         )
 
-    def file_md5(self, file_name):
-        &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
+    def file_md5(self, file_name, add_newline=False):
+        &#34;&#34;&#34;Compute MD5 hash of file.
+
+        add_newline is needed to support Cisco IOS MD5 calculation which expects the newline in
+        the string
+
+        Args:
+          file_name: name of file to get md5 digest of
+          add_newline: add newline to end of file contents or not
+
+        &#34;&#34;&#34;
+        file_hash = hashlib.md5()
         with open(file_name, &#34;rb&#34;) as f:
-            file_contents = f.read()
-            file_hash = hashlib.md5(file_contents).hexdigest()
-        return file_hash
+            while True:
+                file_contents = f.read(512)
+                if not file_contents:
+                    if add_newline:
+                        file_contents + b&#34;\n&#34;
+                    break
+                file_hash.update(file_contents)
+        return file_hash.hexdigest()
 
     @staticmethod
     def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
@@ -300,7 +332,7 @@ class BaseFileTransfer(object):
         if match:
             return match.group(1)
         else:
-            raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))
+            raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)
 
     def compare_md5(self):
         &#34;&#34;&#34;Compare md5 of file on network device to md5 of local file.&#34;&#34;&#34;
@@ -321,7 +353,7 @@ class BaseFileTransfer(object):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5
@@ -335,13 +367,13 @@ class BaseFileTransfer(object):
 
     def get_file(self):
         &#34;&#34;&#34;SCP copy the file from the remote device to local system.&#34;&#34;&#34;
-        source_file = &#34;{}/{}&#34;.format(self.file_system, self.source_file)
+        source_file = f&#34;{self.file_system}/{self.source_file}&#34;
         self.scp_conn.scp_get_file(source_file, self.dest_file)
         self.scp_conn.close()
 
     def put_file(self):
         &#34;&#34;&#34;SCP copy the file from the local system to the remote device.&#34;&#34;&#34;
-        destination = &#34;{}/{}&#34;.format(self.file_system, self.dest_file)
+        destination = f&#34;{self.file_system}/{self.dest_file}&#34;
         self.scp_conn.scp_transfer_file(self.source_file, destination)
         # Must close the SCP connection to get the file written (flush)
         self.scp_conn.close()
@@ -386,7 +418,7 @@ class BaseFileTransfer(object):
 <dl>
 <dt id="netmiko.scp_handler.BaseFileTransfer"><code class="flex name class">
 <span>class <span class="ident">BaseFileTransfer</span></span>
-<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put')</span>
+<span>(</span><span>ssh_conn, source_file, dest_file, file_system=None, direction='put', socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Class to manage SCP file transfer and associated SSH control channel.</p></section>
@@ -396,12 +428,19 @@ class BaseFileTransfer(object):
     &#34;&#34;&#34;Class to manage SCP file transfer and associated SSH control channel.&#34;&#34;&#34;
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=None, direction=&#34;put&#34;
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=None,
+        direction=&#34;put&#34;,
+        socket_timeout=10.0,
     ):
         self.ssh_ctl_chan = ssh_conn
         self.source_file = source_file
         self.dest_file = dest_file
         self.direction = direction
+        self.socket_timeout = socket_timeout
 
         auto_flag = (
             &#34;cisco_ios&#34; in ssh_conn.device_type
@@ -436,7 +475,7 @@ class BaseFileTransfer(object):
 
     def establish_scp_conn(self):
         &#34;&#34;&#34;Establish SCP connection.&#34;&#34;&#34;
-        self.scp_conn = SCPConn(self.ssh_ctl_chan)
+        self.scp_conn = SCPConn(self.ssh_ctl_chan, socket_timeout=self.socket_timeout)
 
     def close_scp_chan(self):
         &#34;&#34;&#34;Close the SCP connection to the remote network device.&#34;&#34;&#34;
@@ -445,7 +484,7 @@ class BaseFileTransfer(object):
 
     def remote_space_available(self, search_pattern=r&#34;(\d+) \w+ free&#34;):
         &#34;&#34;&#34;Return space available on remote device.&#34;&#34;&#34;
-        remote_cmd = &#34;dir {}&#34;.format(self.file_system)
+        remote_cmd = f&#34;dir {self.file_system}&#34;
         remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         match = re.search(search_pattern, remote_output)
         if &#34;kbytes&#34; in match.group(0) or &#34;Kbytes&#34; in match.group(0):
@@ -455,7 +494,7 @@ class BaseFileTransfer(object):
     def _remote_space_available_unix(self, search_pattern=&#34;&#34;):
         &#34;&#34;&#34;Return space available on *nix system (BSD/Linux).&#34;&#34;&#34;
         self.ssh_ctl_chan._enter_shell()
-        remote_cmd = &#34;/bin/df -k {}&#34;.format(self.file_system)
+        remote_cmd = f&#34;/bin/df -k {self.file_system}&#34;
         remote_output = self.ssh_ctl_chan.send_command(
             remote_cmd, expect_string=r&#34;[\$#]&#34;
         )
@@ -489,8 +528,17 @@ class BaseFileTransfer(object):
 
     def local_space_available(self):
         &#34;&#34;&#34;Return space available on local filesystem.&#34;&#34;&#34;
-        destination_stats = os.statvfs(&#34;.&#34;)
-        return destination_stats.f_bsize * destination_stats.f_bavail
+        if platform.system() == &#34;Windows&#34;:
+            import ctypes
+
+            free_bytes = ctypes.c_ulonglong(0)
+            ctypes.windll.kernel32.GetDiskFreeSpaceExW(
+                ctypes.c_wchar_p(&#34;.&#34;), None, None, ctypes.pointer(free_bytes)
+            )
+            return free_bytes.value
+        else:
+            destination_stats = os.statvfs(&#34;.&#34;)
+            return destination_stats.f_bsize * destination_stats.f_bavail
 
     def verify_space_available(self, search_pattern=r&#34;(\d+) \w+ free&#34;):
         &#34;&#34;&#34;Verify sufficient space is available on destination file system (return boolean).&#34;&#34;&#34;
@@ -506,7 +554,7 @@ class BaseFileTransfer(object):
         &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
         if self.direction == &#34;put&#34;:
             if not remote_cmd:
-                remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, self.dest_file)
+                remote_cmd = f&#34;dir {self.file_system}/{self.dest_file}&#34;
             remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
             search_string = r&#34;Directory of .*{0}&#34;.format(self.dest_file)
             if (
@@ -526,7 +574,7 @@ class BaseFileTransfer(object):
         &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
         if self.direction == &#34;put&#34;:
             self.ssh_ctl_chan._enter_shell()
-            remote_cmd = &#34;ls {}&#34;.format(self.file_system)
+            remote_cmd = f&#34;ls {self.file_system}&#34;
             remote_out = self.ssh_ctl_chan.send_command(
                 remote_cmd, expect_string=r&#34;[\$#]&#34;
             )
@@ -543,7 +591,7 @@ class BaseFileTransfer(object):
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
         if not remote_cmd:
-            remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, remote_file)
+            remote_cmd = f&#34;dir {self.file_system}/{remote_file}&#34;
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         # Strip out &#34;Directory of flash:/filename line
         remote_out = re.split(r&#34;Directory of .*&#34;, remote_out)
@@ -568,9 +616,9 @@ class BaseFileTransfer(object):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_file = &#34;{}/{}&#34;.format(self.file_system, remote_file)
+        remote_file = f&#34;{self.file_system}/{remote_file}&#34;
         if not remote_cmd:
-            remote_cmd = &#34;ls -l {}&#34;.format(remote_file)
+            remote_cmd = f&#34;ls -l {remote_file}&#34;
 
         self.ssh_ctl_chan._enter_shell()
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd, expect_string=r&#34;[\$#]&#34;)
@@ -592,12 +640,27 @@ class BaseFileTransfer(object):
             &#34;Search pattern not found for remote file size during SCP transfer.&#34;
         )
 
-    def file_md5(self, file_name):
-        &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
+    def file_md5(self, file_name, add_newline=False):
+        &#34;&#34;&#34;Compute MD5 hash of file.
+
+        add_newline is needed to support Cisco IOS MD5 calculation which expects the newline in
+        the string
+
+        Args:
+          file_name: name of file to get md5 digest of
+          add_newline: add newline to end of file contents or not
+
+        &#34;&#34;&#34;
+        file_hash = hashlib.md5()
         with open(file_name, &#34;rb&#34;) as f:
-            file_contents = f.read()
-            file_hash = hashlib.md5(file_contents).hexdigest()
-        return file_hash
+            while True:
+                file_contents = f.read(512)
+                if not file_contents:
+                    if add_newline:
+                        file_contents + b&#34;\n&#34;
+                    break
+                file_hash.update(file_contents)
+        return file_hash.hexdigest()
 
     @staticmethod
     def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
@@ -612,7 +675,7 @@ class BaseFileTransfer(object):
         if match:
             return match.group(1)
         else:
-            raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))
+            raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)
 
     def compare_md5(self):
         &#34;&#34;&#34;Compare md5 of file on network device to md5 of local file.&#34;&#34;&#34;
@@ -633,7 +696,7 @@ class BaseFileTransfer(object):
                 remote_file = self.dest_file
             elif self.direction == &#34;get&#34;:
                 remote_file = self.source_file
-        remote_md5_cmd = &#34;{} {}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5
@@ -647,13 +710,13 @@ class BaseFileTransfer(object):
 
     def get_file(self):
         &#34;&#34;&#34;SCP copy the file from the remote device to local system.&#34;&#34;&#34;
-        source_file = &#34;{}/{}&#34;.format(self.file_system, self.source_file)
+        source_file = f&#34;{self.file_system}/{self.source_file}&#34;
         self.scp_conn.scp_get_file(source_file, self.dest_file)
         self.scp_conn.close()
 
     def put_file(self):
         &#34;&#34;&#34;SCP copy the file from the local system to the remote device.&#34;&#34;&#34;
-        destination = &#34;{}/{}&#34;.format(self.file_system, self.dest_file)
+        destination = f&#34;{self.file_system}/{self.dest_file}&#34;
         self.scp_conn.scp_transfer_file(self.source_file, destination)
         # Must close the SCP connection to get the file written (flush)
         self.scp_conn.close()
@@ -689,6 +752,7 @@ class BaseFileTransfer(object):
 <h3>Subclasses</h3>
 <ul class="hlist">
 <li><a title="netmiko.cisco_base_connection.CiscoFileTransfer" href="cisco_base_connection.html#netmiko.cisco_base_connection.CiscoFileTransfer">CiscoFileTransfer</a></li>
+<li><a title="netmiko.ciena.ciena_saos.CienaSaosFileTransfer" href="ciena/ciena_saos.html#netmiko.ciena.ciena_saos.CienaSaosFileTransfer">CienaSaosFileTransfer</a></li>
 <li><a title="netmiko.dell.dell_os10_ssh.DellOS10FileTransfer" href="dell/dell_os10_ssh.html#netmiko.dell.dell_os10_ssh.DellOS10FileTransfer">DellOS10FileTransfer</a></li>
 <li><a title="netmiko.juniper.juniper.JuniperFileTransfer" href="juniper/juniper.html#netmiko.juniper.juniper.JuniperFileTransfer">JuniperFileTransfer</a></li>
 </ul>
@@ -717,7 +781,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
     if match:
         return match.group(1)
     else:
-        raise ValueError(&#34;Invalid output from MD5 command: {}&#34;.format(md5_output))</code></pre>
+        raise ValueError(f&#34;Invalid output from MD5 command: {md5_output}&#34;)</code></pre>
 </details>
 </dd>
 </dl>
@@ -734,7 +798,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
     &#34;&#34;&#34;Check if the dest_file already exists on the file system (return boolean).&#34;&#34;&#34;
     if self.direction == &#34;put&#34;:
         if not remote_cmd:
-            remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, self.dest_file)
+            remote_cmd = f&#34;dir {self.file_system}/{self.dest_file}&#34;
         remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         search_string = r&#34;Directory of .*{0}&#34;.format(self.dest_file)
         if (
@@ -832,22 +896,46 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
 <summary>Source code</summary>
 <pre><code class="python">def establish_scp_conn(self):
     &#34;&#34;&#34;Establish SCP connection.&#34;&#34;&#34;
-    self.scp_conn = SCPConn(self.ssh_ctl_chan)</code></pre>
+    self.scp_conn = SCPConn(self.ssh_ctl_chan, socket_timeout=self.socket_timeout)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.scp_handler.BaseFileTransfer.file_md5"><code class="name flex">
-<span>def <span class="ident">file_md5</span></span>(<span>self, file_name)</span>
+<span>def <span class="ident">file_md5</span></span>(<span>self, file_name, add_newline=False)</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Compute MD5 hash of file.</p></section>
+<section class="desc"><p>Compute MD5 hash of file.</p>
+<p>add_newline is needed to support Cisco IOS MD5 calculation which expects the newline in
+the string</p>
+<h2 id="args">Args</h2>
+<dl>
+<dt><strong><code>file_name</code></strong></dt>
+<dd>name of file to get md5 digest of</dd>
+<dt><strong><code>add_newline</code></strong></dt>
+<dd>add newline to end of file contents or not</dd>
+</dl></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def file_md5(self, file_name):
-    &#34;&#34;&#34;Compute MD5 hash of file.&#34;&#34;&#34;
+<pre><code class="python">def file_md5(self, file_name, add_newline=False):
+    &#34;&#34;&#34;Compute MD5 hash of file.
+
+    add_newline is needed to support Cisco IOS MD5 calculation which expects the newline in
+    the string
+
+    Args:
+      file_name: name of file to get md5 digest of
+      add_newline: add newline to end of file contents or not
+
+    &#34;&#34;&#34;
+    file_hash = hashlib.md5()
     with open(file_name, &#34;rb&#34;) as f:
-        file_contents = f.read()
-        file_hash = hashlib.md5(file_contents).hexdigest()
-    return file_hash</code></pre>
+        while True:
+            file_contents = f.read(512)
+            if not file_contents:
+                if add_newline:
+                    file_contents + b&#34;\n&#34;
+                break
+            file_hash.update(file_contents)
+    return file_hash.hexdigest()</code></pre>
 </details>
 </dd>
 <dt id="netmiko.scp_handler.BaseFileTransfer.get_file"><code class="name flex">
@@ -859,7 +947,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
 <summary>Source code</summary>
 <pre><code class="python">def get_file(self):
     &#34;&#34;&#34;SCP copy the file from the remote device to local system.&#34;&#34;&#34;
-    source_file = &#34;{}/{}&#34;.format(self.file_system, self.source_file)
+    source_file = f&#34;{self.file_system}/{self.source_file}&#34;
     self.scp_conn.scp_get_file(source_file, self.dest_file)
     self.scp_conn.close()</code></pre>
 </details>
@@ -873,8 +961,17 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
 <summary>Source code</summary>
 <pre><code class="python">def local_space_available(self):
     &#34;&#34;&#34;Return space available on local filesystem.&#34;&#34;&#34;
-    destination_stats = os.statvfs(&#34;.&#34;)
-    return destination_stats.f_bsize * destination_stats.f_bavail</code></pre>
+    if platform.system() == &#34;Windows&#34;:
+        import ctypes
+
+        free_bytes = ctypes.c_ulonglong(0)
+        ctypes.windll.kernel32.GetDiskFreeSpaceExW(
+            ctypes.c_wchar_p(&#34;.&#34;), None, None, ctypes.pointer(free_bytes)
+        )
+        return free_bytes.value
+    else:
+        destination_stats = os.statvfs(&#34;.&#34;)
+        return destination_stats.f_bsize * destination_stats.f_bavail</code></pre>
 </details>
 </dd>
 <dt id="netmiko.scp_handler.BaseFileTransfer.put_file"><code class="name flex">
@@ -886,7 +983,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
 <summary>Source code</summary>
 <pre><code class="python">def put_file(self):
     &#34;&#34;&#34;SCP copy the file from the local system to the remote device.&#34;&#34;&#34;
-    destination = &#34;{}/{}&#34;.format(self.file_system, self.dest_file)
+    destination = f&#34;{self.file_system}/{self.dest_file}&#34;
     self.scp_conn.scp_transfer_file(self.source_file, destination)
     # Must close the SCP connection to get the file written (flush)
     self.scp_conn.close()</code></pre>
@@ -907,7 +1004,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
         elif self.direction == &#34;get&#34;:
             remote_file = self.source_file
     if not remote_cmd:
-        remote_cmd = &#34;dir {}/{}&#34;.format(self.file_system, remote_file)
+        remote_cmd = f&#34;dir {self.file_system}/{remote_file}&#34;
     remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
     # Strip out &#34;Directory of flash:/filename line
     remote_out = re.split(r&#34;Directory of .*&#34;, remote_out)
@@ -944,7 +1041,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
             remote_file = self.dest_file
         elif self.direction == &#34;get&#34;:
             remote_file = self.source_file
-    remote_md5_cmd = &#34;{} {}/{}&#34;.format(base_cmd, self.file_system, remote_file)
+    remote_md5_cmd = f&#34;{base_cmd} {self.file_system}/{remote_file}&#34;
     dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
     dest_md5 = self.process_md5(dest_md5)
     return dest_md5</code></pre>
@@ -959,7 +1056,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
 <summary>Source code</summary>
 <pre><code class="python">def remote_space_available(self, search_pattern=r&#34;(\d+) \w+ free&#34;):
     &#34;&#34;&#34;Return space available on remote device.&#34;&#34;&#34;
-    remote_cmd = &#34;dir {}&#34;.format(self.file_system)
+    remote_cmd = f&#34;dir {self.file_system}&#34;
     remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
     match = re.search(search_pattern, remote_output)
     if &#34;kbytes&#34; in match.group(0) or &#34;Kbytes&#34; in match.group(0):
@@ -1016,7 +1113,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
 </dd>
 <dt id="netmiko.scp_handler.SCPConn"><code class="flex name class">
 <span>class <span class="ident">SCPConn</span></span>
-<span>(</span><span>ssh_conn)</span>
+<span>(</span><span>ssh_conn, socket_timeout=10.0)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Establish a secure copy channel to the remote network device.</p>
@@ -1030,8 +1127,9 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
     Must close the SCP connection to get the file to write to the remote filesystem
     &#34;&#34;&#34;
 
-    def __init__(self, ssh_conn):
+    def __init__(self, ssh_conn, socket_timeout=10.0):
         self.ssh_ctl_chan = ssh_conn
+        self.socket_timeout = socket_timeout
         self.establish_scp_conn()
 
     def establish_scp_conn(self):
@@ -1039,7 +1137,9 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
         ssh_connect_params = self.ssh_ctl_chan._connect_params_dict()
         self.scp_conn = self.ssh_ctl_chan._build_ssh_client()
         self.scp_conn.connect(**ssh_connect_params)
-        self.scp_client = scp.SCPClient(self.scp_conn.get_transport())
+        self.scp_client = scp.SCPClient(
+            self.scp_conn.get_transport(), socket_timeout=self.socket_timeout
+        )
 
     def scp_transfer_file(self, source_file, dest_file):
         &#34;&#34;&#34;Put file using SCP (for backwards compatibility).&#34;&#34;&#34;
@@ -1083,7 +1183,9 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
     ssh_connect_params = self.ssh_ctl_chan._connect_params_dict()
     self.scp_conn = self.ssh_ctl_chan._build_ssh_client()
     self.scp_conn.connect(**ssh_connect_params)
-    self.scp_client = scp.SCPClient(self.scp_conn.get_transport())</code></pre>
+    self.scp_client = scp.SCPClient(
+        self.scp_conn.get_transport(), socket_timeout=self.socket_timeout
+    )</code></pre>
 </details>
 </dd>
 <dt id="netmiko.scp_handler.SCPConn.scp_get_file"><code class="name flex">
@@ -1178,7 +1280,7 @@ def process_md5(md5_output, pattern=r&#34;=\s+(\S+)&#34;):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/snmp_autodetect.html b/docs/netmiko/snmp_autodetect.html
index 4aace345b1a5de3a186f9a175ca5d54e5cb7538b..a565b98a277f28d2fa5db50dedc4fee69246e807 100644
--- a/docs/netmiko/snmp_autodetect.html
+++ b/docs/netmiko/snmp_autodetect.html
@@ -3,14 +3,14 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.snmp_autodetect API documentation</title>
 <meta name="description" content="This module is used to auto-detect the type of a device in order to automatically create a
 Netmiko connection …" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -58,8 +58,6 @@ SNMPDetect class defaults to SNMPv3
 Note, pysnmp is a required dependency for SNMPDetect and is intentionally not included in
 netmiko requirements. So installation of pysnmp might be required.
 &#34;&#34;&#34;
-from __future__ import unicode_literals
-
 import re
 
 try:
@@ -68,7 +66,6 @@ except ImportError:
     raise ImportError(&#34;pysnmp not installed; please install it: &#39;pip install pysnmp&#39;&#34;)
 
 from netmiko.ssh_dispatcher import CLASS_MAPPER
-from netmiko.py23_compat import text_type
 
 
 # Higher priority indicates a better match.
@@ -85,7 +82,7 @@ SNMP_MAPPER_BASE = {
     },
     &#34;hp_comware&#34;: {
         &#34;oid&#34;: &#34;.1.3.6.1.2.1.1.1.0&#34;,
-        &#34;expr&#34;: re.compile(r&#34;.*HP Comware.*&#34;, re.IGNORECASE),
+        &#34;expr&#34;: re.compile(r&#34;.*HP(E)? Comware.*&#34;, re.IGNORECASE),
         &#34;priority&#34;: 99,
     },
     &#34;hp_procurve&#34;: {
@@ -143,6 +140,11 @@ SNMP_MAPPER_BASE = {
         &#34;expr&#34;: re.compile(r&#34;.*Juniper.*&#34;),
         &#34;priority&#34;: 99,
     },
+    &#34;nokia_sros&#34;: {
+        &#34;oid&#34;: &#34;.1.3.6.1.2.1.1.1.0&#34;,
+        &#34;expr&#34;: re.compile(r&#34;.*TiMOS.*&#34;),
+        &#34;priority&#34;: 99,
+    },
 }
 
 # Ensure all SNMP device types are supported by Netmiko
@@ -300,7 +302,7 @@ class SNMPDetect(object):
         )
 
         if not error_detected and snmp_data[0][1]:
-            return text_type(snmp_data[0][1])
+            return str(snmp_data[0][1])
         return &#34;&#34;
 
     def _get_snmpv2c(self, oid):
@@ -329,7 +331,7 @@ class SNMPDetect(object):
         )
 
         if not error_detected and snmp_data[0][1]:
-            return text_type(snmp_data[0][1])
+            return str(snmp_data[0][1])
         return &#34;&#34;
 
     def _get_snmp(self, oid):
@@ -366,16 +368,16 @@ class SNMPDetect(object):
                 oid = v[&#34;oid&#34;]
                 regex = v[&#34;expr&#34;]
 
-            # Used cache data if we already queryied this OID
-            if self._response_cache.get(oid):
-                snmp_response = self._response_cache.get(oid)
-            else:
-                snmp_response = self._get_snmp(oid)
-                self._response_cache[oid] = snmp_response
+                # Used cache data if we already queryied this OID
+                if self._response_cache.get(oid):
+                    snmp_response = self._response_cache.get(oid)
+                else:
+                    snmp_response = self._get_snmp(oid)
+                    self._response_cache[oid] = snmp_response
 
-            # See if we had a match
-            if re.search(regex, snmp_response):
-                return device_type
+                # See if we had a match
+                if re.search(regex, snmp_response):
+                    return device_type
 
         return None</code></pre>
 </details>
@@ -590,7 +592,7 @@ Try to determine the device type.</p></section>
         )
 
         if not error_detected and snmp_data[0][1]:
-            return text_type(snmp_data[0][1])
+            return str(snmp_data[0][1])
         return &#34;&#34;
 
     def _get_snmpv2c(self, oid):
@@ -619,7 +621,7 @@ Try to determine the device type.</p></section>
         )
 
         if not error_detected and snmp_data[0][1]:
-            return text_type(snmp_data[0][1])
+            return str(snmp_data[0][1])
         return &#34;&#34;
 
     def _get_snmp(self, oid):
@@ -656,16 +658,16 @@ Try to determine the device type.</p></section>
                 oid = v[&#34;oid&#34;]
                 regex = v[&#34;expr&#34;]
 
-            # Used cache data if we already queryied this OID
-            if self._response_cache.get(oid):
-                snmp_response = self._response_cache.get(oid)
-            else:
-                snmp_response = self._get_snmp(oid)
-                self._response_cache[oid] = snmp_response
+                # Used cache data if we already queryied this OID
+                if self._response_cache.get(oid):
+                    snmp_response = self._response_cache.get(oid)
+                else:
+                    snmp_response = self._get_snmp(oid)
+                    self._response_cache[oid] = snmp_response
 
-            # See if we had a match
-            if re.search(regex, snmp_response):
-                return device_type
+                # See if we had a match
+                if re.search(regex, snmp_response):
+                    return device_type
 
         return None</code></pre>
 </details>
@@ -713,16 +715,16 @@ dict.</p>
             oid = v[&#34;oid&#34;]
             regex = v[&#34;expr&#34;]
 
-        # Used cache data if we already queryied this OID
-        if self._response_cache.get(oid):
-            snmp_response = self._response_cache.get(oid)
-        else:
-            snmp_response = self._get_snmp(oid)
-            self._response_cache[oid] = snmp_response
+            # Used cache data if we already queryied this OID
+            if self._response_cache.get(oid):
+                snmp_response = self._response_cache.get(oid)
+            else:
+                snmp_response = self._get_snmp(oid)
+                self._response_cache[oid] = snmp_response
 
-        # See if we had a match
-        if re.search(regex, snmp_response):
-            return device_type
+            # See if we had a match
+            if re.search(regex, snmp_response):
+                return device_type
 
     return None</code></pre>
 </details>
@@ -759,7 +761,7 @@ dict.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ssh_autodetect.html b/docs/netmiko/ssh_autodetect.html
index a5a690a876fd329ce5a75dd9a8ceb2ab447caec8..2b33663df2f192ced9818a1349d8b32c831d0796 100644
--- a/docs/netmiko/ssh_autodetect.html
+++ b/docs/netmiko/ssh_autodetect.html
@@ -3,14 +3,14 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ssh_autodetect API documentation</title>
 <meta name="description" content="The ssh_autodetect module is used to auto-detect the netmiko device_type to use to further initiate
 a new SSH connection with a remote host. This …" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -55,14 +55,8 @@ to handle the auto-detection.</p>
 </code></pre>
 <h1 id="netmiko-connection-creation-section">Netmiko connection creation section</h1>
 <pre><code>&gt;&gt;&gt; remote_device['device_type'] = best_match
+&gt;&gt;&gt; connection = ConnectHandler(**remote_device)
 </code></pre>
-<blockquote>
-<blockquote>
-<blockquote>
-<p>connection = ConnectHandler(**remote_device)</p>
-</blockquote>
-</blockquote>
-</blockquote>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;
@@ -105,8 +99,6 @@ Examples
 &gt;&gt;&gt; remote_device[&#39;device_type&#39;] = best_match
 &gt;&gt;&gt; connection = ConnectHandler(**remote_device)
 &#34;&#34;&#34;
-from __future__ import unicode_literals
-
 import re
 import time
 from netmiko.ssh_dispatcher import ConnectHandler
@@ -329,7 +321,6 @@ class SSHDetect(object):
         self.connection.write_channel(cmd + &#34;\n&#34;)
         time.sleep(1)
         output = self.connection._read_channel_timing()
-        output = self.connection.strip_ansi_escape_codes(output)
         output = self.connection.strip_backspaces(output)
         return output
 
@@ -529,7 +520,6 @@ Try to determine the device type.</p>
         self.connection.write_channel(cmd + &#34;\n&#34;)
         time.sleep(1)
         output = self.connection._read_channel_timing()
-        output = self.connection.strip_ansi_escape_codes(output)
         output = self.connection.strip_backspaces(output)
         return output
 
@@ -683,7 +673,7 @@ Try to determine the device type.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ssh_exception.html b/docs/netmiko/ssh_exception.html
index 9cc11dc0060aac20984dde460d6259c91d28abcc..41b78ca27c24a8cc1d9d6d1a8cbabbf5385ebf70 100644
--- a/docs/netmiko/ssh_exception.html
+++ b/docs/netmiko/ssh_exception.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ssh_exception API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,21 +22,24 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from paramiko.ssh_exception import SSHException
+<pre><code class="python">from paramiko.ssh_exception import SSHException
 from paramiko.ssh_exception import AuthenticationException
 
 
-class NetMikoTimeoutException(SSHException):
+class NetmikoTimeoutException(SSHException):
     &#34;&#34;&#34;SSH session timed trying to connect to the device.&#34;&#34;&#34;
 
     pass
 
 
-class NetMikoAuthenticationException(AuthenticationException):
+class NetmikoAuthenticationException(AuthenticationException):
     &#34;&#34;&#34;SSH authentication exception based on Paramiko AuthenticationException.&#34;&#34;&#34;
 
-    pass</code></pre>
+    pass
+
+
+NetMikoTimeoutException = NetmikoTimeoutException
+NetMikoAuthenticationException = NetmikoAuthenticationException</code></pre>
 </details>
 </section>
 <section>
@@ -48,7 +51,7 @@ class NetMikoAuthenticationException(AuthenticationException):
 <section>
 <h2 class="section-title" id="header-classes">Classes</h2>
 <dl>
-<dt id="netmiko.ssh_exception.NetMikoAuthenticationException"><code class="flex name class">
+<dt id="netmiko.ssh_exception.NetmikoAuthenticationException"><code class="flex name class">
 <span>class <span class="ident">NetMikoAuthenticationException</span></span>
 <span>(</span><span>*args, **kwargs)</span>
 </code></dt>
@@ -56,7 +59,7 @@ class NetMikoAuthenticationException(AuthenticationException):
 <section class="desc"><p>SSH authentication exception based on Paramiko AuthenticationException.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">class NetMikoAuthenticationException(AuthenticationException):
+<pre><code class="python">class NetmikoAuthenticationException(AuthenticationException):
     &#34;&#34;&#34;SSH authentication exception based on Paramiko AuthenticationException.&#34;&#34;&#34;
 
     pass</code></pre>
@@ -69,7 +72,7 @@ class NetMikoAuthenticationException(AuthenticationException):
 <li>builtins.BaseException</li>
 </ul>
 </dd>
-<dt id="netmiko.ssh_exception.NetMikoTimeoutException"><code class="flex name class">
+<dt id="netmiko.ssh_exception.NetmikoTimeoutException"><code class="flex name class">
 <span>class <span class="ident">NetMikoTimeoutException</span></span>
 <span>(</span><span>*args, **kwargs)</span>
 </code></dt>
@@ -77,7 +80,48 @@ class NetMikoAuthenticationException(AuthenticationException):
 <section class="desc"><p>SSH session timed trying to connect to the device.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">class NetMikoTimeoutException(SSHException):
+<pre><code class="python">class NetmikoTimeoutException(SSHException):
+    &#34;&#34;&#34;SSH session timed trying to connect to the device.&#34;&#34;&#34;
+
+    pass</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li>paramiko.ssh_exception.SSHException</li>
+<li>builtins.Exception</li>
+<li>builtins.BaseException</li>
+</ul>
+</dd>
+<dt id="netmiko.ssh_exception.NetmikoAuthenticationException"><code class="flex name class">
+<span>class <span class="ident">NetmikoAuthenticationException</span></span>
+<span>(</span><span>*args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>SSH authentication exception based on Paramiko AuthenticationException.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class NetmikoAuthenticationException(AuthenticationException):
+    &#34;&#34;&#34;SSH authentication exception based on Paramiko AuthenticationException.&#34;&#34;&#34;
+
+    pass</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li>paramiko.ssh_exception.AuthenticationException</li>
+<li>paramiko.ssh_exception.SSHException</li>
+<li>builtins.Exception</li>
+<li>builtins.BaseException</li>
+</ul>
+</dd>
+<dt id="netmiko.ssh_exception.NetmikoTimeoutException"><code class="flex name class">
+<span>class <span class="ident">NetmikoTimeoutException</span></span>
+<span>(</span><span>*args, **kwargs)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>SSH session timed trying to connect to the device.</p></section>
+<details class="source">
+<summary>Source code</summary>
+<pre><code class="python">class NetmikoTimeoutException(SSHException):
     &#34;&#34;&#34;SSH session timed trying to connect to the device.&#34;&#34;&#34;
 
     pass</code></pre>
@@ -106,10 +150,16 @@ class NetMikoAuthenticationException(AuthenticationException):
 <li><h3><a href="#header-classes">Classes</a></h3>
 <ul>
 <li>
-<h4><code><a title="netmiko.ssh_exception.NetMikoAuthenticationException" href="#netmiko.ssh_exception.NetMikoAuthenticationException">NetMikoAuthenticationException</a></code></h4>
+<h4><code><a title="netmiko.ssh_exception.NetmikoAuthenticationException" href="#netmiko.ssh_exception.NetmikoAuthenticationException">NetmikoAuthenticationException</a></code></h4>
+</li>
+<li>
+<h4><code><a title="netmiko.ssh_exception.NetmikoTimeoutException" href="#netmiko.ssh_exception.NetmikoTimeoutException">NetmikoTimeoutException</a></code></h4>
+</li>
+<li>
+<h4><code><a title="netmiko.ssh_exception.NetmikoAuthenticationException" href="#netmiko.ssh_exception.NetmikoAuthenticationException">NetmikoAuthenticationException</a></code></h4>
 </li>
 <li>
-<h4><code><a title="netmiko.ssh_exception.NetMikoTimeoutException" href="#netmiko.ssh_exception.NetMikoTimeoutException">NetMikoTimeoutException</a></code></h4>
+<h4><code><a title="netmiko.ssh_exception.NetmikoTimeoutException" href="#netmiko.ssh_exception.NetmikoTimeoutException">NetmikoTimeoutException</a></code></h4>
 </li>
 </ul>
 </li>
@@ -117,7 +167,7 @@ class NetMikoAuthenticationException(AuthenticationException):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/terminal_server/index.html b/docs/netmiko/terminal_server/index.html
index a278e3ceb94e6139cc8f9252fd6e65326a9f33cd..58d96ee6fcdb1ecfac5cf4e4ac36c41d693b1c8a 100644
--- a/docs/netmiko/terminal_server/index.html
+++ b/docs/netmiko/terminal_server/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.terminal_server API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.terminal_server.terminal_server import TerminalServerSSH
+<pre><code class="python">from netmiko.terminal_server.terminal_server import TerminalServerSSH
 from netmiko.terminal_server.terminal_server import TerminalServerTelnet
 
 __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></pre>
@@ -47,7 +46,7 @@ __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></
 <dl>
 <dt id="netmiko.terminal_server.TerminalServerSSH"><code class="flex name class">
 <span>class <span class="ident">TerminalServerSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Generic Terminal Server driver SSH.</p>
@@ -167,6 +166,10 @@ __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -230,7 +233,7 @@ __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></
 </dd>
 <dt id="netmiko.terminal_server.TerminalServerTelnet"><code class="flex name class">
 <span>class <span class="ident">TerminalServerTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Generic Terminal Server driver telnet.</p>
@@ -350,6 +353,10 @@ __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -361,7 +368,7 @@ __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></
         pass
 
     def std_login(self, *args, **kwargs):
-        return super(TerminalServerTelnet, self).telnet_login(*args, **kwargs)</code></pre>
+        return super().telnet_login(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -378,7 +385,7 @@ __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def std_login(self, *args, **kwargs):
-    return super(TerminalServerTelnet, self).telnet_login(*args, **kwargs)</code></pre>
+    return super().telnet_login(*args, **kwargs)</code></pre>
 </details>
 </dd>
 </dl>
@@ -466,7 +473,7 @@ __all__ = [&#34;TerminalServerSSH&#34;, &#34;TerminalServerTelnet&#34;]</code></
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/terminal_server/terminal_server.html b/docs/netmiko/terminal_server/terminal_server.html
index bbbaaf50e1b13a5d183de458b15044b530d3a1ed..f443c19630644623c79ed6aa6400ea7372f64360 100644
--- a/docs/netmiko/terminal_server/terminal_server.html
+++ b/docs/netmiko/terminal_server/terminal_server.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.terminal_server.terminal_server API documentation</title>
 <meta name="description" content="Generic Terminal Server driver." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,7 +24,6 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Generic Terminal Server driver.&#34;&#34;&#34;
-from __future__ import unicode_literals
 from netmiko.base_connection import BaseConnection
 
 
@@ -54,7 +53,7 @@ class TerminalServerTelnet(TerminalServer):
         pass
 
     def std_login(self, *args, **kwargs):
-        return super(TerminalServerTelnet, self).telnet_login(*args, **kwargs)</code></pre>
+        return super().telnet_login(*args, **kwargs)</code></pre>
 </details>
 </section>
 <section>
@@ -68,7 +67,7 @@ class TerminalServerTelnet(TerminalServer):
 <dl>
 <dt id="netmiko.terminal_server.terminal_server.TerminalServer"><code class="flex name class">
 <span>class <span class="ident">TerminalServer</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Generic Terminal Server driver.</p>
@@ -190,6 +189,10 @@ an exception.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -277,7 +280,7 @@ an exception.</p>
 </dd>
 <dt id="netmiko.terminal_server.terminal_server.TerminalServerSSH"><code class="flex name class">
 <span>class <span class="ident">TerminalServerSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Generic Terminal Server driver SSH.</p>
@@ -397,6 +400,10 @@ an exception.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -460,7 +467,7 @@ an exception.</p>
 </dd>
 <dt id="netmiko.terminal_server.terminal_server.TerminalServerTelnet"><code class="flex name class">
 <span>class <span class="ident">TerminalServerTelnet</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Generic Terminal Server driver telnet.</p>
@@ -580,6 +587,10 @@ an exception.</p>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -591,7 +602,7 @@ an exception.</p>
         pass
 
     def std_login(self, *args, **kwargs):
-        return super(TerminalServerTelnet, self).telnet_login(*args, **kwargs)</code></pre>
+        return super().telnet_login(*args, **kwargs)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -608,7 +619,7 @@ an exception.</p>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def std_login(self, *args, **kwargs):
-    return super(TerminalServerTelnet, self).telnet_login(*args, **kwargs)</code></pre>
+    return super().telnet_login(*args, **kwargs)</code></pre>
 </details>
 </dd>
 </dl>
@@ -697,7 +708,7 @@ an exception.</p>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ubiquiti/edge_ssh.html b/docs/netmiko/ubiquiti/edge_ssh.html
index 30d91d73e6a133d3681e233b1211907cca531998..22d901ee0897c5db1e95d5f68939d5811532d97d 100644
--- a/docs/netmiko/ubiquiti/edge_ssh.html
+++ b/docs/netmiko/ubiquiti/edge_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ubiquiti.edge_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -50,23 +49,23 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=&#34;)#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def exit_enable_mode(self, exit_command=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).exit_enable_mode(exit_command=exit_command)
+        return super().exit_enable_mode(exit_command=exit_command)
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -82,7 +81,7 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.ubiquiti.edge_ssh.UbiquitiEdgeSSH"><code class="flex name class">
 <span>class <span class="ident">UbiquitiEdgeSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implements support for Ubiquity EdgeSwitch devices.</p>
@@ -204,6 +203,10 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -230,23 +233,23 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=&#34;)#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def exit_enable_mode(self, exit_command=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).exit_enable_mode(exit_command=exit_command)
+        return super().exit_enable_mode(exit_command=exit_command)
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -267,7 +270,7 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;)#&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.edge_ssh.UbiquitiEdgeSSH.config_mode"><code class="name flex">
@@ -279,7 +282,7 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.edge_ssh.UbiquitiEdgeSSH.exit_config_mode"><code class="name flex">
@@ -291,7 +294,7 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;exit&#34;):
     &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).exit_config_mode(exit_config=exit_config)</code></pre>
+    return super().exit_config_mode(exit_config=exit_config)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.edge_ssh.UbiquitiEdgeSSH.exit_enable_mode"><code class="name flex">
@@ -303,7 +306,7 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def exit_enable_mode(self, exit_command=&#34;exit&#34;):
     &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).exit_enable_mode(exit_command=exit_command)</code></pre>
+    return super().exit_enable_mode(exit_command=exit_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.edge_ssh.UbiquitiEdgeSSH.save_config"><code class="name flex">
@@ -315,7 +318,7 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -396,7 +399,7 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/ubiquiti/index.html b/docs/netmiko/ubiquiti/index.html
index 7278abaa5b12d22e2cec30ba09ae6ca0ab6042eb..32e3e9964f919920e96e16191b9454682540a3e8 100644
--- a/docs/netmiko/ubiquiti/index.html
+++ b/docs/netmiko/ubiquiti/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.ubiquiti API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.ubiquiti.edge_ssh import UbiquitiEdgeSSH
+<pre><code class="python">from netmiko.ubiquiti.edge_ssh import UbiquitiEdgeSSH
 
 __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.ubiquiti.UbiquitiEdgeSSH"><code class="flex name class">
 <span>class <span class="ident">UbiquitiEdgeSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implements support for Ubiquity EdgeSwitch devices.</p>
@@ -168,6 +167,10 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -194,23 +197,23 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 
     def check_config_mode(self, check_string=&#34;)#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;):
         &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def exit_enable_mode(self, exit_command=&#34;exit&#34;):
         &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).exit_enable_mode(exit_command=exit_command)
+        return super().exit_enable_mode(exit_command=exit_command)
 
     def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
         &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-        return super(UbiquitiEdgeSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )</code></pre>
 </details>
@@ -231,7 +234,7 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;)#&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode or not.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.UbiquitiEdgeSSH.config_mode"><code class="name flex">
@@ -243,7 +246,7 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).config_mode(config_command=config_command)</code></pre>
+    return super().config_mode(config_command=config_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.UbiquitiEdgeSSH.exit_config_mode"><code class="name flex">
@@ -255,7 +258,7 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def exit_config_mode(self, exit_config=&#34;exit&#34;):
     &#34;&#34;&#34;Exit configuration mode.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).exit_config_mode(exit_config=exit_config)</code></pre>
+    return super().exit_config_mode(exit_config=exit_config)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.UbiquitiEdgeSSH.exit_enable_mode"><code class="name flex">
@@ -267,7 +270,7 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def exit_enable_mode(self, exit_command=&#34;exit&#34;):
     &#34;&#34;&#34;Exit enable mode.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).exit_enable_mode(exit_command=exit_command)</code></pre>
+    return super().exit_enable_mode(exit_command=exit_command)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.ubiquiti.UbiquitiEdgeSSH.save_config"><code class="name flex">
@@ -279,7 +282,7 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def save_config(self, cmd=&#34;write memory&#34;, confirm=False, confirm_response=&#34;&#34;):
     &#34;&#34;&#34;Saves configuration.&#34;&#34;&#34;
-    return super(UbiquitiEdgeSSH, self).save_config(
+    return super().save_config(
         cmd=cmd, confirm=confirm, confirm_response=confirm_response
     )</code></pre>
 </details>
@@ -365,7 +368,7 @@ __all__ = [&#34;UbiquitiEdgeSSH&#34;]</code></pre>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/utilities.html b/docs/netmiko/utilities.html
index 304f8d97ff914d9713a9ad5cd5912d7761522731..7829c80fbdba0f3d5ac542e2c620b17d35e21c94 100644
--- a/docs/netmiko/utilities.html
+++ b/docs/netmiko/utilities.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.utilities API documentation</title>
 <meta name="description" content="Miscellaneous utility functions." />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -24,15 +24,12 @@
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">&#34;&#34;&#34;Miscellaneous utility functions.&#34;&#34;&#34;
-from __future__ import print_function
-from __future__ import unicode_literals
-
 from glob import glob
 import sys
 import io
 import os
+from pathlib import Path
 import serial.tools.list_ports
-from netmiko.py23_compat import text_type
 from netmiko._textfsm import _clitable as clitable
 from netmiko._textfsm._clitable import CliTableError
 
@@ -96,7 +93,7 @@ def load_yaml_file(yaml_file):
         with io.open(yaml_file, &#34;rt&#34;, encoding=&#34;utf-8&#34;) as fname:
             return yaml.safe_load(fname)
     except IOError:
-        sys.exit(&#34;Unable to open YAML file: {0}&#34;.format(yaml_file))
+        sys.exit(f&#34;Unable to open YAML file: {yaml_file}&#34;)
 
 
 def load_devices(file_name=None):
@@ -108,13 +105,10 @@ def load_devices(file_name=None):
 def find_cfg_file(file_name=None):
     &#34;&#34;&#34;
     Search for netmiko_tools inventory file in the following order:
-
     NETMIKO_TOOLS_CFG environment variable
     Current directory
     Home directory
-
     Look for file named: .netmiko.yml or netmiko.yml
-
     Also allow NETMIKO_TOOLS_CFG to point directly at a file
     &#34;&#34;&#34;
     if file_name:
@@ -127,9 +121,7 @@ def find_cfg_file(file_name=None):
     # Filter optional_path if null
     search_paths = [path for path in search_paths if path]
     for path in search_paths:
-        files = glob(&#34;{}/.netmiko.yml&#34;.format(path)) + glob(
-            &#34;{}/netmiko.yml&#34;.format(path)
-        )
+        files = glob(f&#34;{path}/.netmiko.yml&#34;) + glob(f&#34;{path}/netmiko.yml&#34;)
         if files:
             return files[0]
     raise IOError(
@@ -153,8 +145,8 @@ def display_inventory(my_devices):
     print(&#34;\nDevices:&#34;)
     print(&#34;-&#34; * 40)
     for a_device, device_type in inventory_devices:
-        device_type = &#34;  ({})&#34;.format(device_type)
-        print(&#34;{:&lt;25}{:&gt;15}&#34;.format(a_device, device_type))
+        device_type = f&#34;  ({device_type})&#34;
+        print(f&#34;{a_device:&lt;25}{device_type:&gt;15}&#34;)
     print(&#34;\n\nGroups:&#34;)
     print(&#34;-&#34; * 40)
     for a_group in inventory_groups:
@@ -175,7 +167,7 @@ def obtain_all_devices(my_devices):
 def obtain_netmiko_filename(device_name):
     &#34;&#34;&#34;Create file name based on device_name.&#34;&#34;&#34;
     _, netmiko_full_dir = find_netmiko_dir()
-    return &#34;{}/{}.txt&#34;.format(netmiko_full_dir, device_name)
+    return f&#34;{netmiko_full_dir}/{device_name}.txt&#34;
 
 
 def write_tmp_file(device_name, output):
@@ -194,7 +186,7 @@ def ensure_dir_exists(verify_dir):
         # Exists
         if not os.path.isdir(verify_dir):
             # Not a dir, raise an exception
-            raise ValueError(&#34;{} is not a directory&#34;.format(verify_dir))
+            raise ValueError(f&#34;{verify_dir} is not a directory&#34;)
 
 
 def find_netmiko_dir():
@@ -206,12 +198,12 @@ def find_netmiko_dir():
     netmiko_base_dir = os.path.expanduser(netmiko_base_dir)
     if netmiko_base_dir == &#34;/&#34;:
         raise ValueError(&#34;/ cannot be netmiko_base_dir&#34;)
-    netmiko_full_dir = &#34;{}/tmp&#34;.format(netmiko_base_dir)
+    netmiko_full_dir = f&#34;{netmiko_base_dir}/tmp&#34;
     return (netmiko_base_dir, netmiko_full_dir)
 
 
 def write_bytes(out_data, encoding=&#34;ascii&#34;):
-    &#34;&#34;&#34;Write Python2 and Python3 compatible byte stream.&#34;&#34;&#34;
+    &#34;&#34;&#34;Legacy for Python2 and Python3 compatible byte stream.&#34;&#34;&#34;
     if sys.version_info[0] &gt;= 3:
         if isinstance(out_data, type(&#34;&#34;)):
             if encoding == &#34;utf-8&#34;:
@@ -220,14 +212,6 @@ def write_bytes(out_data, encoding=&#34;ascii&#34;):
                 return out_data.encode(&#34;ascii&#34;, &#34;ignore&#34;)
         elif isinstance(out_data, type(b&#34;&#34;)):
             return out_data
-    else:
-        if isinstance(out_data, type(&#34;&#34;)):
-            if encoding == &#34;utf-8&#34;:
-                return out_data.encode(&#34;utf-8&#34;)
-            else:
-                return out_data.encode(&#34;ascii&#34;, &#34;ignore&#34;)
-        elif isinstance(out_data, type(str(&#34;&#34;))):
-            return out_data
     msg = &#34;Invalid value for out_data neither unicode nor byte string: {}&#34;.format(
         out_data
     )
@@ -240,11 +224,11 @@ def check_serial_port(name):
         cdc = next(serial.tools.list_ports.grep(name))
         return cdc[0]
     except StopIteration:
-        msg = &#34;device {} not found. &#34;.format(name)
+        msg = f&#34;device {name} not found. &#34;
         msg += &#34;available devices are: &#34;
         ports = list(serial.tools.list_ports.comports())
         for p in ports:
-            msg += &#34;{},&#34;.format(text_type(p))
+            msg += f&#34;{str(p)},&#34;
         raise ValueError(msg)
 
 
@@ -282,22 +266,53 @@ def clitable_to_dict(cli_table):
     return objs
 
 
-def get_structured_data(raw_output, platform, command):
-    &#34;&#34;&#34;Convert raw CLI output to structured data using TextFSM template.&#34;&#34;&#34;
-    template_dir = get_template_dir()
-    index_file = os.path.join(template_dir, &#34;index&#34;)
-    textfsm_obj = clitable.CliTable(index_file, template_dir)
-    attrs = {&#34;Command&#34;: command, &#34;Platform&#34;: platform}
+def _textfsm_parse(textfsm_obj, raw_output, attrs, template_file=None):
+    &#34;&#34;&#34;Perform the actual TextFSM parsing using the CliTable object.&#34;&#34;&#34;
     try:
         # Parse output through template
-        textfsm_obj.ParseCmd(raw_output, attrs)
+        if template_file is not None:
+            textfsm_obj.ParseCmd(raw_output, templates=template_file)
+        else:
+            textfsm_obj.ParseCmd(raw_output, attrs)
         structured_data = clitable_to_dict(textfsm_obj)
         output = raw_output if structured_data == [] else structured_data
         return output
-    except CliTableError:
+    except (FileNotFoundError, CliTableError):
         return raw_output
 
 
+def get_structured_data(raw_output, platform=None, command=None, template=None):
+    &#34;&#34;&#34;
+    Convert raw CLI output to structured data using TextFSM template.
+
+    You can use a straight TextFSM file i.e. specify &#34;template&#34;. If no template is specified,
+    then you must use an CliTable index file.
+    &#34;&#34;&#34;
+    if platform is None or command is None:
+        attrs = {}
+    else:
+        attrs = {&#34;Command&#34;: command, &#34;Platform&#34;: platform}
+
+    if template is None:
+        if attrs == {}:
+            raise ValueError(
+                &#34;Either &#39;platform/command&#39; or &#39;template&#39; must be specified.&#34;
+            )
+        template_dir = get_template_dir()
+        index_file = os.path.join(template_dir, &#34;index&#34;)
+        textfsm_obj = clitable.CliTable(index_file, template_dir)
+        return _textfsm_parse(textfsm_obj, raw_output, attrs)
+    else:
+        template_path = Path(os.path.expanduser(template))
+        template_file = template_path.name
+        template_dir = template_path.parents[0]
+        # CliTable with no index will fall-back to a TextFSM parsing behavior
+        textfsm_obj = clitable.CliTable(template_dir=template_dir)
+        return _textfsm_parse(
+            textfsm_obj, raw_output, attrs, template_file=template_file
+        )
+
+
 def get_structured_data_genie(raw_output, platform, command):
     if not sys.version_info &gt;= (3, 4):
         raise ValueError(&#34;Genie requires Python &gt;= 3.4&#34;)
@@ -366,11 +381,11 @@ def get_structured_data_genie(raw_output, platform, command):
         cdc = next(serial.tools.list_ports.grep(name))
         return cdc[0]
     except StopIteration:
-        msg = &#34;device {} not found. &#34;.format(name)
+        msg = f&#34;device {name} not found. &#34;
         msg += &#34;available devices are: &#34;
         ports = list(serial.tools.list_ports.comports())
         for p in ports:
-            msg += &#34;{},&#34;.format(text_type(p))
+            msg += f&#34;{str(p)},&#34;
         raise ValueError(msg)</code></pre>
 </details>
 </dd>
@@ -414,8 +429,8 @@ def get_structured_data_genie(raw_output, platform, command):
     print(&#34;\nDevices:&#34;)
     print(&#34;-&#34; * 40)
     for a_device, device_type in inventory_devices:
-        device_type = &#34;  ({})&#34;.format(device_type)
-        print(&#34;{:&lt;25}{:&gt;15}&#34;.format(a_device, device_type))
+        device_type = f&#34;  ({device_type})&#34;
+        print(f&#34;{a_device:&lt;25}{device_type:&gt;15}&#34;)
     print(&#34;\n\nGroups:&#34;)
     print(&#34;-&#34; * 40)
     for a_group in inventory_groups:
@@ -439,31 +454,28 @@ def get_structured_data_genie(raw_output, platform, command):
         # Exists
         if not os.path.isdir(verify_dir):
             # Not a dir, raise an exception
-            raise ValueError(&#34;{} is not a directory&#34;.format(verify_dir))</code></pre>
+            raise ValueError(f&#34;{verify_dir} is not a directory&#34;)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.utilities.find_cfg_file"><code class="name flex">
 <span>def <span class="ident">find_cfg_file</span></span>(<span>file_name=None)</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Search for netmiko_tools inventory file in the following order:</p>
-<p>NETMIKO_TOOLS_CFG environment variable
+<section class="desc"><p>Search for netmiko_tools inventory file in the following order:
+NETMIKO_TOOLS_CFG environment variable
 Current directory
-Home directory</p>
-<p>Look for file named: .netmiko.yml or netmiko.yml</p>
-<p>Also allow NETMIKO_TOOLS_CFG to point directly at a file</p></section>
+Home directory
+Look for file named: .netmiko.yml or netmiko.yml
+Also allow NETMIKO_TOOLS_CFG to point directly at a file</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def find_cfg_file(file_name=None):
     &#34;&#34;&#34;
     Search for netmiko_tools inventory file in the following order:
-
     NETMIKO_TOOLS_CFG environment variable
     Current directory
     Home directory
-
     Look for file named: .netmiko.yml or netmiko.yml
-
     Also allow NETMIKO_TOOLS_CFG to point directly at a file
     &#34;&#34;&#34;
     if file_name:
@@ -476,9 +488,7 @@ Home directory</p>
     # Filter optional_path if null
     search_paths = [path for path in search_paths if path]
     for path in search_paths:
-        files = glob(&#34;{}/.netmiko.yml&#34;.format(path)) + glob(
-            &#34;{}/netmiko.yml&#34;.format(path)
-        )
+        files = glob(f&#34;{path}/.netmiko.yml&#34;) + glob(f&#34;{path}/netmiko.yml&#34;)
         if files:
             return files[0]
     raise IOError(
@@ -503,31 +513,49 @@ Home directory</p>
     netmiko_base_dir = os.path.expanduser(netmiko_base_dir)
     if netmiko_base_dir == &#34;/&#34;:
         raise ValueError(&#34;/ cannot be netmiko_base_dir&#34;)
-    netmiko_full_dir = &#34;{}/tmp&#34;.format(netmiko_base_dir)
+    netmiko_full_dir = f&#34;{netmiko_base_dir}/tmp&#34;
     return (netmiko_base_dir, netmiko_full_dir)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.utilities.get_structured_data"><code class="name flex">
-<span>def <span class="ident">get_structured_data</span></span>(<span>raw_output, platform, command)</span>
+<span>def <span class="ident">get_structured_data</span></span>(<span>raw_output, platform=None, command=None, template=None)</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Convert raw CLI output to structured data using TextFSM template.</p></section>
+<section class="desc"><p>Convert raw CLI output to structured data using TextFSM template.</p>
+<p>You can use a straight TextFSM file i.e. specify "template". If no template is specified,
+then you must use an CliTable index file.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def get_structured_data(raw_output, platform, command):
-    &#34;&#34;&#34;Convert raw CLI output to structured data using TextFSM template.&#34;&#34;&#34;
-    template_dir = get_template_dir()
-    index_file = os.path.join(template_dir, &#34;index&#34;)
-    textfsm_obj = clitable.CliTable(index_file, template_dir)
-    attrs = {&#34;Command&#34;: command, &#34;Platform&#34;: platform}
-    try:
-        # Parse output through template
-        textfsm_obj.ParseCmd(raw_output, attrs)
-        structured_data = clitable_to_dict(textfsm_obj)
-        output = raw_output if structured_data == [] else structured_data
-        return output
-    except CliTableError:
-        return raw_output</code></pre>
+<pre><code class="python">def get_structured_data(raw_output, platform=None, command=None, template=None):
+    &#34;&#34;&#34;
+    Convert raw CLI output to structured data using TextFSM template.
+
+    You can use a straight TextFSM file i.e. specify &#34;template&#34;. If no template is specified,
+    then you must use an CliTable index file.
+    &#34;&#34;&#34;
+    if platform is None or command is None:
+        attrs = {}
+    else:
+        attrs = {&#34;Command&#34;: command, &#34;Platform&#34;: platform}
+
+    if template is None:
+        if attrs == {}:
+            raise ValueError(
+                &#34;Either &#39;platform/command&#39; or &#39;template&#39; must be specified.&#34;
+            )
+        template_dir = get_template_dir()
+        index_file = os.path.join(template_dir, &#34;index&#34;)
+        textfsm_obj = clitable.CliTable(index_file, template_dir)
+        return _textfsm_parse(textfsm_obj, raw_output, attrs)
+    else:
+        template_path = Path(os.path.expanduser(template))
+        template_file = template_path.name
+        template_dir = template_path.parents[0]
+        # CliTable with no index will fall-back to a TextFSM parsing behavior
+        textfsm_obj = clitable.CliTable(template_dir=template_dir)
+        return _textfsm_parse(
+            textfsm_obj, raw_output, attrs, template_file=template_file
+        )</code></pre>
 </details>
 </dd>
 <dt id="netmiko.utilities.get_structured_data_genie"><code class="name flex">
@@ -645,7 +673,7 @@ directory.&#34;&#34;&#34;
         with io.open(yaml_file, &#34;rt&#34;, encoding=&#34;utf-8&#34;) as fname:
             return yaml.safe_load(fname)
     except IOError:
-        sys.exit(&#34;Unable to open YAML file: {0}&#34;.format(yaml_file))</code></pre>
+        sys.exit(f&#34;Unable to open YAML file: {yaml_file}&#34;)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.utilities.obtain_all_devices"><code class="name flex">
@@ -675,18 +703,18 @@ directory.&#34;&#34;&#34;
 <pre><code class="python">def obtain_netmiko_filename(device_name):
     &#34;&#34;&#34;Create file name based on device_name.&#34;&#34;&#34;
     _, netmiko_full_dir = find_netmiko_dir()
-    return &#34;{}/{}.txt&#34;.format(netmiko_full_dir, device_name)</code></pre>
+    return f&#34;{netmiko_full_dir}/{device_name}.txt&#34;</code></pre>
 </details>
 </dd>
 <dt id="netmiko.utilities.write_bytes"><code class="name flex">
 <span>def <span class="ident">write_bytes</span></span>(<span>out_data, encoding='ascii')</span>
 </code></dt>
 <dd>
-<section class="desc"><p>Write Python2 and Python3 compatible byte stream.</p></section>
+<section class="desc"><p>Legacy for Python2 and Python3 compatible byte stream.</p></section>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">def write_bytes(out_data, encoding=&#34;ascii&#34;):
-    &#34;&#34;&#34;Write Python2 and Python3 compatible byte stream.&#34;&#34;&#34;
+    &#34;&#34;&#34;Legacy for Python2 and Python3 compatible byte stream.&#34;&#34;&#34;
     if sys.version_info[0] &gt;= 3:
         if isinstance(out_data, type(&#34;&#34;)):
             if encoding == &#34;utf-8&#34;:
@@ -695,14 +723,6 @@ directory.&#34;&#34;&#34;
                 return out_data.encode(&#34;ascii&#34;, &#34;ignore&#34;)
         elif isinstance(out_data, type(b&#34;&#34;)):
             return out_data
-    else:
-        if isinstance(out_data, type(&#34;&#34;)):
-            if encoding == &#34;utf-8&#34;:
-                return out_data.encode(&#34;utf-8&#34;)
-            else:
-                return out_data.encode(&#34;ascii&#34;, &#34;ignore&#34;)
-        elif isinstance(out_data, type(str(&#34;&#34;))):
-            return out_data
     msg = &#34;Invalid value for out_data neither unicode nor byte string: {}&#34;.format(
         out_data
     )
@@ -762,7 +782,7 @@ directory.&#34;&#34;&#34;
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/vyos/index.html b/docs/netmiko/vyos/index.html
index 5afe84cdd95183294076cd20a8cbe4de49072d03..cb9ef9f81b2f594e78bf554f31c0f24ef23e2e01 100644
--- a/docs/netmiko/vyos/index.html
+++ b/docs/netmiko/vyos/index.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.vyos API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,8 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import unicode_literals
-from netmiko.vyos.vyos_ssh import VyOSSSH
+<pre><code class="python">from netmiko.vyos.vyos_ssh import VyOSSSH
 
 __all__ = [&#34;VyOSSSH&#34;]</code></pre>
 </details>
@@ -46,7 +45,7 @@ __all__ = [&#34;VyOSSSH&#34;]</code></pre>
 <dl>
 <dt id="netmiko.vyos.VyOSSSH"><code class="flex name class">
 <span>class <span class="ident">VyOSSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with VyOS network devices.</p>
@@ -166,6 +165,10 @@ __all__ = [&#34;VyOSSSH&#34;]</code></pre>
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -195,13 +198,11 @@ __all__ = [&#34;VyOSSSH&#34;]</code></pre>
 
     def check_config_mode(self, check_string=&#34;#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-        return super(VyOSSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;[edit]&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(VyOSSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=r&#34;exit&#34;):
         &#34;&#34;&#34;Exit configuration mode&#34;&#34;&#34;
@@ -236,7 +237,7 @@ __all__ = [&#34;VyOSSSH&#34;]</code></pre>
         command_string = &#34;commit&#34;
 
         if comment:
-            command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+            command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -247,16 +248,14 @@ __all__ = [&#34;VyOSSSH&#34;]</code></pre>
         )
 
         if any(x in output for x in error_marker):
-            raise ValueError(
-                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
         return output
 
     def set_base_prompt(
         self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        prompt = super(VyOSSSH, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -265,25 +264,10 @@ __all__ = [&#34;VyOSSSH&#34;]</code></pre>
         self.base_prompt = prompt[:-2].strip()
         return self.base_prompt
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
         &#34;&#34;&#34;Remain in configuration mode.&#34;&#34;&#34;
-        return super(VyOSSSH, self).send_config_set(
-            config_commands=config_commands,
-            exit_config_mode=exit_config_mode,
-            delay_factor=delay_factor,
-            max_loops=max_loops,
-            strip_prompt=strip_prompt,
-            strip_command=strip_command,
-            config_mode_command=config_mode_command,
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
     def save_config(self, *args, **kwargs):
@@ -307,7 +291,7 @@ __all__ = [&#34;VyOSSSH&#34;]</code></pre>
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;#&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-    return super(VyOSSSH, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.vyos.VyOSSSH.check_enable_mode"><code class="name flex">
@@ -353,7 +337,7 @@ command_string = commit comment <comment></p></section>
     command_string = &#34;commit&#34;
 
     if comment:
-        command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+        command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
     output = self.config_mode()
     output += self.send_command_expect(
@@ -364,9 +348,7 @@ command_string = commit comment <comment></p></section>
     )
 
     if any(x in output for x in error_marker):
-        raise ValueError(
-            &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -379,9 +361,7 @@ command_string = commit comment <comment></p></section>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;[edit]&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(VyOSSSH, self).config_mode(
-        config_command=config_command, pattern=pattern
-    )</code></pre>
+    return super().config_mode(config_command=config_command, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.vyos.VyOSSSH.enable"><code class="name flex">
@@ -444,31 +424,16 @@ command_string = commit comment <comment></p></section>
 </details>
 </dd>
 <dt id="netmiko.vyos.VyOSSSH.send_config_set"><code class="name flex">
-<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=False, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None)</span>
+<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=False, **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Remain in configuration mode.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def send_config_set(
-    self,
-    config_commands=None,
-    exit_config_mode=False,
-    delay_factor=1,
-    max_loops=150,
-    strip_prompt=False,
-    strip_command=False,
-    config_mode_command=None,
-):
+<pre><code class="python">def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
     &#34;&#34;&#34;Remain in configuration mode.&#34;&#34;&#34;
-    return super(VyOSSSH, self).send_config_set(
-        config_commands=config_commands,
-        exit_config_mode=exit_config_mode,
-        delay_factor=delay_factor,
-        max_loops=max_loops,
-        strip_prompt=strip_prompt,
-        strip_command=strip_command,
-        config_mode_command=config_mode_command,
+    return super().send_config_set(
+        config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
     )</code></pre>
 </details>
 </dd>
@@ -500,7 +465,7 @@ command_string = commit comment <comment></p></section>
     self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
 ):
     &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-    prompt = super(VyOSSSH, self).set_base_prompt(
+    prompt = super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -591,7 +556,7 @@ command_string = commit comment <comment></p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/docs/netmiko/vyos/vyos_ssh.html b/docs/netmiko/vyos/vyos_ssh.html
index 27c8c46ae60a192d6899b30548cf0b23c91b1732..eaf08874d47fb3b769ae91bf8081a15f1c1a2ece 100644
--- a/docs/netmiko/vyos/vyos_ssh.html
+++ b/docs/netmiko/vyos/vyos_ssh.html
@@ -3,13 +3,13 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.6.2" />
+<meta name="generator" content="pdoc 0.6.3" />
 <title>netmiko.vyos.vyos_ssh API documentation</title>
 <meta name="description" content="" />
 <link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
 <link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
 <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase;cursor:pointer}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 </head>
@@ -22,9 +22,7 @@
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from __future__ import print_function
-from __future__ import unicode_literals
-import time
+<pre><code class="python">import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -54,13 +52,11 @@ class VyOSSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=&#34;#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-        return super(VyOSSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;[edit]&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(VyOSSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=r&#34;exit&#34;):
         &#34;&#34;&#34;Exit configuration mode&#34;&#34;&#34;
@@ -95,7 +91,7 @@ class VyOSSSH(CiscoSSHConnection):
         command_string = &#34;commit&#34;
 
         if comment:
-            command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+            command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -106,16 +102,14 @@ class VyOSSSH(CiscoSSHConnection):
         )
 
         if any(x in output for x in error_marker):
-            raise ValueError(
-                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
         return output
 
     def set_base_prompt(
         self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        prompt = super(VyOSSSH, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -124,25 +118,10 @@ class VyOSSSH(CiscoSSHConnection):
         self.base_prompt = prompt[:-2].strip()
         return self.base_prompt
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
         &#34;&#34;&#34;Remain in configuration mode.&#34;&#34;&#34;
-        return super(VyOSSSH, self).send_config_set(
-            config_commands=config_commands,
-            exit_config_mode=exit_config_mode,
-            delay_factor=delay_factor,
-            max_loops=max_loops,
-            strip_prompt=strip_prompt,
-            strip_command=strip_command,
-            config_mode_command=config_mode_command,
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
     def save_config(self, *args, **kwargs):
@@ -161,7 +140,7 @@ class VyOSSSH(CiscoSSHConnection):
 <dl>
 <dt id="netmiko.vyos.vyos_ssh.VyOSSSH"><code class="flex name class">
 <span>class <span class="ident">VyOSSSH</span></span>
-<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=8, banner_timeout=5, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii')</span>
+<span>(</span><span>ip='', host='', username='', password=None, secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, pkey=None, passphrase=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100, session_timeout=60, auth_timeout=None, blocking_timeout=20, banner_timeout=15, keepalive=0, default_enter=None, response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write', allow_auto_change=False, encoding='ascii', sock=None)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Implement methods for interacting with VyOS network devices.</p>
@@ -281,6 +260,10 @@ class VyOSSSH(CiscoSSHConnection):
     :param encoding: Encoding to be used when writing bytes to the output channel.
             (default: ascii)
     :type encoding: str
+
+    :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+            communication to the target host (default: None).
+    :type sock: socket
 </code></pre></section>
 <details class="source">
 <summary>Source code</summary>
@@ -310,13 +293,11 @@ class VyOSSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=&#34;#&#34;):
         &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-        return super(VyOSSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;[edit]&#34;):
         &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-        return super(VyOSSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def exit_config_mode(self, exit_config=&#34;exit&#34;, pattern=r&#34;exit&#34;):
         &#34;&#34;&#34;Exit configuration mode&#34;&#34;&#34;
@@ -351,7 +332,7 @@ class VyOSSSH(CiscoSSHConnection):
         command_string = &#34;commit&#34;
 
         if comment:
-            command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+            command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -362,16 +343,14 @@ class VyOSSSH(CiscoSSHConnection):
         )
 
         if any(x in output for x in error_marker):
-            raise ValueError(
-                &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-            )
+            raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
         return output
 
     def set_base_prompt(
         self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
     ):
         &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-        prompt = super(VyOSSSH, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -380,25 +359,10 @@ class VyOSSSH(CiscoSSHConnection):
         self.base_prompt = prompt[:-2].strip()
         return self.base_prompt
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
         &#34;&#34;&#34;Remain in configuration mode.&#34;&#34;&#34;
-        return super(VyOSSSH, self).send_config_set(
-            config_commands=config_commands,
-            exit_config_mode=exit_config_mode,
-            delay_factor=delay_factor,
-            max_loops=max_loops,
-            strip_prompt=strip_prompt,
-            strip_command=strip_command,
-            config_mode_command=config_mode_command,
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
     def save_config(self, *args, **kwargs):
@@ -422,7 +386,7 @@ class VyOSSSH(CiscoSSHConnection):
 <summary>Source code</summary>
 <pre><code class="python">def check_config_mode(self, check_string=&#34;#&#34;):
     &#34;&#34;&#34;Checks if the device is in configuration mode&#34;&#34;&#34;
-    return super(VyOSSSH, self).check_config_mode(check_string=check_string)</code></pre>
+    return super().check_config_mode(check_string=check_string)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.vyos.vyos_ssh.VyOSSSH.check_enable_mode"><code class="name flex">
@@ -468,7 +432,7 @@ command_string = commit comment <comment></p></section>
     command_string = &#34;commit&#34;
 
     if comment:
-        command_string += &#39; comment &#34;{}&#34;&#39;.format(comment)
+        command_string += f&#39; comment &#34;{comment}&#34;&#39;
 
     output = self.config_mode()
     output += self.send_command_expect(
@@ -479,9 +443,7 @@ command_string = commit comment <comment></p></section>
     )
 
     if any(x in output for x in error_marker):
-        raise ValueError(
-            &#34;Commit failed with following errors:\n\n{}&#34;.format(output)
-        )
+        raise ValueError(f&#34;Commit failed with following errors:\n\n{output}&#34;)
     return output</code></pre>
 </details>
 </dd>
@@ -494,9 +456,7 @@ command_string = commit comment <comment></p></section>
 <summary>Source code</summary>
 <pre><code class="python">def config_mode(self, config_command=&#34;configure&#34;, pattern=r&#34;[edit]&#34;):
     &#34;&#34;&#34;Enter configuration mode.&#34;&#34;&#34;
-    return super(VyOSSSH, self).config_mode(
-        config_command=config_command, pattern=pattern
-    )</code></pre>
+    return super().config_mode(config_command=config_command, pattern=pattern)</code></pre>
 </details>
 </dd>
 <dt id="netmiko.vyos.vyos_ssh.VyOSSSH.enable"><code class="name flex">
@@ -559,31 +519,16 @@ command_string = commit comment <comment></p></section>
 </details>
 </dd>
 <dt id="netmiko.vyos.vyos_ssh.VyOSSSH.send_config_set"><code class="name flex">
-<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=False, delay_factor=1, max_loops=150, strip_prompt=False, strip_command=False, config_mode_command=None)</span>
+<span>def <span class="ident">send_config_set</span></span>(<span>self, config_commands=None, exit_config_mode=False, **kwargs)</span>
 </code></dt>
 <dd>
 <section class="desc"><p>Remain in configuration mode.</p></section>
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">def send_config_set(
-    self,
-    config_commands=None,
-    exit_config_mode=False,
-    delay_factor=1,
-    max_loops=150,
-    strip_prompt=False,
-    strip_command=False,
-    config_mode_command=None,
-):
+<pre><code class="python">def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
     &#34;&#34;&#34;Remain in configuration mode.&#34;&#34;&#34;
-    return super(VyOSSSH, self).send_config_set(
-        config_commands=config_commands,
-        exit_config_mode=exit_config_mode,
-        delay_factor=delay_factor,
-        max_loops=max_loops,
-        strip_prompt=strip_prompt,
-        strip_command=strip_command,
-        config_mode_command=config_mode_command,
+    return super().send_config_set(
+        config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
     )</code></pre>
 </details>
 </dd>
@@ -615,7 +560,7 @@ command_string = commit comment <comment></p></section>
     self, pri_prompt_terminator=&#34;$&#34;, alt_prompt_terminator=&#34;#&#34;, delay_factor=1
 ):
     &#34;&#34;&#34;Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output.&#34;&#34;&#34;
-    prompt = super(VyOSSSH, self).set_base_prompt(
+    prompt = super().set_base_prompt(
         pri_prompt_terminator=pri_prompt_terminator,
         alt_prompt_terminator=alt_prompt_terminator,
         delay_factor=delay_factor,
@@ -701,7 +646,7 @@ command_string = commit comment <comment></p></section>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.2</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.6.3</a>.</p>
 </footer>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
 <script>hljs.initHighlightingOnLoad()</script>
diff --git a/netmiko/__init__.py b/netmiko/__init__.py
index afeb27955cb8981ddb5d4de438f9daacca7152e9..f7904436a4109687cd15c1523907ae8bf0bf2fa3 100644
--- a/netmiko/__init__.py
+++ b/netmiko/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import logging
 
 # Logging configuration
@@ -12,28 +11,29 @@ from netmiko.ssh_dispatcher import platforms
 from netmiko.ssh_dispatcher import FileTransfer
 from netmiko.scp_handler import SCPConn
 from netmiko.cisco.cisco_ios import InLineTransfer
-from netmiko.ssh_exception import NetMikoTimeoutException
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoTimeoutException, NetMikoTimeoutException
+from netmiko.ssh_exception import (
+    NetmikoAuthenticationException,
+    NetMikoAuthenticationException,
+)
 from netmiko.ssh_autodetect import SSHDetect
 from netmiko.base_connection import BaseConnection
 from netmiko.scp_functions import file_transfer
 
 # Alternate naming
-NetmikoTimeoutError = NetMikoTimeoutException
-NetmikoAuthError = NetMikoAuthenticationException
 Netmiko = ConnectHandler
 
-__version__ = "2.4.2"
+__version__ = "3.0.0"
 __all__ = (
     "ConnectHandler",
     "ssh_dispatcher",
     "platforms",
     "SCPConn",
     "FileTransfer",
+    "NetmikoTimeoutException",
+    "NetmikoAuthenticationException",
     "NetMikoTimeoutException",
     "NetMikoAuthenticationException",
-    "NetmikoTimeoutError",
-    "NetmikoAuthError",
     "InLineTransfer",
     "redispatch",
     "SSHDetect",
diff --git a/netmiko/a10/__init__.py b/netmiko/a10/__init__.py
index 4c343b4c20597efaaf48ec936970d357e08c5e1a..6d812d3ca99bc5e2eedd57aaa2b992b296ef6746 100644
--- a/netmiko/a10/__init__.py
+++ b/netmiko/a10/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.a10.a10_ssh import A10SSH
 
 __all__ = ["A10SSH"]
diff --git a/netmiko/a10/a10_ssh.py b/netmiko/a10/a10_ssh.py
index 64f1501281f3e918f66d3f5e26e2f66ed06d1a47..2588bfd7a319a2d7af6990769ccee1e83d18f7c1 100644
--- a/netmiko/a10/a10_ssh.py
+++ b/netmiko/a10/a10_ssh.py
@@ -1,5 +1,4 @@
 """A10 support."""
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
diff --git a/netmiko/accedian/accedian_ssh.py b/netmiko/accedian/accedian_ssh.py
index 93b2b14ce5d6322078bf6d949f171a4e225cc3d8..91796e3e783c4b98d9cded66f86bc0e618f6d497 100644
--- a/netmiko/accedian/accedian_ssh.py
+++ b/netmiko/accedian/accedian_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -36,7 +35,7 @@ class AccedianSSH(CiscoSSHConnection):
         self, pri_prompt_terminator=":", alt_prompt_terminator="#", delay_factor=2
     ):
         """Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output."""
-        super(AccedianSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
diff --git a/netmiko/alcatel/__init__.py b/netmiko/alcatel/__init__.py
index 8ab08646c2a330457d57f02e862f5bad75a7492f..fe6f2d35d9a2ab47a205d7feb2159820133851ca 100644
--- a/netmiko/alcatel/__init__.py
+++ b/netmiko/alcatel/__init__.py
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-from netmiko.alcatel.alcatel_sros_ssh import AlcatelSrosSSH
 from netmiko.alcatel.alcatel_aos_ssh import AlcatelAosSSH
 
-__all__ = ["AlcatelSrosSSH", "AlcatelAosSSH"]
+__all__ = ["AlcatelAosSSH"]
diff --git a/netmiko/alcatel/alcatel_aos_ssh.py b/netmiko/alcatel/alcatel_aos_ssh.py
index 117dc8f2b48d19617b6f4ebaafc59750f0ff7846..6875ea31966ad9153751913e9a29d922bc3da1e5 100644
--- a/netmiko/alcatel/alcatel_aos_ssh.py
+++ b/netmiko/alcatel/alcatel_aos_ssh.py
@@ -1,6 +1,4 @@
 """Alcatel-Lucent Enterprise AOS support (AOS6 and AOS8)."""
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -44,6 +42,6 @@ class AlcatelAosSSH(CiscoSSHConnection):
         self, cmd="write memory flash-synchro", confirm=False, confirm_response=""
     ):
         """Save Config"""
-        return super(AlcatelAosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/alcatel/alcatel_sros_ssh.py b/netmiko/alcatel/alcatel_sros_ssh.py
deleted file mode 100644
index 3d136ea5483d09ba08b01a26878e949e654cecfb..0000000000000000000000000000000000000000
--- a/netmiko/alcatel/alcatel_sros_ssh.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""Alcatel-Lucent SROS support."""
-from __future__ import print_function
-from __future__ import unicode_literals
-import re
-import time
-from netmiko.cisco_base_connection import CiscoSSHConnection
-
-
-class AlcatelSrosSSH(CiscoSSHConnection):
-    """Alcatel-Lucent SROS support."""
-
-    def session_preparation(self):
-        self._test_channel_read()
-        self.set_base_prompt()
-        self.disable_paging(command="environment no more")
-        # Clear the read buffer
-        time.sleep(0.3 * self.global_delay_factor)
-        self.clear_buffer()
-
-    def set_base_prompt(self, *args, **kwargs):
-        """Remove the > when navigating into the different config level."""
-        cur_base_prompt = super(AlcatelSrosSSH, self).set_base_prompt(*args, **kwargs)
-        match = re.search(r"(.*)(>.*)*#", cur_base_prompt)
-        if match:
-            # strip off >... from base_prompt
-            self.base_prompt = match.group(1)
-            return self.base_prompt
-
-    def enable(self, cmd="enable-admin", pattern="ssword", re_flags=re.IGNORECASE):
-        """Enter enable mode."""
-        return super(AlcatelSrosSSH, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
-
-    def check_enable_mode(self, check_string="CLI Already in admin mode"):
-        """Check whether we are in enable-admin mode.
-         SROS requires us to do this:
-        *A:HOSTNAME# enable-admin
-        MINOR: CLI Already in admin mode.
-        *A:HOSTNAME#
-        *A:HOSTNAME# enable-admin
-        Password:
-        MINOR: CLI Invalid password.
-        *A:HOSTNAME#
-        """
-        output = self.send_command_timing("enable-admin")
-        if re.search(r"ssword", output):
-            # Just hit enter as we don't actually want to enter enable here
-            self.write_channel(self.normalize_cmd(self.RETURN))
-            self.read_until_prompt()
-            return False
-        elif check_string in output:
-            return True
-        raise ValueError("Unexpected response in check_enable_mode() method")
-
-    def exit_enable_mode(self, exit_command=""):
-        """No corresponding exit of enable mode on SROS."""
-        pass
-
-    def config_mode(self, config_command="configure", pattern="#"):
-        """ Enter into configuration mode on SROS device."""
-        return super(AlcatelSrosSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
-
-    def exit_config_mode(self, exit_config="exit all", pattern="#"):
-        """ Exit from configuration mode."""
-        return super(AlcatelSrosSSH, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
-
-    def check_config_mode(self, check_string="config", pattern="#"):
-        """ Checks if the device is in configuration mode or not. """
-        return super(AlcatelSrosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
-
-    def save_config(self, *args, **kwargs):
-        """Not Implemented"""
-        raise NotImplementedError
diff --git a/netmiko/apresia/__init__.py b/netmiko/apresia/__init__.py
index bc0b61389a6df3901a078e614716c9cf2fa77301..3992c66d1fe5b6bd5b17df4a45c420bdc63db1ec 100644
--- a/netmiko/apresia/__init__.py
+++ b/netmiko/apresia/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.apresia.apresia_aeos import ApresiaAeosSSH, ApresiaAeosTelnet
 
 __all__ = ["ApresiaAeosSSH", "ApresiaAeosTelnet"]
diff --git a/netmiko/apresia/apresia_aeos.py b/netmiko/apresia/apresia_aeos.py
index e4073f2199b9369ed50b97b57515be8b1d804914..bbab84582005c3b1f1bc7844b64213ef2e79da79 100644
--- a/netmiko/apresia/apresia_aeos.py
+++ b/netmiko/apresia/apresia_aeos.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -9,7 +8,6 @@ class ApresiaAeosBase(CiscoSSHConnection):
         self._test_channel_read(pattern=r"[>#]")
         self.set_base_prompt()
         self.disable_paging()
-        self.set_terminal_width(command="terminal width 511")
         # Clear the read buffer
         time.sleep(0.3 * self.global_delay_factor)
         self.clear_buffer()
@@ -23,10 +21,6 @@ class ApresiaAeosBase(CiscoSSHConnection):
             self.send_config_set("terminal length 0")
         self.exit_enable_mode()
 
-    def set_terminal_width(self, command="", delay_factor=1):
-        """No terminal width command mode on AEOS"""
-        pass
-
 
 class ApresiaAeosSSH(ApresiaAeosBase):
     pass
@@ -36,4 +30,4 @@ class ApresiaAeosTelnet(ApresiaAeosBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(ApresiaAeosTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
diff --git a/netmiko/arista/__init__.py b/netmiko/arista/__init__.py
index d42e1cf16845a75079cf53cf982ae66cbb250ad5..3b0def0ff70c14feb0c4a0d725768a8ac4e74bc7 100644
--- a/netmiko/arista/__init__.py
+++ b/netmiko/arista/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.arista.arista import AristaSSH, AristaTelnet, AristaFileTransfer
 
 __all__ = ["AristaSSH", "AristaTelnet", "AristaFileTransfer"]
diff --git a/netmiko/arista/arista.py b/netmiko/arista/arista.py
index 8dc760d91aff634bb7ec1941c907d83148af435c..a3c9c557a294011f7a69cd7cd6f570cea7a11946 100644
--- a/netmiko/arista/arista.py
+++ b/netmiko/arista/arista.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 from netmiko.cisco_base_connection import CiscoFileTransfer
@@ -25,13 +24,13 @@ class AristaBase(CiscoSSHConnection):
 
         Can also be (s2)
         """
-        log.debug("pattern: {0}".format(pattern))
+        log.debug(f"pattern: {pattern}")
         self.write_channel(self.RETURN)
         output = self.read_until_pattern(pattern=pattern)
-        log.debug("check_config_mode: {0}".format(repr(output)))
+        log.debug(f"check_config_mode: {repr(output)}")
         output = output.replace("(s1)", "")
         output = output.replace("(s2)", "")
-        log.debug("check_config_mode: {0}".format(repr(output)))
+        log.debug(f"check_config_mode: {repr(output)}")
         return check_string in output
 
     def _enter_shell(self):
@@ -51,7 +50,7 @@ class AristaTelnet(AristaBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(AristaTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
 
 class AristaFileTransfer(CiscoFileTransfer):
@@ -64,13 +63,15 @@ class AristaFileTransfer(CiscoFileTransfer):
         dest_file,
         file_system="/mnt/flash",
         direction="put",
+        **kwargs,
     ):
-        return super(AristaFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=""):
@@ -93,7 +94,7 @@ class AristaFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == "get":
                 remote_file = self.source_file
-        remote_md5_cmd = "{} file:{}/{}".format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f"{base_cmd} file:{self.file_system}/{remote_file}"
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=4
         )
diff --git a/netmiko/aruba/__init__.py b/netmiko/aruba/__init__.py
index 41083affea668418ebc5563087bccd7c774f7859..e9350eacb0d64707ac95b1c4a5f1188a5e7565ce 100644
--- a/netmiko/aruba/__init__.py
+++ b/netmiko/aruba/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.aruba.aruba_ssh import ArubaSSH
 
 __all__ = ["ArubaSSH"]
diff --git a/netmiko/aruba/aruba_ssh.py b/netmiko/aruba/aruba_ssh.py
index c5910cc502b4517526b9f748202b21dab69eb9b7..4cf9b3dcf94670c5c2c8ad6c8bd1fea68a19ffd6 100644
--- a/netmiko/aruba/aruba_ssh.py
+++ b/netmiko/aruba/aruba_ssh.py
@@ -1,5 +1,4 @@
 """Aruba OS support"""
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -11,7 +10,7 @@ class ArubaSSH(CiscoSSHConnection):
     def __init__(self, **kwargs):
         if kwargs.get("default_enter") is None:
             kwargs["default_enter"] = "\r"
-        return super(ArubaSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         """Aruba OS requires enable mode to disable paging."""
@@ -33,6 +32,4 @@ class ArubaSSH(CiscoSSHConnection):
         """
         if not pattern:
             pattern = re.escape(self.base_prompt[:16])
-        return super(ArubaSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
diff --git a/netmiko/base_connection.py b/netmiko/base_connection.py
index 55aa7492e8ba04049208e43e0c44edd06f8ed296..0784e41409d711719c8bf9916a7f829826f6446a 100644
--- a/netmiko/base_connection.py
+++ b/netmiko/base_connection.py
@@ -6,10 +6,6 @@ platforms (Cisco and non-Cisco).
 
 Also defines methods that should generally be supported by child classes
 """
-
-from __future__ import print_function
-from __future__ import unicode_literals
-
 import io
 import re
 import socket
@@ -24,10 +20,9 @@ import serial
 
 from netmiko import log
 from netmiko.netmiko_globals import MAX_BUFFER, BACKSPACE_CHAR
-from netmiko.py23_compat import string_types, bufferedio_types, text_type
 from netmiko.ssh_exception import (
-    NetMikoTimeoutException,
-    NetMikoAuthenticationException,
+    NetmikoTimeoutException,
+    NetmikoAuthenticationException,
 )
 from netmiko.utilities import (
     write_bytes,
@@ -68,8 +63,8 @@ class BaseConnection(object):
         timeout=100,
         session_timeout=60,
         auth_timeout=None,
-        blocking_timeout=8,
-        banner_timeout=5,
+        blocking_timeout=20,
+        banner_timeout=15,
         keepalive=0,
         default_enter=None,
         response_return=None,
@@ -80,6 +75,7 @@ class BaseConnection(object):
         session_log_file_mode="write",
         allow_auto_change=False,
         encoding="ascii",
+        sock=None,
     ):
         """
         Initialize attributes for establishing connection to target device.
@@ -196,6 +192,10 @@ class BaseConnection(object):
         :param encoding: Encoding to be used when writing bytes to the output channel.
                 (default: ascii)
         :type encoding: str
+
+        :param sock: An open socket or socket-like object (such as a `.Channel`) to use for
+                communication to the target host (default: None).
+        :type sock: socket
         """
         self.remote_conn = None
 
@@ -237,6 +237,7 @@ class BaseConnection(object):
         self.keepalive = keepalive
         self.allow_auto_change = allow_auto_change
         self.encoding = encoding
+        self.sock = sock
 
         # Netmiko will close the session_log if we open the file
         self.session_log = None
@@ -245,10 +246,10 @@ class BaseConnection(object):
         # Ensures last write operations prior to disconnect are recorded.
         self._session_log_fin = False
         if session_log is not None:
-            if isinstance(session_log, string_types):
+            if isinstance(session_log, str):
                 # If session_log is a string, open a file corresponding to string name.
                 self.open_session_log(filename=session_log, mode=session_log_file_mode)
-            elif isinstance(session_log, bufferedio_types):
+            elif isinstance(session_log, io.BufferedIOBase):
                 # In-memory buffer or an already open file handle
                 self.session_log = session_log
             else:
@@ -335,7 +336,7 @@ class BaseConnection(object):
         pass
 
     def _timeout_exceeded(self, start, msg="Timeout exceeded!"):
-        """Raise NetMikoTimeoutException if waiting too much in the serving queue.
+        """Raise NetmikoTimeoutException if waiting too much in the serving queue.
 
         :param start: Initial start time to see if session lock timeout has been exceeded
         :type start: float (from time.time() call i.e. epoch time)
@@ -348,7 +349,7 @@ class BaseConnection(object):
             return False
         if time.time() - start > self.session_timeout:
             # session_timeout exceeded
-            raise NetMikoTimeoutException(msg)
+            raise NetmikoTimeoutException(msg)
         return False
 
     def _lock_netmiko_session(self, start=None):
@@ -408,7 +409,11 @@ class BaseConnection(object):
                 data = data.replace(self.password, "********")
             if self.secret:
                 data = data.replace(self.secret, "********")
-            self.session_log.write(write_bytes(data, encoding=self.encoding))
+            if isinstance(self.session_log, io.BufferedIOBase):
+                data = self.normalize_linefeeds(data)
+                self.session_log.write(write_bytes(data, encoding=self.encoding))
+            else:
+                self.session_log.write(self.normalize_linefeeds(data))
             self.session_log.flush()
 
     def write_channel(self, out_data):
@@ -475,7 +480,9 @@ class BaseConnection(object):
                 output += self.remote_conn.read(self.remote_conn.in_waiting).decode(
                     "utf-8", "ignore"
                 )
-        log.debug("read_channel: {}".format(output))
+        if self.ansi_escape_codes:
+            output = self.strip_ansi_escape_codes(output)
+        log.debug(f"read_channel: {output}")
         self._write_session_log(output)
         return output
 
@@ -518,7 +525,7 @@ class BaseConnection(object):
         output = ""
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        log.debug("Pattern is: {}".format(pattern))
+        log.debug(f"Pattern is: {pattern}")
 
         i = 1
         loop_delay = 0.1
@@ -535,11 +542,13 @@ class BaseConnection(object):
                     if len(new_data) == 0:
                         raise EOFError("Channel stream closed by remote device.")
                     new_data = new_data.decode("utf-8", "ignore")
-                    log.debug("_read_channel_expect read_data: {}".format(new_data))
+                    if self.ansi_escape_codes:
+                        new_data = self.strip_ansi_escape_codes(new_data)
+                    log.debug(f"_read_channel_expect read_data: {new_data}")
                     output += new_data
                     self._write_session_log(new_data)
                 except socket.timeout:
-                    raise NetMikoTimeoutException(
+                    raise NetmikoTimeoutException(
                         "Timed-out reading channel, data not available."
                     )
                 finally:
@@ -547,12 +556,12 @@ class BaseConnection(object):
             elif self.protocol == "telnet" or "serial":
                 output += self.read_channel()
             if re.search(pattern, output, flags=re_flags):
-                log.debug("Pattern found: {} {}".format(pattern, output))
+                log.debug(f"Pattern found: {pattern} {output}")
                 return output
             time.sleep(loop_delay * self.global_delay_factor)
             i += 1
-        raise NetMikoTimeoutException(
-            "Timed-out reading channel, pattern not found in output: {}".format(pattern)
+        raise NetmikoTimeoutException(
+            f"Timed-out reading channel, pattern not found in output: {pattern}"
         )
 
     def _read_channel_timing(self, delay_factor=1, max_loops=150):
@@ -710,8 +719,8 @@ class BaseConnection(object):
                 i += 1
             except EOFError:
                 self.remote_conn.close()
-                msg = "Login failed: {}".format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f"Login failed: {self.host}"
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -723,9 +732,9 @@ class BaseConnection(object):
         ):
             return return_msg
 
-        msg = "Login failed: {}".format(self.host)
+        msg = f"Login failed: {self.host}"
         self.remote_conn.close()
-        raise NetMikoAuthenticationException(msg)
+        raise NetmikoAuthenticationException(msg)
 
     def _try_session_preparation(self):
         """
@@ -825,6 +834,7 @@ class BaseConnection(object):
             "timeout": self.timeout,
             "auth_timeout": self.auth_timeout,
             "banner_timeout": self.banner_timeout,
+            "sock": self.sock,
         }
 
         # Check if using SSH 'config' file mainly for SSH proxy support
@@ -843,8 +853,6 @@ class BaseConnection(object):
         :param strip_command:
         :type strip_command:
         """
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
         output = self.normalize_linefeeds(output)
         if strip_command and command_string:
             command_string = self.normalize_linefeeds(command_string)
@@ -856,8 +864,8 @@ class BaseConnection(object):
     def establish_connection(self, width=None, height=None):
         """Establish SSH connection to the network device
 
-        Timeout will generate a NetMikoTimeoutException
-        Authentication failure will generate a NetMikoAuthenticationException
+        Timeout will generate a NetmikoTimeoutException
+        Authentication failure will generate a NetmikoAuthenticationException
 
         width and height are needed for Fortinet paging setting.
 
@@ -887,19 +895,17 @@ class BaseConnection(object):
                 msg = "Connection to device timed-out: {device_type} {ip}:{port}".format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                raise NetMikoTimeoutException(msg)
+                raise NetmikoTimeoutException(msg)
             except paramiko.ssh_exception.AuthenticationException as auth_err:
                 self.paramiko_cleanup()
                 msg = "Authentication failure: unable to connect {device_type} {ip}:{port}".format(
                     device_type=self.device_type, ip=self.host, port=self.port
                 )
-                msg += self.RETURN + text_type(auth_err)
-                raise NetMikoAuthenticationException(msg)
+                msg += self.RETURN + str(auth_err)
+                raise NetmikoAuthenticationException(msg)
 
             if self.verbose:
-                print(
-                    "SSH connection established to {}:{}".format(self.host, self.port)
-                )
+                print(f"SSH connection established to {self.host}:{self.port}")
 
             # Use invoke_shell to establish an 'interactive session'
             if width and height:
@@ -956,7 +962,7 @@ class BaseConnection(object):
         if new_data:
             return new_data
         else:
-            raise NetMikoTimeoutException("Timed out waiting for data")
+            raise NetmikoTimeoutException("Timed out waiting for data")
 
     def _build_ssh_client(self):
         """Prepare for Paramiko SSH connection."""
@@ -1010,12 +1016,11 @@ class BaseConnection(object):
         self.clear_buffer()
         command = self.normalize_cmd(command)
         log.debug("In disable_paging")
-        log.debug("Command: {0}".format(command))
+        log.debug(f"Command: {command}")
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
-        log.debug("{0}".format(output))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
+        log.debug(f"{output}")
         log.debug("Exiting disable_paging")
         return output
 
@@ -1036,9 +1041,8 @@ class BaseConnection(object):
         delay_factor = self.select_delay_factor(delay_factor)
         command = self.normalize_cmd(command)
         self.write_channel(command)
-        output = self.read_until_prompt()
-        if self.ansi_escape_codes:
-            output = self.strip_ansi_escape_codes(output)
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        output = self.read_until_pattern(pattern=re.escape(command.strip()))
         return output
 
     def set_base_prompt(
@@ -1065,7 +1069,7 @@ class BaseConnection(object):
         """
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError("Router prompt not found: {0}".format(repr(prompt)))
+            raise ValueError(f"Router prompt not found: {repr(prompt)}")
         # Strip off trailing terminator
         self.base_prompt = prompt[:-1]
         return self.base_prompt
@@ -1079,24 +1083,26 @@ class BaseConnection(object):
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
         self.write_channel(self.RETURN)
-        time.sleep(delay_factor * 0.1)
+        sleep_time = delay_factor * 0.1
+        time.sleep(sleep_time)
 
         # Initial attempt to get prompt
         prompt = self.read_channel()
-        if self.ansi_escape_codes:
-            prompt = self.strip_ansi_escape_codes(prompt)
 
         # Check if the only thing you received was a newline
         count = 0
         prompt = prompt.strip()
-        while count <= 10 and not prompt:
+        while count <= 12 and not prompt:
             prompt = self.read_channel().strip()
-            if prompt:
-                if self.ansi_escape_codes:
-                    prompt = self.strip_ansi_escape_codes(prompt).strip()
-            else:
+            if not prompt:
                 self.write_channel(self.RETURN)
-                time.sleep(delay_factor * 0.1)
+                # log.debug(f"find_prompt sleep time: {sleep_time}")
+                time.sleep(sleep_time)
+                if sleep_time <= 3:
+                    # Double the sleep_time when it is small
+                    sleep_time *= 2
+                else:
+                    sleep_time += 1
             count += 1
 
         # If multiple lines in the output take the last line
@@ -1104,14 +1110,25 @@ class BaseConnection(object):
         prompt = prompt.split(self.RESPONSE_RETURN)[-1]
         prompt = prompt.strip()
         if not prompt:
-            raise ValueError("Unable to find prompt: {}".format(prompt))
+            raise ValueError(f"Unable to find prompt: {prompt}")
         time.sleep(delay_factor * 0.1)
         self.clear_buffer()
+        log.debug(f"[find_prompt()]: prompt is {prompt}")
         return prompt
 
-    def clear_buffer(self):
+    def clear_buffer(self, backoff=True):
         """Read any data available in the channel."""
-        self.read_channel()
+        sleep_time = 0.1 * self.global_delay_factor
+        for _ in range(10):
+            time.sleep(sleep_time)
+            data = self.read_channel()
+            if not data:
+                break
+            # Double sleep time each time we detect data
+            log.debug("Clear buffer detects data in the channel")
+            if backoff:
+                sleep_time *= 2
+                sleep_time = 3 if sleep_time >= 3 else sleep_time
 
     def send_command_timing(
         self,
@@ -1122,7 +1139,9 @@ class BaseConnection(object):
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
+        cmd_echo=False,
     ):
         """Execute command_string on the SSH channel using a delay-based mechanism. Generally
         used for show commands.
@@ -1147,10 +1166,17 @@ class BaseConnection(object):
         :type normalize: bool
 
         :param use_textfsm: Process command output through TextFSM template (default: False).
-        :type normalize: bool
+        :type use_textfsm: bool
+
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+        :type textfsm_template: str
 
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
-        :type normalize: bool
+        :type use_genie: bool
+
+        :param cmd_echo: Verify command echo before proceeding (default: False).
+        :type cmd_echo: bool
         """
         output = ""
         delay_factor = self.select_delay_factor(delay_factor)
@@ -1159,7 +1185,27 @@ class BaseConnection(object):
             command_string = self.normalize_cmd(command_string)
 
         self.write_channel(command_string)
-        output = self._read_channel_timing(
+
+        cmd = command_string.strip()
+        # if cmd is just an "enter" skip this section
+        if cmd and cmd_echo:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+
+            # Strip off everything before the command echo
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                output = f"{cmd}{self.RESPONSE_RETURN}{new_data}"
+            else:
+                # cmd is in the actual output (not just echoed)
+                output = new_data
+
+        log.debug(f"send_command_timing current output: {output}")
+
+        output += self._read_channel_timing(
             delay_factor=delay_factor, max_loops=max_loops
         )
         output = self._sanitize_output(
@@ -1168,18 +1214,27 @@ class BaseConnection(object):
             command_string=command_string,
             strip_prompt=strip_prompt,
         )
+
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+
+        log.debug(f"send_command_timing final output: {output}")
         return output
 
     def strip_prompt(self, a_string):
@@ -1233,6 +1288,7 @@ class BaseConnection(object):
         strip_command=True,
         normalize=True,
         use_textfsm=False,
+        textfsm_template=None,
         use_genie=False,
     ):
         """Execute command_string on the SSH channel using a pattern-based mechanism. Generally
@@ -1266,6 +1322,9 @@ class BaseConnection(object):
         :param use_textfsm: Process command output through TextFSM template (default: False).
         :type normalize: bool
 
+        :param textfsm_template: Name of template to parse output with; can be fully qualified
+            path, relative path, or name of file in current directory. (default: None).
+
         :param use_genie: Process command output through PyATS/Genie parser (default: False).
         :type normalize: bool
         """
@@ -1298,6 +1357,20 @@ class BaseConnection(object):
         time.sleep(delay_factor * loop_delay)
         self.clear_buffer()
         self.write_channel(command_string)
+        new_data = ""
+
+        cmd = command_string.strip()
+        # if cmd is just and "enter" skip this section
+        if cmd:
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            new_data = self.read_until_pattern(pattern=re.escape(cmd))
+            new_data = self.normalize_linefeeds(new_data)
+            # Strip off everything before the command echo (to avoid false positives on the prompt)
+            if new_data.count(cmd) == 1:
+                new_data = new_data.split(cmd)[1:]
+                new_data = self.RESPONSE_RETURN.join(new_data)
+                new_data = new_data.lstrip()
+                new_data = f"{cmd}{self.RESPONSE_RETURN}{new_data}"
 
         i = 1
         output = ""
@@ -1306,11 +1379,7 @@ class BaseConnection(object):
 
         # Keep reading data until search_pattern is found or until max_loops is reached.
         while i <= max_loops:
-            new_data = self.read_channel()
             if new_data:
-                if self.ansi_escape_codes:
-                    new_data = self.strip_ansi_escape_codes(new_data)
-
                 output += new_data
                 past_three_reads.append(new_data)
 
@@ -1331,6 +1400,7 @@ class BaseConnection(object):
 
             time.sleep(delay_factor * loop_delay)
             i += 1
+            new_data = self.read_channel()
         else:  # nobreak
             raise IOError(
                 "Search pattern never detected in send_command_expect: {}".format(
@@ -1346,17 +1416,23 @@ class BaseConnection(object):
         )
 
         # If both TextFSM and Genie are set, try TextFSM then Genie
-        for parser_flag, parser_func in (
-            (use_textfsm, get_structured_data),
-            (use_genie, get_structured_data_genie),
-        ):
-            if parser_flag:
-                structured_output = parser_func(
-                    output, platform=self.device_type, command=command_string.strip()
-                )
-                # If we have structured data; return it.
-                if not isinstance(structured_output, string_types):
-                    return structured_output
+        if use_textfsm:
+            structured_output = get_structured_data(
+                output,
+                platform=self.device_type,
+                command=command_string.strip(),
+                template=textfsm_template,
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
+        if use_genie:
+            structured_output = get_structured_data_genie(
+                output, platform=self.device_type, command=command_string.strip()
+            )
+            # If we have structured data; return it.
+            if not isinstance(structured_output, str):
+                return structured_output
         return output
 
     def send_command_expect(self, *args, **kwargs):
@@ -1397,12 +1473,17 @@ class BaseConnection(object):
         # Check for line wrap (remove backspaces)
         if backspace_char in output:
             output = output.replace(backspace_char, "")
+
+        # Juniper has a weird case where the echoed command will be " \n"
+        # i.e. there is an extra space there.
+        cmd = command_string.strip()
+        if output.startswith(cmd):
             output_lines = output.split(self.RESPONSE_RETURN)
             new_output = output_lines[1:]
             return self.RESPONSE_RETURN.join(new_output)
         else:
-            command_length = len(command_string)
-            return output[command_length:]
+            # command_string isn't there; do nothing
+            return output
 
     def normalize_linefeeds(self, a_string):
         """Convert `\r\r\n`,`\r\n`, `\n\r` to `\n.`
@@ -1464,7 +1545,7 @@ class BaseConnection(object):
                 )
                 self.write_channel(self.normalize_cmd(self.secret))
                 output += self.read_until_prompt()
-            except NetMikoTimeoutException:
+            except NetmikoTimeoutException:
                 raise ValueError(msg)
             if not self.check_enable_mode():
                 raise ValueError(msg)
@@ -1513,7 +1594,10 @@ class BaseConnection(object):
         output = ""
         if not self.check_config_mode():
             self.write_channel(self.normalize_cmd(config_command))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(config_command.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if not self.check_config_mode():
                 raise ValueError("Failed to enter configuration mode.")
         return output
@@ -1530,10 +1614,13 @@ class BaseConnection(object):
         output = ""
         if self.check_config_mode():
             self.write_channel(self.normalize_cmd(exit_config))
-            output = self.read_until_pattern(pattern=pattern)
+            # Make sure you read until you detect the command echo (avoid getting out of sync)
+            output += self.read_until_pattern(pattern=re.escape(exit_config.strip()))
+            if not re.search(pattern, output, flags=re.M):
+                output += self.read_until_pattern(pattern=pattern)
             if self.check_config_mode():
                 raise ValueError("Failed to exit configuration mode")
-        log.debug("exit_config_mode: {}".format(output))
+        log.debug(f"exit_config_mode: {output}")
         return output
 
     def send_config_from_file(self, config_file=None, **kwargs):
@@ -1563,6 +1650,8 @@ class BaseConnection(object):
         strip_prompt=False,
         strip_command=False,
         config_mode_command=None,
+        cmd_verify=True,
+        enter_config_mode=True,
     ):
         """
         Send configuration commands down the SSH channel.
@@ -1592,34 +1681,64 @@ class BaseConnection(object):
 
         :param config_mode_command: The command to enter into config mode
         :type config_mode_command: str
+
+        :param cmd_verify: Whether or not to verify command echo for each command in config_set
+        :type cmd_verify: bool
+
+        :param enter_config_mode: Do you enter config mode before sending config commands
+        :type exit_config_mode: bool
+
         """
         delay_factor = self.select_delay_factor(delay_factor)
         if config_commands is None:
             return ""
-        elif isinstance(config_commands, string_types):
+        elif isinstance(config_commands, str):
             config_commands = (config_commands,)
 
         if not hasattr(config_commands, "__iter__"):
             raise ValueError("Invalid argument passed into send_config_set")
 
         # Send config commands
-        cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
-        output = self.config_mode(*cfg_mode_args)
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            if self.fast_cli:
-                pass
-            else:
+        if enter_config_mode:
+            cfg_mode_args = (config_mode_command,) if config_mode_command else tuple()
+            output = self.config_mode(*cfg_mode_args)
+
+        if self.fast_cli:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        elif not cmd_verify:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
                 time.sleep(delay_factor * 0.05)
+            # Gather output
+            output += self._read_channel_timing(
+                delay_factor=delay_factor, max_loops=max_loops
+            )
+        else:
+            for cmd in config_commands:
+                self.write_channel(self.normalize_cmd(cmd))
+
+                # Make sure command is echoed
+                new_output = self.read_until_pattern(pattern=re.escape(cmd.strip()))
+                output += new_output
+
+                # We might capture next prompt in the original read
+                pattern = f"(?:{re.escape(self.base_prompt)}|#)"
+                if not re.search(pattern, new_output):
+                    # Make sure trailing prompt comes back (after command)
+                    # NX-OS has fast-buffering problem where it immediately echoes command
+                    # Even though the device hasn't caught up with processing command.
+                    new_output = self.read_until_pattern(pattern=pattern)
+                    output += new_output
 
-        # Gather output
-        output += self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
-        )
         if exit_config_mode:
             output += self.exit_config_mode()
         output = self._sanitize_output(output)
-        log.debug("{}".format(output))
+        log.debug(f"{output}")
         return output
 
     def strip_ansi_escape_codes(self, string_buffer):
@@ -1653,7 +1772,7 @@ class BaseConnection(object):
         :type string_buffer: str
         """  # noqa
         log.debug("In strip_ansi_escape_codes")
-        log.debug("repr = {}".format(repr(string_buffer)))
+        log.debug(f"repr = {repr(string_buffer)}")
 
         code_position_cursor = chr(27) + r"\[\d+;\d+H"
         code_show_cursor = chr(27) + r"\[\?25h"
@@ -1709,8 +1828,9 @@ class BaseConnection(object):
         # CODE_NEXT_LINE must substitute with return
         output = re.sub(code_next_line, self.RETURN, output)
 
-        log.debug("new_output = {0}".format(output))
-        log.debug("repr = {0}".format(repr(output)))
+        log.debug("Stripping ANSI escape codes")
+        log.debug(f"new_output = {output}")
+        log.debug(f"repr = {repr(output)}")
 
         return output
 
@@ -1752,9 +1872,9 @@ class BaseConnection(object):
     def open_session_log(self, filename, mode="write"):
         """Open the session_log file."""
         if mode == "append":
-            self.session_log = open(filename, mode="ab")
+            self.session_log = open(filename, mode="a")
         else:
-            self.session_log = open(filename, mode="wb")
+            self.session_log = open(filename, mode="w")
         self._session_log_close = True
 
     def close_session_log(self):
diff --git a/netmiko/calix/__init__.py b/netmiko/calix/__init__.py
index fbd60838927031f5dc5f13444a67f08d7e3a8e79..0cbf5f6d03b0440f5602bdf85ca4a1a55c6e8707 100644
--- a/netmiko/calix/__init__.py
+++ b/netmiko/calix/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.calix.calix_b6 import CalixB6SSH, CalixB6Telnet
 
 __all__ = ["CalixB6SSH", "CalixB6Telnet"]
diff --git a/netmiko/calix/calix_b6.py b/netmiko/calix/calix_b6.py
index 992434e5680f419dded0f0861d511d3e88200eef..c49cde0c6863e0676c46b1cdac0630f9a9d8cabc 100644
--- a/netmiko/calix/calix_b6.py
+++ b/netmiko/calix/calix_b6.py
@@ -1,6 +1,4 @@
 """Calix B6 SSH Driver for Netmiko"""
-from __future__ import unicode_literals
-
 import time
 from os import path
 
@@ -23,7 +21,7 @@ class CalixB6Base(CiscoSSHConnection):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(CalixB6Base, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def session_preparation(self):
         """Prepare the session after the connection has been established."""
@@ -63,10 +61,10 @@ class CalixB6Base(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=")#", pattern=""):
         """Checks if the device is in configuration mode"""
-        return super(CalixB6Base, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def save_config(self, cmd="copy run start", confirm=False, confirm_response=""):
-        return super(CalixB6Base, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
diff --git a/netmiko/checkpoint/__init__.py b/netmiko/checkpoint/__init__.py
index debdcddc634d33f2ebf14bd3e6bb6d137fa60d72..a3503a0a291591ba3f047aacfb06c7a3ab19a9dd 100644
--- a/netmiko/checkpoint/__init__.py
+++ b/netmiko/checkpoint/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.checkpoint.checkpoint_gaia_ssh import CheckPointGaiaSSH
 
 __all__ = ["CheckPointGaiaSSH"]
diff --git a/netmiko/checkpoint/checkpoint_gaia_ssh.py b/netmiko/checkpoint/checkpoint_gaia_ssh.py
index 60fae47a15ef8f5b335227a977b0a91e69316e51..8ec4019ba50e6b44da9bfa964e2103d4884052cc 100644
--- a/netmiko/checkpoint/checkpoint_gaia_ssh.py
+++ b/netmiko/checkpoint/checkpoint_gaia_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.base_connection import BaseConnection
 
diff --git a/netmiko/ciena/__init__.py b/netmiko/ciena/__init__.py
index 1fd08a6866e59f443c5c4e2936e71b2b1169f849..1cfee9397949d7ddf0b30e42ca45aee3773cfbcc 100644
--- a/netmiko/ciena/__init__.py
+++ b/netmiko/ciena/__init__.py
@@ -1,4 +1,7 @@
-from __future__ import unicode_literals
-from netmiko.ciena.ciena_saos_ssh import CienaSaosSSH
+from netmiko.ciena.ciena_saos import (
+    CienaSaosSSH,
+    CienaSaosTelnet,
+    CienaSaosFileTransfer,
+)
 
-__all__ = ["CienaSaosSSH"]
+__all__ = ["CienaSaosSSH", "CienaSaosTelnet", "CienaSaosFileTransfer"]
diff --git a/netmiko/ciena/ciena_saos.py b/netmiko/ciena/ciena_saos.py
new file mode 100644
index 0000000000000000000000000000000000000000..3067c5fc67afbc752a00ca02bdef69dbd4749b2c
--- /dev/null
+++ b/netmiko/ciena/ciena_saos.py
@@ -0,0 +1,216 @@
+"""Ciena SAOS support."""
+import time
+import re
+import os
+from netmiko.base_connection import BaseConnection
+from netmiko.scp_handler import BaseFileTransfer
+
+
+class CienaSaosBase(BaseConnection):
+    """
+    Ciena SAOS support.
+
+    Implements methods for interacting Ciena Saos devices.
+
+    Disables enable(), check_enable_mode(), config_mode() and
+    check_config_mode()
+    """
+
+    def session_preparation(self):
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command="system shell session set more off")
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def _enter_shell(self):
+        """Enter the Bourne Shell."""
+        output = self.send_command("diag shell", expect_string=r"[$#>]")
+        if "SHELL PARSER FAILURE" in output:
+            msg = "SCP support on Ciena SAOS requires 'diag shell' permissions"
+            raise ValueError(msg)
+        return output
+
+    def _return_cli(self):
+        """Return to the Ciena SAOS CLI."""
+        return self.send_command("exit", expect_string=r"[>]")
+
+    def check_enable_mode(self, *args, **kwargs):
+        """No enable mode on Ciena SAOS."""
+        return True
+
+    def enable(self, *args, **kwargs):
+        """No enable mode on Ciena SAOS."""
+        return ""
+
+    def exit_enable_mode(self, *args, **kwargs):
+        """No enable mode on Ciena SAOS."""
+        return ""
+
+    def check_config_mode(self, check_string=">", pattern=""):
+        """No config mode on Ciena SAOS."""
+        return False
+
+    def config_mode(self, config_command=""):
+        """No config mode on Ciena SAOS."""
+        return ""
+
+    def exit_config_mode(self, exit_config=""):
+        """No config mode on Ciena SAOS."""
+        return ""
+
+    def save_config(self, cmd="configuration save", confirm=False, confirm_response=""):
+        """Saves Config."""
+        return self.send_command(command_string=cmd)
+
+
+class CienaSaosSSH(CienaSaosBase):
+    pass
+
+
+class CienaSaosTelnet(CienaSaosBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get("default_enter")
+        kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)
+
+
+class CienaSaosFileTransfer(BaseFileTransfer):
+    """Ciena SAOS SCP File Transfer driver."""
+
+    def __init__(
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system="",
+        direction="put",
+        **kwargs,
+    ):
+        if file_system == "":
+            file_system = f"/tmp/users/{ssh_conn.username}"
+        return super().__init__(
+            ssh_conn=ssh_conn,
+            source_file=source_file,
+            dest_file=dest_file,
+            file_system=file_system,
+            direction=direction,
+            **kwargs,
+        )
+
+    def remote_space_available(self, search_pattern=""):
+        """
+        Return space available on Ciena SAOS
+
+        Output should only have the file-system that matches {self.file_system}
+
+        Filesystem           1K-blocks      Used Available Use% Mounted on
+        tmpfs                  1048576       648   1047928   0% /tmp
+        """
+        remote_cmd = f"file vols -P {self.file_system}"
+        remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+        remote_output = remote_output.strip()
+        err_msg = (
+            f"Parsing error, unexpected output from {remote_cmd}:\n{remote_output}"
+        )
+
+        # First line is the header; file_system_line is the output we care about
+        header_line, filesystem_line = remote_output.splitlines()
+
+        filesystem, _, _, space_avail, *_ = header_line.split()
+        if "Filesystem" != filesystem or "Avail" not in space_avail:
+            # Filesystem 1K-blocks Used Available Use% Mounted on
+            raise ValueError(err_msg)
+
+        # Normalize output - in certain outputs ciena will line wrap (this fixes that)
+        # Strip the extra newline
+        # /dev/mapper/EN--VOL-config
+        #                  4096      1476      2620  36% /etc/hosts
+        filesystem_line = re.sub(r"(^\S+$)\n", r"\1", filesystem_line, flags=re.M)
+
+        # Checks to make sure what was returned is what we expect
+        _, k_blocks, used, space_avail, _, _ = filesystem_line.split()
+        for integer_check in (k_blocks, used, space_avail):
+            try:
+                int(integer_check)
+            except ValueError:
+                raise ValueError(err_msg)
+
+        return int(space_avail) * 1024
+
+    def check_file_exists(self, remote_cmd=""):
+        """Check if the dest_file already exists on the file system (return boolean)."""
+        if self.direction == "put":
+            if not remote_cmd:
+                remote_cmd = f"file ls {self.file_system}/{self.dest_file}"
+            remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+            search_string = re.escape(f"{self.file_system}/{self.dest_file}")
+            if "ERROR" in remote_out:
+                return False
+            elif re.search(search_string, remote_out):
+                return True
+            else:
+                raise ValueError("Unexpected output from check_file_exists")
+        elif self.direction == "get":
+            return os.path.exists(self.dest_file)
+
+    def remote_file_size(self, remote_cmd="", remote_file=None):
+        """Get the file size of the remote file."""
+        if remote_file is None:
+            if self.direction == "put":
+                remote_file = self.dest_file
+            elif self.direction == "get":
+                remote_file = self.source_file
+
+        remote_file = f"{self.file_system}/{remote_file}"
+
+        if not remote_cmd:
+            remote_cmd = f"file ls -l {remote_file}"
+
+        remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
+
+        if "No such file or directory" in remote_out:
+            raise IOError("Unable to find file on remote system")
+
+        escape_file_name = re.escape(remote_file)
+        pattern = r"^.* ({}).*$".format(escape_file_name)
+        match = re.search(pattern, remote_out, flags=re.M)
+        if match:
+            # Format: -rw-r--r--  1 pyclass  wheel  12 Nov  5 19:07 /var/tmp/test3.txt
+            line = match.group(0)
+            file_size = line.split()[4]
+            return int(file_size)
+
+        raise ValueError(
+            "Search pattern not found for remote file size during SCP transfer."
+        )
+
+    def remote_md5(self, base_cmd="", remote_file=None):
+        """Calculate remote MD5 and returns the hash.
+
+        This command can be CPU intensive on the remote device.
+        """
+        if base_cmd == "":
+            base_cmd = "md5sum"
+        if remote_file is None:
+            if self.direction == "put":
+                remote_file = self.dest_file
+            elif self.direction == "get":
+                remote_file = self.source_file
+
+        remote_md5_cmd = f"{base_cmd} {self.file_system}/{remote_file}"
+
+        self.ssh_ctl_chan._enter_shell()
+        dest_md5 = self.ssh_ctl_chan.send_command(
+            remote_md5_cmd, expect_string=r"[$#>]"
+        )
+        self.ssh_ctl_chan._return_cli()
+        dest_md5 = self.process_md5(dest_md5, pattern=r"([0-9a-f]+)\s+")
+        return dest_md5
+
+    def enable_scp(self, cmd="system server scp enable"):
+        return super().enable_scp(cmd=cmd)
+
+    def disable_scp(self, cmd="system server scp disable"):
+        return super().disable_scp(cmd=cmd)
diff --git a/netmiko/ciena/ciena_saos_ssh.py b/netmiko/ciena/ciena_saos_ssh.py
deleted file mode 100644
index d760a5b215a0bda1ec7415fb5d9c8b7e5d304a0a..0000000000000000000000000000000000000000
--- a/netmiko/ciena/ciena_saos_ssh.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""Ciena SAOS support."""
-from __future__ import print_function
-from __future__ import unicode_literals
-import time
-from netmiko.cisco_base_connection import CiscoSSHConnection
-
-
-class CienaSaosSSH(CiscoSSHConnection):
-    """Ciena SAOS support."""
-
-    def session_preparation(self):
-        self._test_channel_read()
-        self.set_base_prompt()
-        self.disable_paging(command="system shell session set more off")
-        # Clear the read buffer
-        time.sleep(0.3 * self.global_delay_factor)
-        self.clear_buffer()
-
-    def enable(self, *args, **kwargs):
-        pass
-
-    def save_config(self, *args, **kwargs):
-        """Not Implemented"""
-        raise NotImplementedError
diff --git a/netmiko/cisco/__init__.py b/netmiko/cisco/__init__.py
index a6fbcd73402a80bdc407782afd0f6152a8a3437c..ac3868e550efa37e2decbbc571f6add9c03f9959 100644
--- a/netmiko/cisco/__init__.py
+++ b/netmiko/cisco/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.cisco.cisco_ios import (
     CiscoIosBase,
     CiscoIosSSH,
diff --git a/netmiko/cisco/cisco_asa_ssh.py b/netmiko/cisco/cisco_asa_ssh.py
index 833771e9fd2686c83456f60bf2afa2c5b50da0a5..ac9f92bd2f420f389ee32c4eb0e1da3cf053cb78 100644
--- a/netmiko/cisco/cisco_asa_ssh.py
+++ b/netmiko/cisco/cisco_asa_ssh.py
@@ -1,6 +1,4 @@
 """Subclass specific to Cisco ASA."""
-
-from __future__ import unicode_literals
 import re
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection, CiscoFileTransfer
@@ -34,7 +32,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
         If the ASA is in multi-context mode, then the base_prompt needs to be
         updated after each context change.
         """
-        output = super(CiscoAsaSSH, self).send_command_timing(*args, **kwargs)
+        output = super().send_command_timing(*args, **kwargs)
         if len(args) >= 1:
             command_string = args[0]
         else:
@@ -58,7 +56,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
             if len(args) <= 1:
                 expect_string = kwargs.get("expect_string", "#")
                 kwargs["expect_string"] = expect_string
-        output = super(CiscoAsaSSH, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
 
         if "changeto" in command_string:
             self.set_base_prompt()
@@ -77,7 +75,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
         This switch of ASA contexts can occur in configuration mode. If this
         happens the trailing '(config*' needs stripped off.
         """
-        cur_base_prompt = super(CiscoAsaSSH, self).set_base_prompt(*args, **kwargs)
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
         match = re.search(r"(.*)\(conf.*", cur_base_prompt)
         if match:
             # strip off (conf.* from base_prompt
@@ -112,7 +110,7 @@ class CiscoAsaSSH(CiscoSSHConnection):
 
     def save_config(self, cmd="write mem", confirm=False, confirm_response=""):
         """Saves Config"""
-        return super(CiscoAsaSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
diff --git a/netmiko/cisco/cisco_ios.py b/netmiko/cisco/cisco_ios.py
index e82a993ba4387f65fc435ec020aa155aa31c43c8..932f3c13556d8893d328eafadd034547d627c6b5 100644
--- a/netmiko/cisco/cisco_ios.py
+++ b/netmiko/cisco/cisco_ios.py
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-
 import time
 import re
 import os
@@ -28,13 +26,11 @@ class CiscoIosBase(CiscoBaseConnection):
 
         Cisco IOS devices abbreviate the prompt at 20 chars in config mode
         """
-        return super(CiscoIosBase, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def save_config(self, cmd="write mem", confirm=False, confirm_response=""):
         """Saves Config Using Copy Run Start"""
-        return super(CiscoIosBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -74,6 +70,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         file_system=None,
         direction="put",
         source_config=None,
+        socket_timeout=10.0,
     ):
         if source_file and source_config:
             msg = "Invalid call to InLineTransfer both source_file and source_config specified."
@@ -100,6 +97,8 @@ class InLineTransfer(CiscoIosFileTransfer):
         else:
             self.file_system = file_system
 
+        self.socket_timeout = socket_timeout
+
     @staticmethod
     def _read_file(file_name):
         with io.open(file_name, "rt", encoding="utf-8") as f:
@@ -107,7 +106,7 @@ class InLineTransfer(CiscoIosFileTransfer):
 
     @staticmethod
     def _tcl_newline_rationalize(tcl_string):
-        """
+        r"""
         When using put inside a TCL {} section the newline is considered a new TCL
         statement and causes a missing curly-brace message. Convert "\n" to "\r". TCL
         will convert the "\r" to a "\n" i.e. you will see a "\n" inside the file on the
@@ -139,9 +138,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         )
         for pattern in cmd_failed:
             if pattern in output:
-                raise ValueError(
-                    "Failed to enter tclsh mode on router: {}".format(output)
-                )
+                raise ValueError(f"Failed to enter tclsh mode on router: {output}")
         return output
 
     def _exit_tcl_mode(self):
@@ -172,10 +169,7 @@ class InLineTransfer(CiscoIosFileTransfer):
         return hashlib.md5(file_contents).hexdigest()
 
     def config_md5(self, source_config):
-        """Compute MD5 hash of file."""
-        file_contents = source_config + "\n"  # Cisco IOS automatically adds this
-        file_contents = file_contents.encode("UTF-8")
-        return hashlib.md5(file_contents).hexdigest()
+        return super().file_md5(source_config, add_newline=True)
 
     def put_file(self):
         curlybrace = r"{"
diff --git a/netmiko/cisco/cisco_nxos_ssh.py b/netmiko/cisco/cisco_nxos_ssh.py
index 916a0fb7d31c1506d11c0e2f8ff19518af35adae..c45b92dbf305bb42c96d1ee7b31258808dd70182 100644
--- a/netmiko/cisco/cisco_nxos_ssh.py
+++ b/netmiko/cisco/cisco_nxos_ssh.py
@@ -1,5 +1,3 @@
-from __future__ import print_function
-from __future__ import unicode_literals
 import re
 import time
 import os
@@ -26,9 +24,7 @@ class CiscoNxosSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=")#", pattern="#"):
         """Checks if the device is in configuration mode or not."""
-        return super(CiscoNxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
 
 class CiscoNxosFileTransfer(CiscoFileTransfer):
@@ -41,6 +37,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
         dest_file,
         file_system="bootflash:",
         direction="put",
+        socket_timeout=10.0,
     ):
         self.ssh_ctl_chan = ssh_conn
         self.source_file = source_file
@@ -61,11 +58,13 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
         else:
             raise ValueError("Invalid direction specified")
 
+        self.socket_timeout = socket_timeout
+
     def check_file_exists(self, remote_cmd=""):
         """Check if the dest_file already exists on the file system (return boolean)."""
         if self.direction == "put":
             if not remote_cmd:
-                remote_cmd = "dir {}{}".format(self.file_system, self.dest_file)
+                remote_cmd = f"dir {self.file_system}{self.dest_file}"
             remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
             search_string = r"{}.*Usage for".format(self.dest_file)
             if "No such file or directory" in remote_out:
@@ -86,7 +85,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
                 remote_file = self.source_file
 
         if not remote_cmd:
-            remote_cmd = "dir {}/{}".format(self.file_system, remote_file)
+            remote_cmd = f"dir {self.file_system}/{remote_file}"
 
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         # Match line containing file name
@@ -113,9 +112,7 @@ class CiscoNxosFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == "get":
                 remote_file = self.source_file
-        remote_md5_cmd = "{} {}{} md5sum".format(
-            base_cmd, self.file_system, remote_file
-        )
+        remote_md5_cmd = f"{base_cmd} {self.file_system}{remote_file} md5sum"
         return self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500).strip()
 
     def enable_scp(self, cmd=None):
diff --git a/netmiko/cisco/cisco_s300.py b/netmiko/cisco/cisco_s300.py
index 2630486e80a96b0ca8407c800e03ae0d89930185..97599f8a7d799e831c9b3d1f9d779ad022c97d30 100644
--- a/netmiko/cisco/cisco_s300.py
+++ b/netmiko/cisco/cisco_s300.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -24,6 +23,6 @@ class CiscoS300SSH(CiscoSSHConnection):
         time.sleep(0.3 * self.global_delay_factor)
 
     def save_config(self, cmd="write memory", confirm=True, confirm_response="Y"):
-        return super(CiscoS300SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/cisco/cisco_tp_tcce.py b/netmiko/cisco/cisco_tp_tcce.py
index f0e30d0bfb21f3d0e1b60bbb871bb227a37e2090..1043deecbf7980617145c5f90581c49d9f56d20b 100644
--- a/netmiko/cisco/cisco_tp_tcce.py
+++ b/netmiko/cisco/cisco_tp_tcce.py
@@ -5,7 +5,6 @@ Expressway/VCS
 
 Written by Ahmad Barrin
 """
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -15,7 +14,7 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(CiscoTpTcCeSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def disable_paging(self, *args, **kwargs):
         """Paging is disabled by default."""
@@ -66,13 +65,6 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
 
         By default this method will keep waiting to receive data until the network device prompt is
         detected. The current network device prompt will be determined automatically.
-
-        command_string = command to execute
-        expect_string = pattern to search for uses re.search (use raw strings)
-        delay_factor = decrease the initial delay before we start looking for data
-        max_loops = number of iterations before we give up and raise an exception
-        strip_prompt = strip the trailing prompt from the output
-        strip_command = strip the leading command from the output
         """
         if len(args) >= 2:
             expect_string = args[1]
@@ -83,7 +75,7 @@ class CiscoTpTcCeSSH(CiscoSSHConnection):
                 expect_string = self.RETURN + expect_string + self.RETURN
                 kwargs.setdefault("expect_string", expect_string)
 
-        output = super(CiscoSSHConnection, self).send_command(*args, **kwargs)
+        output = super().send_command(*args, **kwargs)
         return output
 
     def save_config(self, *args, **kwargs):
diff --git a/netmiko/cisco/cisco_wlc_ssh.py b/netmiko/cisco/cisco_wlc_ssh.py
index 18c1f7854c0edbe025e09c7aa3c5c60ca90fbf3a..21bf61c079d46df3056140a414a0e2b2f05b1775 100644
--- a/netmiko/cisco/cisco_wlc_ssh.py
+++ b/netmiko/cisco/cisco_wlc_ssh.py
@@ -1,13 +1,9 @@
 """Netmiko Cisco WLC support."""
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 import re
 
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 from netmiko.base_connection import BaseConnection
-from netmiko.py23_compat import string_types
-from netmiko import log
 
 
 class CiscoWlcSSH(BaseConnection):
@@ -105,8 +101,8 @@ class CiscoWlcSSH(BaseConnection):
         try:
             self.set_base_prompt()
         except ValueError:
-            msg = "Authentication failed: {}".format(self.host)
-            raise NetMikoAuthenticationException(msg)
+            msg = f"Authentication failed: {self.host}"
+            raise NetmikoAuthenticationException(msg)
 
         self.disable_paging(command="config paging disable")
         # Clear the read buffer
@@ -121,59 +117,33 @@ class CiscoWlcSSH(BaseConnection):
         """Checks if the device is in configuration mode or not."""
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).check_config_mode(check_string, pattern)
+        return super().check_config_mode(check_string, pattern)
 
     def config_mode(self, config_command="config", pattern=""):
         """Enter into config_mode."""
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).config_mode(config_command, pattern)
+        return super().config_mode(config_command, pattern)
 
     def exit_config_mode(self, exit_config="exit", pattern=""):
         """Exit config_mode."""
         if not pattern:
             pattern = re.escape(self.base_prompt)
-        return super(CiscoWlcSSH, self).exit_config_mode(exit_config, pattern)
+        return super().exit_config_mode(exit_config, pattern)
 
     def send_config_set(
         self,
         config_commands=None,
-        exit_config_mode=True,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
+        exit_config_mode=False,
+        enter_config_mode=False,
+        **kwargs,
     ):
-        """
-        Send configuration commands down the SSH channel.
-
-        config_commands is an iterable containing all of the configuration commands.
-        The commands will be executed one after the other.
-
-        Does not automatically exit/enter configuration mode.
-        """
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return ""
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, "__iter__"):
-            raise ValueError("Invalid argument passed into send_config_set")
-
-        # Send config commands
-        for cmd in config_commands:
-            self.write_channel(self.normalize_cmd(cmd))
-            time.sleep(delay_factor * 0.5)
-
-        # Gather output
-        output = self._read_channel_timing(
-            delay_factor=delay_factor, max_loops=max_loops
+        return super().send_config_set(
+            config_commands=config_commands,
+            exit_config_mode=exit_config_mode,
+            enter_config_mode=enter_config_mode,
+            **kwargs,
         )
-        output = self._sanitize_output(output)
-        log.debug("{}".format(output))
-        return output
 
     def save_config(self, cmd="save config", confirm=True, confirm_response="y"):
         """Saves Config."""
diff --git a/netmiko/cisco/cisco_xr.py b/netmiko/cisco/cisco_xr.py
index a7e0f1683aaa99bc57567f9d06eccd85c73c9096..e6986098c4edfe8463e0689f2562185bfc279769 100644
--- a/netmiko/cisco/cisco_xr.py
+++ b/netmiko/cisco/cisco_xr.py
@@ -1,9 +1,6 @@
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoBaseConnection, CiscoFileTransfer
-from netmiko.py23_compat import text_type
 
 
 class CiscoXrBase(CiscoBaseConnection):
@@ -17,10 +14,10 @@ class CiscoXrBase(CiscoBaseConnection):
         time.sleep(0.3 * self.global_delay_factor)
         self.clear_buffer()
 
-    def send_config_set(self, config_commands=None, exit_config_mode=True, **kwargs):
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
         """IOS-XR requires you not exit from configuration mode."""
-        return super(CiscoXrBase, self).send_config_set(
-            config_commands=config_commands, exit_config_mode=False, **kwargs
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
     def commit(
@@ -71,26 +68,26 @@ class CiscoXrBase(CiscoBaseConnection):
         if comment:
             if '"' in comment:
                 raise ValueError("Invalid comment contains double quote")
-            comment = '"{0}"'.format(comment)
+            comment = f'"{comment}"'
 
-        label = text_type(label)
+        label = str(label)
         error_marker = "Failed to"
         alt_error_marker = "One or more commits have occurred from other"
 
         # Select proper command string based on arguments provided
         if label:
             if comment:
-                command_string = "commit label {} comment {}".format(label, comment)
+                command_string = f"commit label {label} comment {comment}"
             elif confirm:
                 command_string = "commit label {} confirmed {}".format(
-                    label, text_type(confirm_delay)
+                    label, str(confirm_delay)
                 )
             else:
-                command_string = "commit label {}".format(label)
+                command_string = f"commit label {label}"
         elif confirm:
-            command_string = "commit confirmed {}".format(text_type(confirm_delay))
+            command_string = f"commit confirmed {str(confirm_delay)}"
         elif comment:
-            command_string = "commit comment {}".format(comment)
+            command_string = f"commit comment {comment}"
         else:
             command_string = "commit"
 
@@ -103,17 +100,13 @@ class CiscoXrBase(CiscoBaseConnection):
             delay_factor=delay_factor,
         )
         if error_marker in output:
-            raise ValueError(
-                "Commit failed with the following errors:\n\n{0}".format(output)
-            )
+            raise ValueError(f"Commit failed with the following errors:\n\n{output}")
         if alt_error_marker in output:
             # Other commits occurred, don't proceed with commit
             output += self.send_command_timing(
                 "no", strip_prompt=False, strip_command=False, delay_factor=delay_factor
             )
-            raise ValueError(
-                "Commit failed with the following errors:\n\n{}".format(output)
-            )
+            raise ValueError(f"Commit failed with the following errors:\n\n{output}")
 
         return output
 
@@ -177,7 +170,7 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
         if match:
             return match.group(1)
         else:
-            raise ValueError("Invalid output from MD5 command: {}".format(md5_output))
+            raise ValueError(f"Invalid output from MD5 command: {md5_output}")
 
     def remote_md5(self, base_cmd="show md5 file", remote_file=None):
         """
@@ -191,7 +184,7 @@ class CiscoXrFileTransfer(CiscoFileTransfer):
             elif self.direction == "get":
                 remote_file = self.source_file
         # IOS-XR requires both the leading slash and the slash between file-system and file here
-        remote_md5_cmd = "{} /{}/{}".format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f"{base_cmd} /{self.file_system}/{remote_file}"
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5
diff --git a/netmiko/cisco_base_connection.py b/netmiko/cisco_base_connection.py
index ed6e6ab7afc50f9a7788f711c395b3d9501fa49c..2ea7d86d39c40352871fa9b60e6af61dfc15950a 100644
--- a/netmiko/cisco_base_connection.py
+++ b/netmiko/cisco_base_connection.py
@@ -1,8 +1,7 @@
 """CiscoBaseConnection is netmiko SSH class for Cisco and Cisco-like platforms."""
-from __future__ import unicode_literals
 from netmiko.base_connection import BaseConnection
 from netmiko.scp_handler import BaseFileTransfer
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 import re
 import time
 
@@ -12,21 +11,15 @@ class CiscoBaseConnection(BaseConnection):
 
     def check_enable_mode(self, check_string="#"):
         """Check if in enable mode. Return boolean."""
-        return super(CiscoBaseConnection, self).check_enable_mode(
-            check_string=check_string
-        )
+        return super().check_enable_mode(check_string=check_string)
 
     def enable(self, cmd="enable", pattern="ssword", re_flags=re.IGNORECASE):
         """Enter enable mode."""
-        return super(CiscoBaseConnection, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def exit_enable_mode(self, exit_command="disable"):
         """Exits enable (privileged exec) mode."""
-        return super(CiscoBaseConnection, self).exit_enable_mode(
-            exit_command=exit_command
-        )
+        return super().exit_enable_mode(exit_command=exit_command)
 
     def check_config_mode(self, check_string=")#", pattern=""):
         """
@@ -34,9 +27,7 @@ class CiscoBaseConnection(BaseConnection):
 
         Cisco IOS devices abbreviate the prompt at 20 chars in config mode
         """
-        return super(CiscoBaseConnection, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def config_mode(self, config_command="config term", pattern=""):
         """
@@ -46,15 +37,11 @@ class CiscoBaseConnection(BaseConnection):
         """
         if not pattern:
             pattern = re.escape(self.base_prompt[:16])
-        return super(CiscoBaseConnection, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def exit_config_mode(self, exit_config="end", pattern="#"):
         """Exit from configuration mode."""
-        return super(CiscoBaseConnection, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def serial_login(
         self,
@@ -140,7 +127,7 @@ class CiscoBaseConnection(BaseConnection):
                     msg = "Login failed - Password required, but none set: {}".format(
                         self.host
                     )
-                    raise NetMikoAuthenticationException(msg)
+                    raise NetmikoAuthenticationException(msg)
 
                 # Check if proper data received
                 if re.search(pri_prompt_terminator, output, flags=re.M) or re.search(
@@ -153,8 +140,8 @@ class CiscoBaseConnection(BaseConnection):
                 i += 1
             except EOFError:
                 self.remote_conn.close()
-                msg = "Login failed: {}".format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f"Login failed: {self.host}"
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -167,8 +154,8 @@ class CiscoBaseConnection(BaseConnection):
             return return_msg
 
         self.remote_conn.close()
-        msg = "Login failed: {}".format(self.host)
-        raise NetMikoAuthenticationException(msg)
+        msg = f"Login failed: {self.host}"
+        raise NetmikoAuthenticationException(msg)
 
     def cleanup(self):
         """Gracefully exit the SSH session."""
@@ -189,7 +176,7 @@ class CiscoBaseConnection(BaseConnection):
         if match:
             file_system = match.group(1)
             # Test file_system
-            cmd = "dir {}".format(file_system)
+            cmd = f"dir {file_system}"
             output = self.send_command_expect(cmd)
             if "% Invalid" in output or "%Error:" in output:
                 raise ValueError(
@@ -213,15 +200,23 @@ class CiscoBaseConnection(BaseConnection):
         """Saves Config."""
         self.enable()
         if confirm:
-            output = self.send_command_timing(command_string=cmd)
+            output = self.send_command_timing(
+                command_string=cmd, strip_prompt=False, strip_command=False
+            )
             if confirm_response:
-                output += self.send_command_timing(confirm_response)
+                output += self.send_command_timing(
+                    confirm_response, strip_prompt=False, strip_command=False
+                )
             else:
                 # Send enter by default
-                output += self.send_command_timing(self.RETURN)
+                output += self.send_command_timing(
+                    self.RETURN, strip_prompt=False, strip_command=False
+                )
         else:
             # Some devices are slow so match on trailing-prompt if you can
-            output = self.send_command(command_string=cmd)
+            output = self.send_command(
+                command_string=cmd, strip_prompt=False, strip_command=False
+            )
         return output
 
 
diff --git a/netmiko/citrix/__init__.py b/netmiko/citrix/__init__.py
index 53226e8d8429478618283f5e9ca226acffd50f06..a9aa9a20376230dd858b1bc8572bdb579d53f823 100644
--- a/netmiko/citrix/__init__.py
+++ b/netmiko/citrix/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.citrix.netscaler_ssh import NetscalerSSH
 
 __all__ = ["NetscalerSSH"]
diff --git a/netmiko/citrix/netscaler_ssh.py b/netmiko/citrix/netscaler_ssh.py
index 985e24f084149684fa2a06971f177a242f955b4d..1f16d5c64cbbe49b63dfef1f75342b0292cba1e2 100644
--- a/netmiko/citrix/netscaler_ssh.py
+++ b/netmiko/citrix/netscaler_ssh.py
@@ -12,7 +12,7 @@ class NetscalerSSH(BaseConnection):
         delay_factor = self.select_delay_factor(delay_factor=0)
         self._test_channel_read()
         self.set_base_prompt()
-        cmd = "{}set cli mode -page OFF{}".format(self.RETURN, self.RETURN)
+        cmd = f"{self.RETURN}set cli mode -page OFF{self.RETURN}"
         self.disable_paging(command=cmd)
         time.sleep(1 * delay_factor)
         self.set_base_prompt()
@@ -28,7 +28,7 @@ class NetscalerSSH(BaseConnection):
         """
         prompt = self.find_prompt(delay_factor=delay_factor)
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError("Router prompt not found: {}".format(repr(prompt)))
+            raise ValueError(f"Router prompt not found: {repr(prompt)}")
 
         prompt = prompt.strip()
         if len(prompt) == 1:
@@ -52,7 +52,7 @@ class NetscalerSSH(BaseConnection):
 
     def strip_prompt(self, a_string):
         """ Strip 'Done' from command output """
-        output = super(NetscalerSSH, self).strip_prompt(a_string)
+        output = super().strip_prompt(a_string)
         lines = output.split(self.RESPONSE_RETURN)
         if "Done" in lines[-1]:
             return self.RESPONSE_RETURN.join(lines[:-1])
diff --git a/netmiko/cloudgenix/cloudgenix_ion.py b/netmiko/cloudgenix/cloudgenix_ion.py
index c9a02306effdab6e24ea9eb1659c6f43e66de5c2..db0f7482b5cfa8cefa90f1b120abd2ae5f0a279f 100644
--- a/netmiko/cloudgenix/cloudgenix_ion.py
+++ b/netmiko/cloudgenix/cloudgenix_ion.py
@@ -1,13 +1,9 @@
-import time
-
-from netmiko import log
 from netmiko.cisco_base_connection import CiscoSSHConnection
-from netmiko.py23_compat import string_types
 
 
 class CloudGenixIonSSH(CiscoSSHConnection):
     def establish_connection(self):
-        super(CloudGenixIonSSH, self).establish_connection(width=100, height=1000)
+        super().establish_connection(width=100, height=1000)
 
     def session_preparation(self, *args, **kwargs):
         """Prepare the session after the connection has been established."""
@@ -21,12 +17,12 @@ class CloudGenixIonSSH(CiscoSSHConnection):
         return ""
 
     def find_prompt(self, delay_factor=1):
-        prompt = super(CloudGenixIonSSH, self).find_prompt()
+        prompt = super().find_prompt(delay_factor=delay_factor)
         prompt = self.strip_backspaces(prompt).strip()
         return prompt
 
     def strip_command(self, command_string, output):
-        output = super(CloudGenixIonSSH, self).strip_command(command_string, output)
+        output = super().strip_command(command_string, output)
         # command_string gets repainted potentially multiple times (grab everything after last one)
         output = output.split(command_string)[-1]
         return output
@@ -47,34 +43,7 @@ class CloudGenixIonSSH(CiscoSSHConnection):
         """No save method on ION SSH"""
         pass
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
-        delay_factor = self.select_delay_factor(delay_factor)
-        if config_commands is None:
-            return ""
-        elif isinstance(config_commands, string_types):
-            config_commands = (config_commands,)
-
-        if not hasattr(config_commands, "__iter__"):
-            raise ValueError("Invalid argument passed into send_config_set")
-
-        # Send config commands
-        output = ""
-        for cmd in config_commands:
-            output += self.send_command(cmd)
-            if self.fast_cli:
-                pass
-            else:
-                time.sleep(delay_factor * 0.05)
-
-        output = self._sanitize_output(output)
-        log.debug("{}".format(output))
-        return output
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )
diff --git a/netmiko/coriant/coriant_ssh.py b/netmiko/coriant/coriant_ssh.py
index cae0011fd84691cc9be8e7dedd119dca6f2d5c53..7df3ebf066061992a05a77fa181c7ce8e962a5c2 100644
--- a/netmiko/coriant/coriant_ssh.py
+++ b/netmiko/coriant/coriant_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -32,7 +31,7 @@ class CoriantSSH(CiscoSSHConnection):
         self, pri_prompt_terminator=":", alt_prompt_terminator=">", delay_factor=2
     ):
         """Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output."""
-        super(CoriantSSH, self).set_base_prompt(
+        super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
diff --git a/netmiko/dell/__init__.py b/netmiko/dell/__init__.py
index f0f42e0d052e4013352332ecc70bdb456cd25466..238063516e015b1551f6169792c1f40301b40eae 100644
--- a/netmiko/dell/__init__.py
+++ b/netmiko/dell/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.dell.dell_dnos6 import DellDNOS6SSH
 from netmiko.dell.dell_dnos6 import DellDNOS6Telnet
 from netmiko.dell.dell_force10_ssh import DellForce10SSH
diff --git a/netmiko/dell/dell_dnos6.py b/netmiko/dell/dell_dnos6.py
index 4f591e64bf920894ce1a7b7d0a32941a3ff91e65..ff341e2d19bb5df4e0c2ea1ceae5cd9fc303a631 100644
--- a/netmiko/dell/dell_dnos6.py
+++ b/netmiko/dell/dell_dnos6.py
@@ -1,5 +1,4 @@
 """Dell N2/3/4000 base driver- supports DNOS6."""
-from __future__ import unicode_literals
 from netmiko.dell.dell_powerconnect import DellPowerConnectBase
 import time
 
@@ -24,7 +23,7 @@ class DellDNOS6Base(DellPowerConnectBase):
         confirm_response="",
     ):
         """Saves Config"""
-        return super(DellDNOS6Base, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
diff --git a/netmiko/dell/dell_force10_ssh.py b/netmiko/dell/dell_force10_ssh.py
index 52b5ad22e0579e3b28f11f9874a22bb6608a5dfe..0ab2f58d90fb842cd9fee06bd1fe6400cb2fb387 100644
--- a/netmiko/dell/dell_force10_ssh.py
+++ b/netmiko/dell/dell_force10_ssh.py
@@ -1,5 +1,4 @@
 """Dell Force10 Driver - supports DNOS9."""
-from __future__ import unicode_literals
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
@@ -13,6 +12,6 @@ class DellForce10SSH(CiscoSSHConnection):
         confirm_response="",
     ):
         """Saves Config"""
-        return super(DellForce10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/dell/dell_isilon_ssh.py b/netmiko/dell/dell_isilon_ssh.py
index 3a047ca65aa5b52d2eab4cd454d6707156c66daf..860b82b8f10fd548053cc0008d330e7071dbefff 100644
--- a/netmiko/dell/dell_isilon_ssh.py
+++ b/netmiko/dell/dell_isilon_ssh.py
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-
 import time
 import re
 
@@ -11,7 +9,7 @@ class DellIsilonSSH(BaseConnection):
         self, pri_prompt_terminator="$", alt_prompt_terminator="#", delay_factor=1
     ):
         """Determine base prompt."""
-        return super(DellIsilonSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -20,7 +18,7 @@ class DellIsilonSSH(BaseConnection):
     def strip_ansi_escape_codes(self, string_buffer):
         """Remove Null code"""
         output = re.sub(r"\x00", "", string_buffer)
-        return super(DellIsilonSSH, self).strip_ansi_escape_codes(output)
+        return super().strip_ansi_escape_codes(output)
 
     def session_preparation(self):
         """Prepare the session after the connection has been established."""
@@ -43,7 +41,7 @@ class DellIsilonSSH(BaseConnection):
         self.clear_buffer()
 
     def set_prompt(self, prompt_terminator="$"):
-        prompt = "PROMPT='%m{}'".format(prompt_terminator)
+        prompt = f"PROMPT='%m{prompt_terminator}'"
         command = self.RETURN + prompt + self.RETURN
         self.write_channel(command)
 
@@ -64,7 +62,7 @@ class DellIsilonSSH(BaseConnection):
         pass
 
     def check_config_mode(self, check_string="#"):
-        return super(DellIsilonSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="sudo su"):
         """Attempt to become root."""
@@ -85,4 +83,4 @@ class DellIsilonSSH(BaseConnection):
 
     def exit_config_mode(self, exit_config="exit"):
         """Exit enable mode."""
-        return super(DellIsilonSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
diff --git a/netmiko/dell/dell_os10_ssh.py b/netmiko/dell/dell_os10_ssh.py
index ba34434c3145093099da5161ae65a6b4049a6678..a9a5581b9b69fa98c094e89c0a55a5ca1637c194 100644
--- a/netmiko/dell/dell_os10_ssh.py
+++ b/netmiko/dell/dell_os10_ssh.py
@@ -16,7 +16,7 @@ class DellOS10SSH(CiscoSSHConnection):
         confirm_response="",
     ):
         """Saves Config"""
-        return super(DellOS10SSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -25,16 +25,21 @@ class DellOS10FileTransfer(BaseFileTransfer):
     """Dell EMC Networking OS10 SCP File Transfer driver."""
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=None, direction="put"
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system="/home/admin",
+        direction="put",
+        **kwargs,
     ):
-        if file_system is None:
-            file_system = "/home/admin"
-        super(DellOS10FileTransfer, self).__init__(
+        super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
         self.folder_name = "/config"
 
@@ -45,7 +50,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == "get":
                 remote_file = self.source_file
-        remote_cmd = 'system "ls -l {}/{}"'.format(self.file_system, remote_file)
+        remote_cmd = f'system "ls -l {self.file_system}/{remote_file}"'
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         for line in remote_out.splitlines():
             if remote_file in line:
@@ -58,7 +63,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
 
     def remote_space_available(self, search_pattern=r"(\d+) bytes free"):
         """Return space available on remote device."""
-        remote_cmd = 'system "df {}"'.format(self.folder_name)
+        remote_cmd = f'system "df {self.folder_name}"'
         remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         for line in remote_output.splitlines():
             if self.folder_name in line:
@@ -79,7 +84,7 @@ class DellOS10FileTransfer(BaseFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == "get":
                 remote_file = self.source_file
-        remote_md5_cmd = 'system "md5sum {}/{}"'.format(self.file_system, remote_file)
+        remote_md5_cmd = f'system "md5sum {self.file_system}/{remote_file}"'
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5.strip()
@@ -95,13 +100,13 @@ class DellOS10FileTransfer(BaseFileTransfer):
 
     def put_file(self):
         """SCP copy the file from the local system to the remote device."""
-        destination = "{}".format(self.dest_file)
+        destination = f"{self.dest_file}"
         self.scp_conn.scp_transfer_file(self.source_file, destination)
         # Must close the SCP connection to get the file written (flush)
         self.scp_conn.close()
 
     def get_file(self):
         """SCP copy the file from the remote device to local system."""
-        source_file = "{}".format(self.source_file)
+        source_file = f"{self.source_file}"
         self.scp_conn.scp_get_file(source_file, self.dest_file)
         self.scp_conn.close()
diff --git a/netmiko/dell/dell_powerconnect.py b/netmiko/dell/dell_powerconnect.py
index b38695f6fb172c25f414eb8fe3390a264e18a183..4063495e8243dfde0eff4e12eb6ec6d5a2148632 100644
--- a/netmiko/dell/dell_powerconnect.py
+++ b/netmiko/dell/dell_powerconnect.py
@@ -1,5 +1,4 @@
 """Dell PowerConnect Driver."""
-from __future__ import unicode_literals
 from paramiko import SSHClient
 import time
 from os import path
@@ -30,7 +29,7 @@ class DellPowerConnectBase(CiscoBaseConnection):
         self, pri_prompt_terminator=">", alt_prompt_terminator="#", delay_factor=1
     ):
         """Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output."""
-        prompt = super(DellPowerConnectBase, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -41,15 +40,11 @@ class DellPowerConnectBase(CiscoBaseConnection):
 
     def check_config_mode(self, check_string="(config)#"):
         """Checks if the device is in configuration mode"""
-        return super(DellPowerConnectBase, self).check_config_mode(
-            check_string=check_string
-        )
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="config"):
         """Enter configuration mode."""
-        return super(DellPowerConnectBase, self).config_mode(
-            config_command=config_command
-        )
+        return super().config_mode(config_command=config_command)
 
 
 class DellPowerConnectSSH(DellPowerConnectBase):
diff --git a/netmiko/eltex/__init__.py b/netmiko/eltex/__init__.py
index 6360b7f7875bca4125345039110509013a5d1607..2e1fdedb32cefea1cb89bcf57ef1bac4debea759 100644
--- a/netmiko/eltex/__init__.py
+++ b/netmiko/eltex/__init__.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
 from netmiko.eltex.eltex_ssh import EltexSSH
+from netmiko.eltex.eltex_esr_ssh import EltexEsrSSH
 
-__all__ = ["EltexSSH"]
+__all__ = ["EltexSSH", "EltexEsrSSH"]
diff --git a/netmiko/eltex/eltex_esr_ssh.py b/netmiko/eltex/eltex_esr_ssh.py
new file mode 100644
index 0000000000000000000000000000000000000000..f3b4f4d2cf1f14b68b56e15d5de35e609e84c2b4
--- /dev/null
+++ b/netmiko/eltex/eltex_esr_ssh.py
@@ -0,0 +1,103 @@
+import time
+from netmiko.cisco_base_connection import CiscoSSHConnection
+
+
+class EltexEsrSSH(CiscoSSHConnection):
+    """Netmiko support for routers Eltex ESR."""
+
+    def session_preparation(self):
+        """Prepare the session after the connection has been established."""
+        self.ansi_escape_codes = True
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command="terminal datadump")
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def config_mode(self, config_command="configure", pattern=r")#"):
+        """Enter configuration mode."""
+        return super().config_mode(config_command=config_command, pattern=pattern)
+
+    def check_config_mode(self, check_string="(config", pattern=""):
+        """Checks whether in configuration mode. Returns a boolean."""
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        """Not Implemented (use commit() method)"""
+        raise NotImplementedError
+
+    def commit(self, delay_factor=1):
+        """
+        Commit the candidate configuration.
+        Commit the entered configuration.
+        Raise an error and return the failure
+        if the commit fails.
+        default:
+           command_string = commit
+        """
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = "Can't commit configuration"
+        command_string = "commit"
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                "Commit failed with following errors:\n\n{}".format(output)
+            )
+        return output
+
+    def _confirm(self, delay_factor=1):
+        """
+        Confirm the candidate configuration.
+        Raise an error and return the failure if the confirm fails.
+        """
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = "Nothing to confirm in configuration"
+        command_string = "confirm"
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                "Confirm failed with following errors:\n\n{}".format(output)
+            )
+        return output
+
+    def _restore(self, delay_factor=1):
+        """
+        Restore the candidate configuration.
+
+        Raise an error and return the failure if the restore fails.
+        """
+
+        delay_factor = self.select_delay_factor(delay_factor)
+        error_marker = "Can't find backup of previous configuration!"
+        command_string = "restore"
+
+        if self.check_config_mode():
+            self.exit_config_mode()
+
+        output = self.send_command(
+            command_string=command_string, delay_factor=delay_factor
+        )
+
+        if error_marker in output:
+            raise ValueError(
+                "Restore failed with following errors:\n\n{}".format(output)
+            )
+        return output
diff --git a/netmiko/eltex/eltex_ssh.py b/netmiko/eltex/eltex_ssh.py
index 6c316ff2773e37972b20b8a149ff1befa76b1651..4a62e5111b557d1cebe66e4e9ef9dc58b4e9a2c6 100644
--- a/netmiko/eltex/eltex_ssh.py
+++ b/netmiko/eltex/eltex_ssh.py
@@ -1,5 +1,3 @@
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
diff --git a/netmiko/endace/__init__.py b/netmiko/endace/__init__.py
index 1f36a09a2db5f24312fec91237742f4c14def254..355e456af2673c4e49060a15dd87be944c102236 100644
--- a/netmiko/endace/__init__.py
+++ b/netmiko/endace/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.endace.endace_ssh import EndaceSSH
 
 __all__ = ["EndaceSSH"]
diff --git a/netmiko/endace/endace_ssh.py b/netmiko/endace/endace_ssh.py
index a1686db1a3b1fb2ab8fd0625c18205547e4381f0..e7d5bde26c8fe08b6ec35a69caff1bd4dc17c6da 100644
--- a/netmiko/endace/endace_ssh.py
+++ b/netmiko/endace/endace_ssh.py
@@ -1,23 +1,16 @@
-from __future__ import unicode_literals
-
-
 from netmiko.cisco_base_connection import CiscoSSHConnection
 import re
 
 
 class EndaceSSH(CiscoSSHConnection):
     def disable_paging(self, command="no cli session paging enable", delay_factor=1):
-        return super(EndaceSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def enable(self, cmd="enable", pattern="", re_flags=re.IGNORECASE):
-        return super(EndaceSSH, self).enable(
-            cmd=cmd, pattern=pattern, re_flags=re_flags
-        )
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def check_config_mode(self, check_string="(config) #"):
-        return super(EndaceSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="conf t", pattern=""):
         output = ""
@@ -34,15 +27,13 @@ class EndaceSSH(CiscoSSHConnection):
         return output
 
     def exit_config_mode(self, exit_config="exit", pattern="#"):
-        return super(EndaceSSH, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def save_config(
         self, cmd="configuration write", confirm=False, confirm_response=""
     ):
         self.enable()
         self.config_mode()
-        return super(EndaceSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/enterasys/__init__.py b/netmiko/enterasys/__init__.py
index 98d96007ff6f94f7099f2da2fe364505dc22d007..94f7e275dc5cb0e802b4f4a6adef5d5444ad59f5 100644
--- a/netmiko/enterasys/__init__.py
+++ b/netmiko/enterasys/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.enterasys.enterasys_ssh import EnterasysSSH
 
 __all__ = ["EnterasysSSH"]
diff --git a/netmiko/enterasys/enterasys_ssh.py b/netmiko/enterasys/enterasys_ssh.py
index c1c701615f92593189188759b69f244b0f73c9c4..277bfd6d724281bdbc432232e36497a855832017 100644
--- a/netmiko/enterasys/enterasys_ssh.py
+++ b/netmiko/enterasys/enterasys_ssh.py
@@ -1,5 +1,4 @@
 """Enterasys support."""
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
diff --git a/netmiko/extreme/__init__.py b/netmiko/extreme/__init__.py
index 8ce2b174080cee11ca4a1421f9ab211d81b8b4ec..ea335856c52dcf1ae453516fb03885298edc0b50 100644
--- a/netmiko/extreme/__init__.py
+++ b/netmiko/extreme/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.extreme.extreme_ers_ssh import ExtremeErsSSH
 from netmiko.extreme.extreme_exos import ExtremeExosSSH
 from netmiko.extreme.extreme_exos import ExtremeExosTelnet
diff --git a/netmiko/extreme/extreme_ers_ssh.py b/netmiko/extreme/extreme_ers_ssh.py
index c0619af189a2486993333ca467877ed826e1672f..9356c97c23c2aec663cb9b282ddd56c7efba582b 100644
--- a/netmiko/extreme/extreme_ers_ssh.py
+++ b/netmiko/extreme/extreme_ers_ssh.py
@@ -1,6 +1,4 @@
 """Netmiko support for Extreme Ethernet Routing Switch."""
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -40,6 +38,6 @@ class ExtremeErsSSH(CiscoSSHConnection):
 
     def save_config(self, cmd="save config", confirm=False, confirm_response=""):
         """Save Config"""
-        return super(ExtremeErsSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/extreme/extreme_exos.py b/netmiko/extreme/extreme_exos.py
index 20ad9e9c97dbad922376f27e2b24c582ae91ffd0..e50fb51f53ed5394346308bd4428b6fefc51c737 100644
--- a/netmiko/extreme/extreme_exos.py
+++ b/netmiko/extreme/extreme_exos.py
@@ -1,5 +1,4 @@
 """Extreme support."""
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
@@ -35,7 +34,7 @@ class ExtremeExosBase(CiscoSSHConnection):
             * testhost.4 #
             * testhost.5 #
         """
-        cur_base_prompt = super(ExtremeExosBase, self).set_base_prompt(*args, **kwargs)
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
         # Strip off any leading * or whitespace chars; strip off trailing period and digits
         match = re.search(r"[\*\s]*(.*)\.\d+", cur_base_prompt)
         if match:
@@ -52,7 +51,7 @@ class ExtremeExosBase(CiscoSSHConnection):
 
         # refresh self.base_prompt
         self.set_base_prompt()
-        return super(ExtremeExosBase, self).send_command(*args, **kwargs)
+        return super().send_command(*args, **kwargs)
 
     def config_mode(self, config_command=""):
         """No configuration mode on Extreme Exos."""
@@ -60,7 +59,7 @@ class ExtremeExosBase(CiscoSSHConnection):
 
     def check_config_mode(self, check_string="#"):
         """Checks whether in configuration mode. Returns a boolean."""
-        return super(ExtremeExosBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def exit_config_mode(self, exit_config=""):
         """No configuration mode on Extreme Exos."""
@@ -70,7 +69,7 @@ class ExtremeExosBase(CiscoSSHConnection):
         self, cmd="save configuration primary", confirm=False, confirm_response=""
     ):
         """Saves configuration."""
-        return super(ExtremeExosBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -83,4 +82,4 @@ class ExtremeExosTelnet(ExtremeExosBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(ExtremeExosTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
diff --git a/netmiko/extreme/extreme_netiron.py b/netmiko/extreme/extreme_netiron.py
index caff4b61026de76a76e42864248a32de3127371f..b12a5ac9b08e8bb0f415158414ebecfb8ca126ad 100644
--- a/netmiko/extreme/extreme_netiron.py
+++ b/netmiko/extreme/extreme_netiron.py
@@ -1,11 +1,10 @@
-from __future__ import unicode_literals
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
 class ExtremeNetironBase(CiscoSSHConnection):
     def save_config(self, cmd="write memory", confirm=False, confirm_response=""):
         """Save Config"""
-        return super(ExtremeNetironBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -18,4 +17,4 @@ class ExtremeNetironTelnet(ExtremeNetironBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(ExtremeNetironTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
diff --git a/netmiko/extreme/extreme_nos_ssh.py b/netmiko/extreme/extreme_nos_ssh.py
index 04e9425abf0da79794eb78d9b46d302d1d2f377c..08bdb802e2000aa6cdd556be271e89876c92ae84 100644
--- a/netmiko/extreme/extreme_nos_ssh.py
+++ b/netmiko/extreme/extreme_nos_ssh.py
@@ -1,5 +1,4 @@
 """Support for Extreme NOS/VDX."""
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -28,6 +27,6 @@ class ExtremeNosSSH(CiscoSSHConnection):
         confirm_response="y",
     ):
         """Save Config for Extreme VDX."""
-        return super(ExtremeNosSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/extreme/extreme_slx_ssh.py b/netmiko/extreme/extreme_slx_ssh.py
index 368ca50b68eacbe9804335af6eb3ff2793148bfc..e0e008c2ed941679b4af487f3a4ccf0985ee33c1 100644
--- a/netmiko/extreme/extreme_slx_ssh.py
+++ b/netmiko/extreme/extreme_slx_ssh.py
@@ -1,5 +1,4 @@
 """Support for Extreme SLX."""
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -28,6 +27,6 @@ class ExtremeSlxSSH(CiscoSSHConnection):
         confirm_response="y",
     ):
         """Save Config for Extreme SLX."""
-        return super(ExtremeSlxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/extreme/extreme_vsp_ssh.py b/netmiko/extreme/extreme_vsp_ssh.py
index 05f5f356f307b6b7d4083c40b4dde38029940269..77bf447b2a7db841636398b4410862bb5e6896c1 100644
--- a/netmiko/extreme/extreme_vsp_ssh.py
+++ b/netmiko/extreme/extreme_vsp_ssh.py
@@ -1,6 +1,4 @@
 """Extreme Virtual Services Platform Support."""
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -19,6 +17,6 @@ class ExtremeVspSSH(CiscoSSHConnection):
 
     def save_config(self, cmd="save config", confirm=False, confirm_response=""):
         """Save Config"""
-        return super(ExtremeVspSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/extreme/extreme_wing_ssh.py b/netmiko/extreme/extreme_wing_ssh.py
index 7d737390c4a2d4bf194f9638eebd99a317d2c66a..e1c5b64a2e69d1c450fa94ab66c4b634de10bb63 100644
--- a/netmiko/extreme/extreme_wing_ssh.py
+++ b/netmiko/extreme/extreme_wing_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
diff --git a/netmiko/f5/__init__.py b/netmiko/f5/__init__.py
index 79a0c9d176a535b005deb5af1547e17c1e815245..93891c9e61f43a20fe6f4db0ba6583f346d87271 100644
--- a/netmiko/f5/__init__.py
+++ b/netmiko/f5/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.f5.f5_tmsh_ssh import F5TmshSSH
 from netmiko.f5.f5_linux_ssh import F5LinuxSSH
 
diff --git a/netmiko/f5/f5_linux_ssh.py b/netmiko/f5/f5_linux_ssh.py
index 3f31c38a5d7ebab922d996f93d09282ba7c93f34..341b3fc565f1c0e84086f2e07d9590ae34a73d20 100644
--- a/netmiko/f5/f5_linux_ssh.py
+++ b/netmiko/f5/f5_linux_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.linux.linux_ssh import LinuxSSH
 
 
diff --git a/netmiko/f5/f5_tmsh_ssh.py b/netmiko/f5/f5_tmsh_ssh.py
index a66d00aa80160f632b3a7966f5fe99f09af8cc86..819bea891926649c38612d38c88f749261980a3e 100644
--- a/netmiko/f5/f5_tmsh_ssh.py
+++ b/netmiko/f5/f5_tmsh_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.base_connection import BaseConnection
 
@@ -21,7 +20,7 @@ class F5TmshSSH(BaseConnection):
         """tmsh command is equivalent to config command on F5."""
         delay_factor = self.select_delay_factor(delay_factor)
         self.clear_buffer()
-        command = "{}tmsh{}".format(self.RETURN, self.RETURN)
+        command = f"{self.RETURN}tmsh{self.RETURN}"
         self.write_channel(command)
         time.sleep(1 * delay_factor)
         self.clear_buffer()
diff --git a/netmiko/flexvnf/__init__.py b/netmiko/flexvnf/__init__.py
index 427b8351b329e195d67b107a892f7d3634d4fd04..77d0bc6d6fd588219519b99d85e6ae9efea84214 100644
--- a/netmiko/flexvnf/__init__.py
+++ b/netmiko/flexvnf/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.flexvnf.flexvnf_ssh import FlexvnfSSH
 
 __all__ = ["FlexvnfSSH"]
diff --git a/netmiko/flexvnf/flexvnf_ssh.py b/netmiko/flexvnf/flexvnf_ssh.py
index 2933d86d012bdf405c9061fa0ebed33c41ea23c9..a70e4ad7feadfc088e2d01952cf75d4fda2281ab 100644
--- a/netmiko/flexvnf/flexvnf_ssh.py
+++ b/netmiko/flexvnf/flexvnf_ssh.py
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-
 import re
 import time
 
@@ -57,11 +55,11 @@ class FlexvnfSSH(BaseConnection):
 
     def check_config_mode(self, check_string="]"):
         """Checks if the device is in configuration mode or not."""
-        return super(FlexvnfSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="configure"):
         """Enter configuration mode."""
-        return super(FlexvnfSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config="exit configuration-mode"):
         """Exit configuration mode."""
@@ -137,7 +135,7 @@ class FlexvnfSSH(BaseConnection):
         if comment:
             if '"' in comment:
                 raise ValueError("Invalid comment contains double quote")
-            comment = '"{0}"'.format(comment)
+            comment = f'"{comment}"'
             command_string += " comment " + comment
 
         if and_quit:
@@ -164,15 +162,13 @@ class FlexvnfSSH(BaseConnection):
             )
 
         if commit_marker not in output:
-            raise ValueError(
-                "Commit failed with the following errors:\n\n{0}".format(output)
-            )
+            raise ValueError(f"Commit failed with the following errors:\n\n{output}")
 
         return output
 
     def strip_prompt(self, *args, **kwargs):
         """Strip the trailing router prompt from the output."""
-        a_string = super(FlexvnfSSH, self).strip_prompt(*args, **kwargs)
+        a_string = super().strip_prompt(*args, **kwargs)
         return self.strip_context_items(a_string)
 
     def strip_context_items(self, a_string):
diff --git a/netmiko/fortinet/__init__.py b/netmiko/fortinet/__init__.py
index 9dab0592a5c1edfe96e656809105fa35945b2884..35d7be570dc32206e04640788e2c64a2395bee66 100644
--- a/netmiko/fortinet/__init__.py
+++ b/netmiko/fortinet/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.fortinet.fortinet_ssh import FortinetSSH
 
 __all__ = ["FortinetSSH"]
diff --git a/netmiko/fortinet/fortinet_ssh.py b/netmiko/fortinet/fortinet_ssh.py
index 79fc8274ee314852a2a08b7988734aa8f1b102d3..e617546e6c667184b78289f90c053db9f0f93d40 100644
--- a/netmiko/fortinet/fortinet_ssh.py
+++ b/netmiko/fortinet/fortinet_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import paramiko
 import time
 import re
@@ -17,6 +16,21 @@ class FortinetSSH(CiscoSSHConnection):
 
     def session_preparation(self):
         """Prepare the session after the connection has been established."""
+        delay_factor = self.select_delay_factor(delay_factor=0)
+        output = ""
+
+        # If "set post-login-banner enable" is set it will require you to press 'a'
+        # to accept the banner before you login. This will accept if it occurs
+        count = 1
+        while count <= 30:
+            output += self.read_channel()
+            if "to accept" in output:
+                self.write_channel("a\r")
+                break
+            else:
+                time.sleep(0.33 * delay_factor)
+            count += 1
+
         self._test_channel_read()
         self.set_base_prompt(alt_prompt_terminator="$")
         self.disable_paging()
@@ -75,7 +89,7 @@ class FortinetSSH(CiscoSSHConnection):
         """Re-enable paging globally."""
         if self.allow_disable_global:
             # Return paging state
-            output_mode_cmd = "set output {}".format(self._output_mode)
+            output_mode_cmd = f"set output {self._output_mode}"
             enable_paging_commands = ["config system console", output_mode_cmd, "end"]
             if self.vdoms:
                 enable_paging_commands.insert(0, "config global")
diff --git a/netmiko/hp/__init__.py b/netmiko/hp/__init__.py
index 5fb748db9a7be76eea6aace84ec83dfc93a3b6d3..097cb7217f750d99cffb64d1c309b53d46f60c89 100644
--- a/netmiko/hp/__init__.py
+++ b/netmiko/hp/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.hp.hp_procurve import HPProcurveSSH, HPProcurveTelnet
 from netmiko.hp.hp_comware import HPComwareSSH, HPComwareTelnet
 
diff --git a/netmiko/hp/hp_comware.py b/netmiko/hp/hp_comware.py
index 247783f37508fa9521f44b69c5661f83d845b613..6e3524762c1c6b8363df748d07d44bc46c71f2db 100644
--- a/netmiko/hp/hp_comware.py
+++ b/netmiko/hp/hp_comware.py
@@ -1,5 +1,3 @@
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -31,17 +29,15 @@ class HPComwareBase(CiscoSSHConnection):
 
     def config_mode(self, config_command="system-view"):
         """Enter configuration mode."""
-        return super(HPComwareBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config="return", pattern=r">"):
         """Exit config mode."""
-        return super(HPComwareBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def check_config_mode(self, check_string="]"):
         """Check whether device is in configuration mode. Return a boolean."""
-        return super(HPComwareBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def set_base_prompt(
         self, pri_prompt_terminator=">", alt_prompt_terminator="]", delay_factor=1
@@ -56,7 +52,7 @@ class HPComwareBase(CiscoSSHConnection):
 
         This will be set on logging in, but not when entering system-view
         """
-        prompt = super(HPComwareBase, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -82,7 +78,7 @@ class HPComwareBase(CiscoSSHConnection):
 
     def save_config(self, cmd="save force", confirm=False, confirm_response=""):
         """Save Config."""
-        return super(HPComwareBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -95,4 +91,4 @@ class HPComwareTelnet(HPComwareBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(HPComwareTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
diff --git a/netmiko/hp/hp_procurve.py b/netmiko/hp/hp_procurve.py
index e09e9f91ca5bf529a09c7a462bf9707683ab9a98..745efb5140e4c0620bbd156fd869077f85d3cea1 100644
--- a/netmiko/hp/hp_procurve.py
+++ b/netmiko/hp/hp_procurve.py
@@ -1,5 +1,3 @@
-from __future__ import print_function
-from __future__ import unicode_literals
 import re
 import time
 import socket
@@ -42,19 +40,39 @@ class HPProcurveBase(CiscoSSHConnection):
         default_username="manager",
     ):
         """Enter enable mode"""
+        delay_factor = self.select_delay_factor(delay_factor=0)
         if self.check_enable_mode():
             return ""
-        output = self.send_command_timing(cmd)
-        if (
-            "username" in output.lower()
-            or "login name" in output.lower()
-            or "user name" in output.lower()
-        ):
-            output += self.send_command_timing(default_username)
-        if "password" in output.lower():
-            output += self.send_command_timing(self.secret)
-        log.debug("{}".format(output))
+
+        output = ""
+        i = 1
+        max_attempts = 5
+        while i <= max_attempts:
+            self.write_channel(cmd + self.RETURN)
+            time.sleep(0.3 * delay_factor)
+            new_output = self.read_channel()
+            username_pattern = r"(username|login|user name)"
+            if re.search(username_pattern, new_output, flags=re_flags):
+                output += new_output
+                new_output = self.send_command_timing(default_username)
+            if re.search(pattern, new_output, flags=re_flags):
+                output += new_output
+                self.write_channel(self.normalize_cmd(self.secret))
+                new_output = self._read_channel_timing()
+                if self.check_enable_mode():
+                    output += new_output
+                    return output
+            output += new_output
+            i += 1
+
+        log.debug(f"{output}")
         self.clear_buffer()
+        msg = (
+            "Failed to enter enable mode. Please ensure you pass "
+            "the 'secret' argument to ConnectHandler."
+        )
+        if not self.check_enable_mode():
+            raise ValueError(msg)
         return output
 
     def cleanup(self):
@@ -81,7 +99,7 @@ class HPProcurveBase(CiscoSSHConnection):
 
     def save_config(self, cmd="write memory", confirm=False, confirm_response=""):
         """Save Config."""
-        return super(HPProcurveBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -107,7 +125,7 @@ class HPProcurveSSH(HPProcurveBase):
         # Try one last time to past "Press any key to continue
         self.write_channel(self.RETURN)
 
-        super(HPProcurveSSH, self).session_preparation()
+        super().session_preparation()
 
     def _build_ssh_client(self):
         """Allow passwordless authentication for HP devices being provisioned."""
@@ -140,7 +158,7 @@ class HPProcurveTelnet(HPProcurveBase):
         max_loops=60,
     ):
         """Telnet login: can be username/password or just password."""
-        super(HPProcurveTelnet, self).telnet_login(
+        super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
diff --git a/netmiko/huawei/__init__.py b/netmiko/huawei/__init__.py
index 3e7a956f131d2efeefcd221b2fa733c9a120cfcc..6b7d814d1874f4c7588efd54816839b956029eed 100644
--- a/netmiko/huawei/__init__.py
+++ b/netmiko/huawei/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.huawei.huawei import HuaweiSSH, HuaweiVrpv8SSH
 from netmiko.huawei.huawei import HuaweiTelnet
 
diff --git a/netmiko/huawei/huawei.py b/netmiko/huawei/huawei.py
index de05886cfaa88f0a6b3a0ecb78b4e5cf9e626ad9..1d758b3c374d3141be7e978d82ef0836a9777a8d 100644
--- a/netmiko/huawei/huawei.py
+++ b/netmiko/huawei/huawei.py
@@ -1,9 +1,7 @@
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.cisco_base_connection import CiscoBaseConnection
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 from netmiko import log
 
 
@@ -19,17 +17,15 @@ class HuaweiBase(CiscoBaseConnection):
 
     def config_mode(self, config_command="system-view"):
         """Enter configuration mode."""
-        return super(HuaweiBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config="return", pattern=r">"):
         """Exit configuration mode."""
-        return super(HuaweiBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def check_config_mode(self, check_string="]"):
         """Checks whether in configuration mode. Returns a boolean."""
-        return super(HuaweiBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def check_enable_mode(self, *args, **kwargs):
         """Huawei has no enable mode."""
@@ -71,7 +67,7 @@ class HuaweiBase(CiscoBaseConnection):
 
         # Check that ends with a valid terminator character
         if not prompt[-1] in (pri_prompt_terminator, alt_prompt_terminator):
-            raise ValueError("Router prompt not found: {0}".format(prompt))
+            raise ValueError(f"Router prompt not found: {prompt}")
 
         # Strip off any leading HRP_. characters for USGv5 HA
         prompt = re.sub(r"^HRP_.", "", prompt, flags=re.M)
@@ -80,13 +76,13 @@ class HuaweiBase(CiscoBaseConnection):
         prompt = prompt[1:-1]
         prompt = prompt.strip()
         self.base_prompt = prompt
-        log.debug("prompt: {0}".format(self.base_prompt))
+        log.debug(f"prompt: {self.base_prompt}")
 
         return self.base_prompt
 
-    def save_config(self, cmd="save", confirm=False, confirm_response=""):
+    def save_config(self, cmd="save", confirm=True, confirm_response="y"):
         """ Save Config for HuaweiSSH"""
-        return super(HuaweiBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -94,7 +90,15 @@ class HuaweiBase(CiscoBaseConnection):
 class HuaweiSSH(HuaweiBase):
     """Huawei SSH driver."""
 
-    pass
+    def special_login_handler(self):
+        """Handle password change request by ignoring it"""
+
+        password_change_prompt = r"(Change now|Please choose 'YES' or 'NO').+"
+        output = self.read_until_prompt_or_pattern(password_change_prompt)
+        if re.search(password_change_prompt, output):
+            self.write_channel("N\n")
+            self.clear_buffer()
+        return output
 
 
 class HuaweiTelnet(HuaweiBase):
@@ -112,7 +116,7 @@ class HuaweiTelnet(HuaweiBase):
         """Telnet login for Huawei Devices"""
 
         delay_factor = self.select_delay_factor(delay_factor)
-        password_change_prompt = re.escape("Change now? [Y/N]")
+        password_change_prompt = r"(Change now|Please choose 'YES' or 'NO').+"
         combined_pattern = r"({}|{}|{})".format(
             pri_prompt_terminator, alt_prompt_terminator, password_change_prompt
         )
@@ -161,8 +165,8 @@ class HuaweiTelnet(HuaweiBase):
 
             except EOFError:
                 self.remote_conn.close()
-                msg = "Login failed: {}".format(self.host)
-                raise NetMikoAuthenticationException(msg)
+                msg = f"Login failed: {self.host}"
+                raise NetmikoAuthenticationException(msg)
 
         # Last try to see if we already logged in
         self.write_channel(self.TELNET_RETURN)
@@ -175,8 +179,8 @@ class HuaweiTelnet(HuaweiBase):
             return return_msg
 
         self.remote_conn.close()
-        msg = "Login failed: {}".format(self.host)
-        raise NetMikoAuthenticationException(msg)
+        msg = f"Login failed: {self.host}"
+        raise NetmikoAuthenticationException(msg)
 
 
 class HuaweiVrpv8SSH(HuaweiSSH):
@@ -198,7 +202,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
         command_string = "commit"
 
         if comment:
-            command_string += ' comment "{}"'.format(comment)
+            command_string += f' comment "{comment}"'
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -211,9 +215,7 @@ class HuaweiVrpv8SSH(HuaweiSSH):
         output += self.exit_config_mode()
 
         if error_marker in output:
-            raise ValueError(
-                "Commit failed with following errors:\n\n{}".format(output)
-            )
+            raise ValueError(f"Commit failed with following errors:\n\n{output}")
         return output
 
     def save_config(self, *args, **kwargs):
diff --git a/netmiko/ipinfusion/__init__.py b/netmiko/ipinfusion/__init__.py
index 974022d6da0a74a25cf0258615465d8432199801..a6781fe642f31fb1dde7ce9bb0e24f00badec849 100644
--- a/netmiko/ipinfusion/__init__.py
+++ b/netmiko/ipinfusion/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.ipinfusion.ipinfusion_ocnos import (
     IpInfusionOcNOSSSH,
     IpInfusionOcNOSTelnet,
diff --git a/netmiko/ipinfusion/ipinfusion_ocnos.py b/netmiko/ipinfusion/ipinfusion_ocnos.py
index 2e634c482415aeafe9d3b25968e3ec54183db989..ff71ee717d5d39528aa6793433b592d146f8968b 100644
--- a/netmiko/ipinfusion/ipinfusion_ocnos.py
+++ b/netmiko/ipinfusion/ipinfusion_ocnos.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from telnetlib import IAC, DO, DONT, WILL, WONT, SB, SE, TTYPE
 from netmiko.cisco_base_connection import CiscoBaseConnection
@@ -10,7 +9,7 @@ class IpInfusionOcNOSBase(CiscoBaseConnection):
     def __init__(self, *args, **kwargs):
         if kwargs.get("default_enter") is None:
             kwargs["default_enter"] = "\r"
-        return super(IpInfusionOcNOSBase, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         self._test_channel_read()
@@ -23,7 +22,7 @@ class IpInfusionOcNOSBase(CiscoBaseConnection):
 
     def save_config(self, cmd="write", confirm=False, confirm_response=""):
         """Saves Config Using write command"""
-        return super(IpInfusionOcNOSBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -62,7 +61,7 @@ class IpInfusionOcNOSTelnet(IpInfusionOcNOSBase):
     ):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(IpInfusionOcNOSTelnet, self).telnet_login(
+        return super().telnet_login(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             username_pattern=username_pattern,
diff --git a/netmiko/juniper/__init__.py b/netmiko/juniper/__init__.py
index a57d37af6457855a267f7701ffe60f8a4163e30a..fab726fe782c06adb304280db2dfbbfe453b7c61 100644
--- a/netmiko/juniper/__init__.py
+++ b/netmiko/juniper/__init__.py
@@ -1,4 +1,4 @@
-from __future__ import unicode_literals
 from netmiko.juniper.juniper import JuniperSSH, JuniperTelnet, JuniperFileTransfer
+from netmiko.juniper.juniper_screenos import JuniperScreenOsSSH
 
-__all__ = ["JuniperSSH", "JuniperTelnet", "JuniperFileTransfer"]
+__all__ = ["JuniperSSH", "JuniperTelnet", "JuniperFileTransfer", "JuniperScreenOsSSH"]
diff --git a/netmiko/juniper/juniper.py b/netmiko/juniper/juniper.py
index 962a5f33b9ae5ebf1f95006b85fb756182c87bbc..b7fa4a0c383bb142a8d53066e4aba229f62b9967 100644
--- a/netmiko/juniper/juniper.py
+++ b/netmiko/juniper/juniper.py
@@ -1,11 +1,8 @@
-from __future__ import unicode_literals
-
 import re
 import time
 
 from netmiko.base_connection import BaseConnection
 from netmiko.scp_handler import BaseFileTransfer
-from netmiko.py23_compat import text_type
 
 
 class JuniperBase(BaseConnection):
@@ -26,6 +23,7 @@ class JuniperBase(BaseConnection):
         self._test_channel_read()
         self.enter_cli_mode()
         self.set_base_prompt()
+        self._disable_complete_on_space()
         self.disable_paging(command="set cli screen-length 0")
         self.set_terminal_width(command="set cli screen-width 511")
         # Clear the read buffer
@@ -40,6 +38,21 @@ class JuniperBase(BaseConnection):
         """Return to the Juniper CLI."""
         return self.send_command("exit", expect_string=r"[#>]")
 
+    def _disable_complete_on_space(self):
+        """
+        Juniper tries to auto complete commands when you type a "space" character.
+
+        This is a bad idea for automation as what your program is sending no longer matches
+        the command echo from the device. So we disable this behavior.
+        """
+        delay_factor = self.select_delay_factor(delay_factor=0)
+        time.sleep(delay_factor * 0.1)
+        command = "set cli complete-on-space off"
+        self.write_channel(self.normalize_cmd(command))
+        time.sleep(delay_factor * 0.1)
+        output = self.read_channel()
+        return output
+
     def enter_cli_mode(self):
         """Check if at shell prompt root@ and go into CLI."""
         delay_factor = self.select_delay_factor(delay_factor=0)
@@ -72,11 +85,11 @@ class JuniperBase(BaseConnection):
 
     def check_config_mode(self, check_string="]"):
         """Checks if the device is in configuration mode or not."""
-        return super(JuniperBase, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="configure"):
         """Enter configuration mode."""
-        return super(JuniperBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config="exit configuration-mode"):
         """Exit configuration mode."""
@@ -142,7 +155,7 @@ class JuniperBase(BaseConnection):
             commit_marker = "configuration check succeeds"
         elif confirm:
             if confirm_delay:
-                command_string = "commit confirmed " + text_type(confirm_delay)
+                command_string = "commit confirmed " + str(confirm_delay)
             else:
                 command_string = "commit confirmed"
             commit_marker = "commit confirmed will be automatically rolled back in"
@@ -151,7 +164,7 @@ class JuniperBase(BaseConnection):
         if comment:
             if '"' in comment:
                 raise ValueError("Invalid comment contains double quote")
-            comment = '"{0}"'.format(comment)
+            comment = f'"{comment}"'
             command_string += " comment " + comment
 
         if and_quit:
@@ -178,15 +191,13 @@ class JuniperBase(BaseConnection):
             )
 
         if commit_marker not in output:
-            raise ValueError(
-                "Commit failed with the following errors:\n\n{0}".format(output)
-            )
+            raise ValueError(f"Commit failed with the following errors:\n\n{output}")
 
         return output
 
     def strip_prompt(self, *args, **kwargs):
         """Strip the trailing router prompt from the output."""
-        a_string = super(JuniperBase, self).strip_prompt(*args, **kwargs)
+        a_string = super().strip_prompt(*args, **kwargs)
         return self.strip_context_items(a_string)
 
     def strip_context_items(self, a_string):
@@ -226,21 +237,28 @@ class JuniperTelnet(JuniperBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(JuniperTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
 
 class JuniperFileTransfer(BaseFileTransfer):
     """Juniper SCP File Transfer driver."""
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system="/var/tmp", direction="put"
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system="/var/tmp",
+        direction="put",
+        **kwargs,
     ):
-        return super(JuniperFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=""):
@@ -258,9 +276,7 @@ class JuniperFileTransfer(BaseFileTransfer):
         )
 
     def remote_md5(self, base_cmd="file checksum md5", remote_file=None):
-        return super(JuniperFileTransfer, self).remote_md5(
-            base_cmd=base_cmd, remote_file=remote_file
-        )
+        return super().remote_md5(base_cmd=base_cmd, remote_file=remote_file)
 
     def enable_scp(self, cmd=None):
         raise NotImplementedError
diff --git a/netmiko/juniper/juniper_screenos.py b/netmiko/juniper/juniper_screenos.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d826c8a2c93a84faf4309af49040fe36224ed0e
--- /dev/null
+++ b/netmiko/juniper/juniper_screenos.py
@@ -0,0 +1,50 @@
+import time
+from netmiko.base_connection import BaseConnection
+
+
+class JuniperScreenOsSSH(BaseConnection):
+    """
+    Implement methods for interacting with Juniper ScreenOS devices.
+    """
+
+    def session_preparation(self):
+        """
+        Prepare the session after the connection has been established.
+
+        Disable paging (the '--more--' prompts).
+        Set the base prompt for interaction ('>').
+        """
+        self._test_channel_read()
+        self.set_base_prompt()
+        self.disable_paging(command="set console page 0")
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def check_enable_mode(self, *args, **kwargs):
+        """No enable mode on Juniper ScreenOS."""
+        return True
+
+    def enable(self, *args, **kwargs):
+        """No enable mode on Juniper ScreenOS."""
+        return ""
+
+    def exit_enable_mode(self, *args, **kwargs):
+        """No enable mode on Juniper ScreenOS."""
+        return ""
+
+    def check_config_mode(self, *args, **kwargs):
+        """No configuration mode on Juniper ScreenOS."""
+        return False
+
+    def config_mode(self, *args, **kwargs):
+        """No configuration mode on Juniper ScreenOS."""
+        return ""
+
+    def exit_config_mode(self, *args, **kwargs):
+        """No configuration mode on Juniper ScreenOS."""
+        return ""
+
+    def save_config(self, cmd="save config", confirm=False, confirm_response=""):
+        """Save Config."""
+        return self.send_command(command_string=cmd)
diff --git a/netmiko/keymile/__init__.py b/netmiko/keymile/__init__.py
index af56119122eb1d0edf4e66480845a79d67e8ada7..d96095cfb6bde906def8dc842252efd88827a5be 100644
--- a/netmiko/keymile/__init__.py
+++ b/netmiko/keymile/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.keymile.keymile_ssh import KeymileSSH
 from netmiko.keymile.keymile_nos_ssh import KeymileNOSSSH
 
diff --git a/netmiko/keymile/keymile_nos_ssh.py b/netmiko/keymile/keymile_nos_ssh.py
index 397bc710e0447cbe3c88f69d3f6b4d998d63dad7..f9bb57d202769434f582d90913d82b9a35ba222c 100644
--- a/netmiko/keymile/keymile_nos_ssh.py
+++ b/netmiko/keymile/keymile_nos_ssh.py
@@ -3,7 +3,7 @@ import re
 
 
 from netmiko.cisco.cisco_ios import CiscoIosBase
-from netmiko.ssh_exception import NetMikoAuthenticationException
+from netmiko.ssh_exception import NetmikoAuthenticationException
 
 
 class KeymileNOSSSH(CiscoIosBase):
@@ -17,18 +17,14 @@ class KeymileNOSSSH(CiscoIosBase):
     def _test_channel_read(self, count=40, pattern=""):
         """Since Keymile NOS always returns True on paramiko.connect() we
         check the output for substring Login incorrect after connecting."""
-        output = super(KeymileNOSSSH, self)._test_channel_read(
-            count=count, pattern=pattern
-        )
+        output = super()._test_channel_read(count=count, pattern=pattern)
         pattern = r"Login incorrect"
         if re.search(pattern, output):
             self.paramiko_cleanup()
             msg = "Authentication failure: unable to connect"
-            msg += "{device_type} {host}:{port}".format(
-                device_type=self.device_type, host=self.host, port=self.port
-            )
+            msg += f"{self.device_type} {self.host}:{self.port}"
             msg += self.RESPONSE_RETURN + "Login incorrect"
-            raise NetMikoAuthenticationException(msg)
+            raise NetmikoAuthenticationException(msg)
         else:
             return output
 
diff --git a/netmiko/keymile/keymile_ssh.py b/netmiko/keymile/keymile_ssh.py
index 89cf190150cda1121dd4999b43ce6646c2cf15d2..c338b76864b77997ee31f64b5a9d345981631c56 100644
--- a/netmiko/keymile/keymile_ssh.py
+++ b/netmiko/keymile/keymile_ssh.py
@@ -6,7 +6,7 @@ from netmiko.cisco.cisco_ios import CiscoIosBase
 class KeymileSSH(CiscoIosBase):
     def __init__(self, **kwargs):
         kwargs.setdefault("default_enter", "\r\n")
-        return super(KeymileSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self):
         """Prepare the session after the connection has been established."""
@@ -47,10 +47,8 @@ class KeymileSSH(CiscoIosBase):
         """Remove appending empty line and prompt from output"""
         self._write_session_log(a_string)
         a_string = a_string[:-1]
-        return super(KeymileSSH, self).strip_prompt(a_string=a_string)
+        return super().strip_prompt(a_string=a_string)
 
     def set_base_prompt(self, pri_prompt_terminator=">", **kwargs):
         """ set prompt termination  to >"""
-        return super(KeymileSSH, self).set_base_prompt(
-            pri_prompt_terminator=pri_prompt_terminator
-        )
+        return super().set_base_prompt(pri_prompt_terminator=pri_prompt_terminator)
diff --git a/netmiko/linux/__init__.py b/netmiko/linux/__init__.py
index 0aa030d149385d0b7728bb2ad8d9e8725c7925df..ccb938cf776de2c183dffc8148ba7cb99c2c66e4 100644
--- a/netmiko/linux/__init__.py
+++ b/netmiko/linux/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.linux.linux_ssh import LinuxSSH, LinuxFileTransfer
 
 __all__ = ["LinuxSSH", "LinuxFileTransfer"]
diff --git a/netmiko/linux/linux_ssh.py b/netmiko/linux/linux_ssh.py
index 41d30499e6d730ada87d7cb7e9e6d6985c1fc7de..441173feb32a677dd0f66cb087ec6f8e6afc7483 100644
--- a/netmiko/linux/linux_ssh.py
+++ b/netmiko/linux/linux_ssh.py
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-
 import os
 import re
 import socket
@@ -7,7 +5,7 @@ import time
 
 from netmiko.cisco_base_connection import CiscoSSHConnection
 from netmiko.cisco_base_connection import CiscoFileTransfer
-from netmiko.ssh_exception import NetMikoTimeoutException
+from netmiko.ssh_exception import NetmikoTimeoutException
 
 LINUX_PROMPT_PRI = os.getenv("NETMIKO_LINUX_PROMPT_PRI", "$")
 LINUX_PROMPT_ALT = os.getenv("NETMIKO_LINUX_PROMPT_ALT", "#")
@@ -18,7 +16,7 @@ class LinuxSSH(CiscoSSHConnection):
     def session_preparation(self):
         """Prepare the session after the connection has been established."""
         self.ansi_escape_codes = True
-        return super(LinuxSSH, self).session_preparation()
+        return super().session_preparation()
 
     def _enter_shell(self):
         """Already in shell."""
@@ -39,7 +37,7 @@ class LinuxSSH(CiscoSSHConnection):
         delay_factor=1,
     ):
         """Determine base prompt."""
-        return super(LinuxSSH, self).set_base_prompt(
+        return super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -49,7 +47,7 @@ class LinuxSSH(CiscoSSHConnection):
         """Can't exit from root (if root)"""
         if self.username == "root":
             exit_config_mode = False
-        return super(LinuxSSH, self).send_config_set(
+        return super().send_config_set(
             config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
@@ -57,7 +55,7 @@ class LinuxSSH(CiscoSSHConnection):
         """Verify root"""
         return self.check_enable_mode(check_string=check_string)
 
-    def config_mode(self, config_command="sudo su"):
+    def config_mode(self, config_command="sudo -s"):
         """Attempt to become root."""
         return self.enable(cmd=config_command)
 
@@ -66,7 +64,7 @@ class LinuxSSH(CiscoSSHConnection):
 
     def check_enable_mode(self, check_string=LINUX_PROMPT_ROOT):
         """Verify root"""
-        return super(LinuxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def exit_enable_mode(self, exit_command="exit"):
         """Exit enable mode."""
@@ -80,7 +78,7 @@ class LinuxSSH(CiscoSSHConnection):
                 raise ValueError("Failed to exit enable mode.")
         return output
 
-    def enable(self, cmd="sudo su", pattern="ssword", re_flags=re.IGNORECASE):
+    def enable(self, cmd="sudo -s", pattern="ssword", re_flags=re.IGNORECASE):
         """Attempt to become root."""
         delay_factor = self.select_delay_factor(delay_factor=0)
         output = ""
@@ -93,7 +91,7 @@ class LinuxSSH(CiscoSSHConnection):
                     self.write_channel(self.normalize_cmd(self.secret))
                 self.set_base_prompt()
             except socket.timeout:
-                raise NetMikoTimeoutException(
+                raise NetmikoTimeoutException(
                     "Timed-out reading channel, data not available."
                 )
             if not self.check_enable_mode():
@@ -122,14 +120,21 @@ class LinuxFileTransfer(CiscoFileTransfer):
     """
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system="/var/tmp", direction="put"
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system="/var/tmp",
+        direction="put",
+        **kwargs,
     ):
-        return super(LinuxFileTransfer, self).__init__(
+        return super().__init__(
             ssh_conn=ssh_conn,
             source_file=source_file,
             dest_file=dest_file,
             file_system=file_system,
             direction=direction,
+            **kwargs,
         )
 
     def remote_space_available(self, search_pattern=""):
@@ -152,7 +157,7 @@ class LinuxFileTransfer(CiscoFileTransfer):
                 remote_file = self.dest_file
             elif self.direction == "get":
                 remote_file = self.source_file
-        remote_md5_cmd = "{} {}/{}".format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f"{base_cmd} {self.file_system}/{remote_file}"
         dest_md5 = self.ssh_ctl_chan.send_command(
             remote_md5_cmd, max_loops=750, delay_factor=2
         )
diff --git a/netmiko/mellanox/__init__.py b/netmiko/mellanox/__init__.py
index 1061750b6b061396196916ffc2d3e9fb1e9f986d..33c695273e81392c7e5283f124866f5d0bccbc5d 100644
--- a/netmiko/mellanox/__init__.py
+++ b/netmiko/mellanox/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.mellanox.mellanox_mlnxos_ssh import MellanoxMlnxosSSH
 
 __all__ = ["MellanoxMlnxosSSH"]
diff --git a/netmiko/mellanox/mellanox_mlnxos_ssh.py b/netmiko/mellanox/mellanox_mlnxos_ssh.py
index 2b7e9d918dc35c83a935baf65c5182cfeff81526..bc0638f5cd5399dfc6934c57219627fff6cad68f 100644
--- a/netmiko/mellanox/mellanox_mlnxos_ssh.py
+++ b/netmiko/mellanox/mellanox_mlnxos_ssh.py
@@ -1,5 +1,4 @@
 """Mellanox MLNX-OS Switch support."""
-from __future__ import unicode_literals
 import re
 from netmiko.cisco_base_connection import CiscoSSHConnection
 from netmiko import log
@@ -21,19 +20,13 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
         return output
 
     def config_mode(self, config_command="config term", pattern="#"):
-        return super(MellanoxMlnxosSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def check_config_mode(self, check_string="(config", pattern=r"#"):
-        return super(MellanoxMlnxosSSH, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def disable_paging(self, command="no cli session paging enable", delay_factor=1):
-        return super(MellanoxMlnxosSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def exit_config_mode(self, exit_config="exit", pattern="#"):
         """Mellanox does not support a single command to completely exit configuration mode.
@@ -54,7 +47,7 @@ class MellanoxMlnxosSSH(CiscoSSHConnection):
         if self.check_config_mode():
             raise ValueError("Failed to exit configuration mode")
 
-        log.debug("exit_config_mode: {}".format(output))
+        log.debug(f"exit_config_mode: {output}")
         return output
 
     def save_config(
diff --git a/netmiko/mikrotik/mikrotik_ssh.py b/netmiko/mikrotik/mikrotik_ssh.py
index fd0987a78176010dc148a6f7ecef98bbc0125e69..68280517bfd7d63b3d3f308738eca8e4f2bfb557 100644
--- a/netmiko/mikrotik/mikrotik_ssh.py
+++ b/netmiko/mikrotik/mikrotik_ssh.py
@@ -10,7 +10,7 @@ class MikrotikBase(CiscoSSHConnection):
 
         self._in_config_mode = False
 
-        return super(MikrotikBase, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
     def session_preparation(self, *args, **kwargs):
         """Prepare the session after the connection has been established."""
@@ -30,7 +30,7 @@ class MikrotikBase(CiscoSSHConnection):
         """
         self.username += "+cetw511h4098"
 
-    def disable_paging(self):
+    def disable_paging(self, *args, **kwargs):
         """Microtik does not have paging by default."""
         return ""
 
diff --git a/netmiko/mrv/__init__.py b/netmiko/mrv/__init__.py
index 19fdd9073e8ee8ccd6d96ba0822a1c6551281a6b..8bd3f2901a0863420dbb0c06402c357a1e2829f9 100644
--- a/netmiko/mrv/__init__.py
+++ b/netmiko/mrv/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.mrv.mrv_lx import MrvLxSSH
 from netmiko.mrv.mrv_ssh import MrvOptiswitchSSH
 
diff --git a/netmiko/mrv/mrv_lx.py b/netmiko/mrv/mrv_lx.py
index ed660b3e0577b81d15a6f83bfe306686ba3e566c..6f3605dc0c5a46dabbf521f5f72e89a78d3f4849 100644
--- a/netmiko/mrv/mrv_lx.py
+++ b/netmiko/mrv/mrv_lx.py
@@ -1,5 +1,4 @@
 """MRV Communications Driver (LX)."""
-from __future__ import unicode_literals
 import time
 import re
 
@@ -21,14 +20,14 @@ class MrvLxSSH(CiscoSSHConnection):
 
     def check_enable_mode(self, check_string=">>"):
         """MRV has a >> for enable mode instead of # like Cisco"""
-        return super(MrvLxSSH, self).check_enable_mode(check_string=check_string)
+        return super().check_enable_mode(check_string=check_string)
 
     def enable(self, cmd="enable", pattern="assword", re_flags=re.IGNORECASE):
         """Enter enable mode."""
-        return super(MrvLxSSH, self).enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
+        return super().enable(cmd=cmd, pattern=pattern, re_flags=re_flags)
 
     def save_config(self, cmd="save config flash", confirm=False, confirm_response=""):
         """Saves configuration."""
-        return super(MrvLxSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/mrv/mrv_ssh.py b/netmiko/mrv/mrv_ssh.py
index 04fba130d0646409c02669961771b04fa2bcd1a0..4529559cac870a11537076bb8545a18cd486d906 100644
--- a/netmiko/mrv/mrv_ssh.py
+++ b/netmiko/mrv/mrv_ssh.py
@@ -1,5 +1,4 @@
 """MRV Communications Driver (OptiSwitch)."""
-from __future__ import unicode_literals
 import time
 import re
 
@@ -38,6 +37,6 @@ class MrvOptiswitchSSH(CiscoSSHConnection):
 
     def save_config(self, cmd="save config flash", confirm=False, confirm_response=""):
         """Saves configuration."""
-        return super(MrvOptiswitchSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/netapp/__init__.py b/netmiko/netapp/__init__.py
index 050fb3ebf51a7291af6166ea347616b8ae64ee29..23d5259fdda50d435abdcdb3e44157d412541ab4 100644
--- a/netmiko/netapp/__init__.py
+++ b/netmiko/netapp/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.netapp.netapp_cdot_ssh import NetAppcDotSSH
 
 __all__ = ["NetAppcDotSSH"]
diff --git a/netmiko/netapp/netapp_cdot_ssh.py b/netmiko/netapp/netapp_cdot_ssh.py
index aceb20b020be22a2962ee0c24d740b78f575369b..46dd4129765e360743efe4de391aebc63af0602e 100644
--- a/netmiko/netapp/netapp_cdot_ssh.py
+++ b/netmiko/netapp/netapp_cdot_ssh.py
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-
 from netmiko.base_connection import BaseConnection
 
 
@@ -19,15 +17,15 @@ class NetAppcDotSSH(BaseConnection):
         return output
 
     def check_config_mode(self, check_string="*>"):
-        return super(NetAppcDotSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(
         self, config_command="set -privilege diagnostic -confirmations off"
     ):
-        return super(NetAppcDotSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config="set -privilege admin -confirmations off"):
-        return super(NetAppcDotSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def enable(self, *args, **kwargs):
         """No enable mode on NetApp."""
diff --git a/netmiko/netmiko_globals.py b/netmiko/netmiko_globals.py
index 801b03c8a58b6815f43e8f92de0eddae9a3496c6..bb021314fcfa3c0211783b47e6ac7ec9b84dc9f2 100644
--- a/netmiko/netmiko_globals.py
+++ b/netmiko/netmiko_globals.py
@@ -1,4 +1,2 @@
-from __future__ import unicode_literals
-
 MAX_BUFFER = 65535
 BACKSPACE_CHAR = "\x08"
diff --git a/netmiko/nokia/__init__.py b/netmiko/nokia/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..87cabb5a3b8d2d9f298e16dd1d3ddfdbe442e95f
--- /dev/null
+++ b/netmiko/nokia/__init__.py
@@ -0,0 +1,3 @@
+from netmiko.nokia.nokia_sros_ssh import NokiaSrosSSH
+
+__all__ = ["NokiaSrosSSH"]
diff --git a/netmiko/nokia/nokia_sros_ssh.py b/netmiko/nokia/nokia_sros_ssh.py
new file mode 100644
index 0000000000000000000000000000000000000000..c5cb38e10ca25463d9a584a4f083675fd64ef5d2
--- /dev/null
+++ b/netmiko/nokia/nokia_sros_ssh.py
@@ -0,0 +1,158 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright (c) 2014 - 2019 Kirk Byers
+# Copyright (c) 2014 - 2019 Twin Bridges Technology
+# Copyright (c) 2019 NOKIA Inc.
+# MIT License - See License file at:
+#   https://github.com/ktbyers/netmiko/blob/develop/LICENSE
+
+import re
+import time
+
+from netmiko import log
+from netmiko.base_connection import BaseConnection
+
+
+class NokiaSrosSSH(BaseConnection):
+    """
+    Implement methods for interacting with Nokia SR OS devices.
+
+    Not applicable in Nokia SR OS (disabled):
+        - enable()
+        - exit_enable_mode()
+        - check_enable_mode()
+
+    Overriden methods to adapt Nokia SR OS behavior (changed):
+        - session_preparation()
+        - set_base_prompt()
+        - config_mode()
+        - exit_config_mode()
+        - check_config_mode()
+        - save_config()
+        - commit()
+        - strip_prompt()
+    """
+
+    def session_preparation(self):
+        self._test_channel_read()
+        self.set_base_prompt()
+        # "@" indicates model-driven CLI (vs Classical CLI)
+        if "@" in self.base_prompt:
+            self.disable_paging(command="environment more false")
+            self.set_terminal_width(command="environment console width 512")
+        else:
+            self.disable_paging(command="environment no more")
+
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def set_base_prompt(self, *args, **kwargs):
+        """Remove the > when navigating into the different config level."""
+        cur_base_prompt = super().set_base_prompt(*args, **kwargs)
+        match = re.search(r"\*?(.*?)(>.*)*#", cur_base_prompt)
+        if match:
+            # strip off >... from base_prompt; strip off leading *
+            self.base_prompt = match.group(1)
+            return self.base_prompt
+
+    def enable(self, *args, **kwargs):
+        """Nokia SR OS does not support enable-mode"""
+        return ""
+
+    def check_enable_mode(self, *args, **kwargs):
+        """Nokia SR OS does not support enable-mode"""
+        return True
+
+    def exit_enable_mode(self, *args, **kwargs):
+        """Nokia SR OS does not support enable-mode"""
+        return ""
+
+    def config_mode(self, config_command="edit-config exclusive", pattern=r"\(ex\)\["):
+        """Enable config edit-mode for Nokia SR OS"""
+        output = ""
+        # Only model-driven CLI supports config-mode
+        if "@" in self.base_prompt:
+            output += super().config_mode(
+                config_command=config_command, pattern=pattern
+            )
+        return output
+
+    def exit_config_mode(self, *args, **kwargs):
+        """Disable config edit-mode for Nokia SR OS"""
+        output = self._exit_all()
+        # Model-driven CLI
+        if "@" in self.base_prompt and "(ex)[" in output:
+            # Asterisk indicates changes were made.
+            if "*(ex)[" in output:
+                log.warning("Uncommitted changes! Discarding changes!")
+                output += self._discard()
+            cmd = "quit-config"
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+        if self.check_config_mode():
+            raise ValueError("Failed to exit configuration mode")
+        return output
+
+    def check_config_mode(self, check_string=r"(ex)[", pattern=r"@"):
+        """Check config mode for Nokia SR OS"""
+        if "@" not in self.base_prompt:
+            # Classical CLI
+            return False
+        else:
+            # Model-driven CLI look for "exclusive"
+            return super().check_config_mode(check_string=check_string, pattern=pattern)
+
+    def save_config(self, *args, **kwargs):
+        """Persist configuration to cflash for Nokia SR OS"""
+        output = self.send_command(command_string="/admin save")
+        return output
+
+    def send_config_set(self, config_commands=None, exit_config_mode=None, **kwargs):
+        """Model driven CLI requires you not exit from configuration mode."""
+        if exit_config_mode is None:
+            # Set to False if model-driven CLI
+            exit_config_mode = False if "@" in self.base_prompt else True
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
+        )
+
+    def commit(self, *args, **kwargs):
+        """Activate changes from private candidate for Nokia SR OS"""
+        output = self._exit_all()
+        if "@" in self.base_prompt and "*(ex)[" in output:
+            log.info("Apply uncommitted changes!")
+            cmd = "commit"
+            self.write_channel(self.normalize_cmd(cmd))
+            output += self.read_until_pattern(pattern=re.escape(cmd))
+            output += self.read_until_pattern(r"@")
+        return output
+
+    def _exit_all(self):
+        """Return to the 'root' context."""
+        exit_cmd = "exit all"
+        self.write_channel(self.normalize_cmd(exit_cmd))
+        # Make sure you read until you detect the command echo (avoid getting out of sync)
+        return self.read_until_pattern(pattern=re.escape(exit_cmd))
+
+    def _discard(self):
+        """Discard changes from private candidate for Nokia SR OS"""
+        output = ""
+        if "@" in self.base_prompt:
+            cmd = "discard"
+            self.write_channel(self.normalize_cmd(cmd))
+            new_output = self.read_until_pattern(pattern=re.escape(cmd))
+            if "@" not in new_output:
+                new_output += self.read_until_prompt()
+            output += new_output
+        return output
+
+    def strip_prompt(self, *args, **kwargs):
+        """Strip prompt from the output."""
+        output = super().strip_prompt(*args, **kwargs)
+        if "@" in self.base_prompt:
+            # Remove context prompt too
+            strips = r"[\r\n]*\!?\*?(\((ex|gl|pr|ro)\))?\[\S*\][\r\n]*"
+            return re.sub(strips, "", output)
+        else:
+            return output
diff --git a/netmiko/oneaccess/__init__.py b/netmiko/oneaccess/__init__.py
index 7096c8e244816d5a334e46dae7c5f1ee6ed4633a..a3d597813cb65053a1b2c4ab1c7c12bdc6edae0a 100644
--- a/netmiko/oneaccess/__init__.py
+++ b/netmiko/oneaccess/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.oneaccess.oneaccess_oneos import OneaccessOneOSSSH, OneaccessOneOSTelnet
 
 __all__ = ["OneaccessOneOSSSH", "OneaccessOneOSTelnet"]
diff --git a/netmiko/oneaccess/oneaccess_oneos.py b/netmiko/oneaccess/oneaccess_oneos.py
index 192437b970a454eff5e4c59455c2e29e87ed2a82..bb3acb438dc217d712ebe217e6d8f696de9cb296 100644
--- a/netmiko/oneaccess/oneaccess_oneos.py
+++ b/netmiko/oneaccess/oneaccess_oneos.py
@@ -1,8 +1,4 @@
 """Netmiko driver for OneAccess ONEOS"""
-
-from __future__ import print_function
-from __future__ import unicode_literals
-
 from netmiko.cisco_base_connection import CiscoBaseConnection
 import time
 
@@ -12,7 +8,7 @@ class OneaccessOneOSBase(CiscoBaseConnection):
         """Init connection - similar as Cisco"""
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(OneaccessOneOSBase, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def session_preparation(self):
         """Prepare connection - disable paging"""
@@ -26,7 +22,7 @@ class OneaccessOneOSBase(CiscoBaseConnection):
 
     def save_config(self, cmd="write mem", confirm=False, confirm_response=""):
         """Save config: write mem"""
-        return super(OneaccessOneOSBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
diff --git a/netmiko/ovs/__init__.py b/netmiko/ovs/__init__.py
index 484cbf055ebb549706f74a6d88e50f0690c9058a..0177060af370c5288e4a3803ac67e68e8985571b 100644
--- a/netmiko/ovs/__init__.py
+++ b/netmiko/ovs/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.ovs.ovs_linux_ssh import OvsLinuxSSH
 
 __all__ = ["OvsLinuxSSH"]
diff --git a/netmiko/ovs/ovs_linux_ssh.py b/netmiko/ovs/ovs_linux_ssh.py
index efd76d20d6f45c0b02b7449b3dba738804914993..847f66ab972f57404a81fe1a5cc68d35854356b2 100644
--- a/netmiko/ovs/ovs_linux_ssh.py
+++ b/netmiko/ovs/ovs_linux_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.linux.linux_ssh import LinuxSSH
 
 
diff --git a/netmiko/paloalto/__init__.py b/netmiko/paloalto/__init__.py
index 1ec3f3299637421aa3348602d8a6d01ac108f814..50d005bf0a4680439ef0b4590031d3707625369c 100644
--- a/netmiko/paloalto/__init__.py
+++ b/netmiko/paloalto/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.paloalto.paloalto_panos import PaloAltoPanosSSH, PaloAltoPanosTelnet
 
 __all__ = ["PaloAltoPanosSSH", "PaloAltoPanosTelnet"]
diff --git a/netmiko/paloalto/paloalto_panos.py b/netmiko/paloalto/paloalto_panos.py
index 4a34aa0e9401bba65413a6912a1b7265430a8f79..ae3da0f7225b687ee14e125df835b377723bd631 100644
--- a/netmiko/paloalto/paloalto_panos.py
+++ b/netmiko/paloalto/paloalto_panos.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 import re
 from netmiko.base_connection import BaseConnection
@@ -40,19 +39,15 @@ class PaloAltoPanosBase(BaseConnection):
 
     def check_config_mode(self, check_string="]"):
         """Checks if the device is in configuration mode or not."""
-        return super(PaloAltoPanosBase, self).check_config_mode(
-            check_string=check_string
-        )
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="configure"):
         """Enter configuration mode."""
-        return super(PaloAltoPanosBase, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config="exit", pattern=r">"):
         """Exit configuration mode."""
-        return super(PaloAltoPanosBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
     def commit(
         self,
@@ -97,7 +92,7 @@ class PaloAltoPanosBase(BaseConnection):
         if partial:
             command_string += " partial"
             if vsys:
-                command_string += " {0}".format(vsys)
+                command_string += f" {vsys}"
             if device_and_network:
                 command_string += " device-and-network"
             if policy_and_objects:
@@ -117,9 +112,7 @@ class PaloAltoPanosBase(BaseConnection):
         )
 
         if commit_marker not in output.lower():
-            raise ValueError(
-                "Commit failed with the following errors:\n\n{0}".format(output)
-            )
+            raise ValueError(f"Commit failed with the following errors:\n\n{output}")
         return output
 
     def strip_command(self, command_string, output):
@@ -164,7 +157,7 @@ class PaloAltoPanosBase(BaseConnection):
     def send_command(self, *args, **kwargs):
         """Palo Alto requires an extra delay"""
         kwargs["delay_factor"] = kwargs.get("delay_factor", 2.5)
-        return super(PaloAltoPanosBase, self).send_command(*args, **kwargs)
+        return super().send_command(*args, **kwargs)
 
     def cleanup(self):
         """Gracefully exit the SSH session."""
diff --git a/netmiko/pluribus/pluribus_ssh.py b/netmiko/pluribus/pluribus_ssh.py
index 2f5bdb5ce2e8e77267f426c256f95e05d21e4e57..dacab475f3a1fa44d01d78f4cec445a8b7cb537c 100644
--- a/netmiko/pluribus/pluribus_ssh.py
+++ b/netmiko/pluribus/pluribus_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.base_connection import BaseConnection
 
@@ -7,14 +6,12 @@ class PluribusSSH(BaseConnection):
     """Common methods for Pluribus."""
 
     def __init__(self, *args, **kwargs):
-        super(PluribusSSH, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
         self._config_mode = False
 
     def disable_paging(self, command="pager off", delay_factor=1):
         """Make sure paging is disabled."""
-        return super(PluribusSSH, self).disable_paging(
-            command=command, delay_factor=delay_factor
-        )
+        return super().disable_paging(command=command, delay_factor=delay_factor)
 
     def session_preparation(self):
         """Prepare the netmiko session."""
diff --git a/netmiko/py23_compat.py b/netmiko/py23_compat.py
deleted file mode 100644
index b3bba6ba7a3c64a080cc19a34df65db375a3555f..0000000000000000000000000000000000000000
--- a/netmiko/py23_compat.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""Simplify Python3 compatibility. Modeled after six behavior for small set of things"""
-from __future__ import print_function
-from __future__ import unicode_literals
-
-import io
-import sys
-
-PY2 = sys.version_info.major == 2
-PY3 = sys.version_info.major == 3
-
-if PY3:
-    string_types = (str,)
-    text_type = str
-    bufferedio_types = io.BufferedIOBase
-else:
-    string_types = (basestring,)  # noqa
-    text_type = unicode  # noqa
-    bufferedio_types = (io.BufferedIOBase, file)  # noqa
diff --git a/netmiko/quanta/__init__.py b/netmiko/quanta/__init__.py
index fb8cf74c63d42f999d84f80c7440ccd774b44814..3e26d6f0bdfbb60d17d06590a110e34947ad4843 100644
--- a/netmiko/quanta/__init__.py
+++ b/netmiko/quanta/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.quanta.quanta_mesh_ssh import QuantaMeshSSH
 
 __all__ = ["QuantaMeshSSH"]
diff --git a/netmiko/quanta/quanta_mesh_ssh.py b/netmiko/quanta/quanta_mesh_ssh.py
index 0eb7242954e793433fb07429cf7bf6245c9b85c8..0f48860627a779be31d91fe7afa03129d99b9154 100644
--- a/netmiko/quanta/quanta_mesh_ssh.py
+++ b/netmiko/quanta/quanta_mesh_ssh.py
@@ -1,15 +1,14 @@
-from __future__ import unicode_literals
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
 
 class QuantaMeshSSH(CiscoSSHConnection):
     def disable_paging(self, command="no pager", delay_factor=1):
         """Disable paging"""
-        return super(QuantaMeshSSH, self).disable_paging(command=command)
+        return super().disable_paging(command=command)
 
     def config_mode(self, config_command="configure"):
         """Enter configuration mode."""
-        return super(QuantaMeshSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def save_config(
         self,
@@ -18,6 +17,6 @@ class QuantaMeshSSH(CiscoSSHConnection):
         confirm_response="",
     ):
         """Saves Config"""
-        return super(QuantaMeshSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/rad/__init__.py b/netmiko/rad/__init__.py
index 120dd8f8da88d6798d859f0aa42c8d911fef4eb8..f41afca6e1d849456922d9433d80441f49b9869d 100644
--- a/netmiko/rad/__init__.py
+++ b/netmiko/rad/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.rad.rad_etx import RadETXSSH
 from netmiko.rad.rad_etx import RadETXTelnet
 
diff --git a/netmiko/rad/rad_etx.py b/netmiko/rad/rad_etx.py
index 115982cac0ed3b425a0fa152397f393058edd5cf..16a523fbe8f04f0418722da39be35475ae2ea475 100644
--- a/netmiko/rad/rad_etx.py
+++ b/netmiko/rad/rad_etx.py
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-from __future__ import print_function
 import time
 from netmiko.base_connection import BaseConnection
 
@@ -43,9 +41,7 @@ class RadETXBase(BaseConnection):
 
     def config_mode(self, config_command="config", pattern=">config"):
         """Enter into configuration mode on remote device."""
-        return super(RadETXBase, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def check_config_mode(self, check_string=">config", pattern=""):
         """
@@ -53,15 +49,11 @@ class RadETXBase(BaseConnection):
 
         Rad config starts with baseprompt>config.
         """
-        return super(RadETXBase, self).check_config_mode(
-            check_string=check_string, pattern=pattern
-        )
+        return super().check_config_mode(check_string=check_string, pattern=pattern)
 
     def exit_config_mode(self, exit_config="exit all", pattern="#"):
         """Exit from configuration mode."""
-        return super(RadETXBase, self).exit_config_mode(
-            exit_config=exit_config, pattern=pattern
-        )
+        return super().exit_config_mode(exit_config=exit_config, pattern=pattern)
 
 
 class RadETXSSH(RadETXBase):
@@ -70,7 +62,7 @@ class RadETXSSH(RadETXBase):
     def __init__(self, **kwargs):
         # Found that a global_delay_factor of 2 is needed at minimum for SSH to the Rad ETX.
         kwargs.setdefault("global_delay_factor", 2)
-        return super(RadETXSSH, self).__init__(**kwargs)
+        return super().__init__(**kwargs)
 
 
 class RadETXTelnet(RadETXBase):
@@ -87,7 +79,7 @@ class RadETXTelnet(RadETXBase):
         password> ****
         """
         self.TELNET_RETURN = self.RETURN
-        return super(RadETXTelnet, self).telnet_login(
+        return super().telnet_login(
             username_pattern=username_pattern,
             alt_prompt_terminator=alt_prompt_term,
             **kwargs
diff --git a/netmiko/ruckus/__init__.py b/netmiko/ruckus/__init__.py
index bed3112cd80e794e16971f48ff5b8676361bb617..dfa47d854d1b9580553c24853a31bce7c1323151 100644
--- a/netmiko/ruckus/__init__.py
+++ b/netmiko/ruckus/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.ruckus.ruckus_fastiron import RuckusFastironSSH
 from netmiko.ruckus.ruckus_fastiron import RuckusFastironTelnet
 
diff --git a/netmiko/ruckus/ruckus_fastiron.py b/netmiko/ruckus/ruckus_fastiron.py
index 56d8a0c79ab9cdde002cd1854a1ffdc49fb8a5ed..d09ab57186235af13190a8c4e31e0b6f69448e6e 100644
--- a/netmiko/ruckus/ruckus_fastiron.py
+++ b/netmiko/ruckus/ruckus_fastiron.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import re
 import time
 from telnetlib import DO, DONT, ECHO, IAC, WILL, WONT
@@ -46,8 +45,13 @@ class RuckusFastironBase(CiscoSSHConnection):
                     output += new_data
                 if "ssword" in new_data:
                     self.write_channel(self.normalize_cmd(self.secret))
-                    output += self.read_until_prompt()
-                    return output
+                    new_data = self.read_until_prompt()
+                    output += new_data
+                    if not re.search(
+                        r"error.*incorrect.*password", new_data, flags=re.I
+                    ):
+                        return output
+
                 time.sleep(1)
                 i += 1
 
@@ -60,7 +64,7 @@ class RuckusFastironBase(CiscoSSHConnection):
 
     def save_config(self, cmd="write mem", confirm=False, confirm_response=""):
         """Saves configuration."""
-        return super(RuckusFastironBase, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
 
@@ -69,7 +73,7 @@ class RuckusFastironTelnet(RuckusFastironBase):
     def __init__(self, *args, **kwargs):
         default_enter = kwargs.get("default_enter")
         kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
-        super(RuckusFastironTelnet, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def _process_option(self, tsocket, command, option):
         """
@@ -87,7 +91,7 @@ class RuckusFastironTelnet(RuckusFastironBase):
     def telnet_login(self, *args, **kwargs):
         # set callback function to handle telnet options.
         self.remote_conn.set_option_negotiation_callback(self._process_option)
-        return super(RuckusFastironTelnet, self).telnet_login(*args, **kwargs)
+        return super().telnet_login(*args, **kwargs)
 
 
 class RuckusFastironSSH(RuckusFastironBase):
diff --git a/netmiko/ruijie/__init__.py b/netmiko/ruijie/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f82157ae7b7c0e0b32f0b7a5ff6d3003f87ff8de
--- /dev/null
+++ b/netmiko/ruijie/__init__.py
@@ -0,0 +1,3 @@
+from netmiko.ruijie.ruijie_os import RuijieOSSSH, RuijieOSTelnet
+
+__all__ = ["RuijieOSSSH", "RuijieOSTelnet"]
diff --git a/netmiko/ruijie/ruijie_os.py b/netmiko/ruijie/ruijie_os.py
new file mode 100644
index 0000000000000000000000000000000000000000..8d2b51ee00646d572fa5e17f56fd1adb64707f6d
--- /dev/null
+++ b/netmiko/ruijie/ruijie_os.py
@@ -0,0 +1,35 @@
+"""Ruijie RGOS Support"""
+from netmiko.cisco_base_connection import CiscoBaseConnection
+import time
+
+
+class RuijieOSBase(CiscoBaseConnection):
+    def session_preparation(self):
+        """Prepare the session after the connection has been established."""
+        self._test_channel_read(pattern=r"[>#]")
+        self.set_base_prompt()
+        """Ruijie OS requires enable mode to set terminal width"""
+        self.enable()
+        self.disable_paging(command="terminal length 0")
+        self.set_terminal_width(command="terminal width 256")
+        # Clear the read buffer
+        time.sleep(0.3 * self.global_delay_factor)
+        self.clear_buffer()
+
+    def save_config(self, cmd="write", confirm=False, confirm_response=""):
+        """Save config: write"""
+        return super().save_config(
+            cmd=cmd, confirm=confirm, confirm_response=confirm_response
+        )
+
+
+class RuijieOSSSH(RuijieOSBase):
+
+    pass
+
+
+class RuijieOSTelnet(RuijieOSBase):
+    def __init__(self, *args, **kwargs):
+        default_enter = kwargs.get("default_enter")
+        kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
+        super().__init__(*args, **kwargs)
diff --git a/netmiko/scp_functions.py b/netmiko/scp_functions.py
index 91d5c8bcaf4574e7c8786460b9749235ff869423..452fcd781b9077479cd61937bd347d44eff8073b 100644
--- a/netmiko/scp_functions.py
+++ b/netmiko/scp_functions.py
@@ -7,9 +7,6 @@ SCP requires a separate SSH connection for a control channel.
 
 Currently only supports Cisco IOS and Cisco ASA.
 """
-from __future__ import print_function
-from __future__ import unicode_literals
-
 from netmiko import FileTransfer, InLineTransfer
 
 
@@ -29,6 +26,7 @@ def file_transfer(
     disable_md5=False,
     inline_transfer=False,
     overwrite_file=False,
+    socket_timeout=10.0,
 ):
     """Use Secure Copy or Inline (IOS-only) to transfer files to/from network devices.
 
@@ -68,6 +66,7 @@ def file_transfer(
         "source_file": source_file,
         "dest_file": dest_file,
         "direction": direction,
+        "socket_timeout": socket_timeout,
     }
     if file_system is not None:
         scp_args["file_system"] = file_system
diff --git a/netmiko/scp_handler.py b/netmiko/scp_handler.py
index 452cd71d453919571e2b5db0c8fc5e81214312fa..d4cebcd359cf949884c081b5fb8f4a9e71fc4354 100644
--- a/netmiko/scp_handler.py
+++ b/netmiko/scp_handler.py
@@ -7,14 +7,12 @@ SCP requires a separate SSH connection for a control channel.
 
 Currently only supports Cisco IOS and Cisco ASA.
 """
-from __future__ import print_function
-from __future__ import unicode_literals
-
 import re
 import os
 import hashlib
 
 import scp
+import platform
 
 
 class SCPConn(object):
@@ -24,8 +22,9 @@ class SCPConn(object):
     Must close the SCP connection to get the file to write to the remote filesystem
     """
 
-    def __init__(self, ssh_conn):
+    def __init__(self, ssh_conn, socket_timeout=10.0):
         self.ssh_ctl_chan = ssh_conn
+        self.socket_timeout = socket_timeout
         self.establish_scp_conn()
 
     def establish_scp_conn(self):
@@ -33,7 +32,9 @@ class SCPConn(object):
         ssh_connect_params = self.ssh_ctl_chan._connect_params_dict()
         self.scp_conn = self.ssh_ctl_chan._build_ssh_client()
         self.scp_conn.connect(**ssh_connect_params)
-        self.scp_client = scp.SCPClient(self.scp_conn.get_transport())
+        self.scp_client = scp.SCPClient(
+            self.scp_conn.get_transport(), socket_timeout=self.socket_timeout
+        )
 
     def scp_transfer_file(self, source_file, dest_file):
         """Put file using SCP (for backwards compatibility)."""
@@ -56,12 +57,19 @@ class BaseFileTransfer(object):
     """Class to manage SCP file transfer and associated SSH control channel."""
 
     def __init__(
-        self, ssh_conn, source_file, dest_file, file_system=None, direction="put"
+        self,
+        ssh_conn,
+        source_file,
+        dest_file,
+        file_system=None,
+        direction="put",
+        socket_timeout=10.0,
     ):
         self.ssh_ctl_chan = ssh_conn
         self.source_file = source_file
         self.dest_file = dest_file
         self.direction = direction
+        self.socket_timeout = socket_timeout
 
         auto_flag = (
             "cisco_ios" in ssh_conn.device_type
@@ -96,7 +104,7 @@ class BaseFileTransfer(object):
 
     def establish_scp_conn(self):
         """Establish SCP connection."""
-        self.scp_conn = SCPConn(self.ssh_ctl_chan)
+        self.scp_conn = SCPConn(self.ssh_ctl_chan, socket_timeout=self.socket_timeout)
 
     def close_scp_chan(self):
         """Close the SCP connection to the remote network device."""
@@ -105,7 +113,7 @@ class BaseFileTransfer(object):
 
     def remote_space_available(self, search_pattern=r"(\d+) \w+ free"):
         """Return space available on remote device."""
-        remote_cmd = "dir {}".format(self.file_system)
+        remote_cmd = f"dir {self.file_system}"
         remote_output = self.ssh_ctl_chan.send_command_expect(remote_cmd)
         match = re.search(search_pattern, remote_output)
         if "kbytes" in match.group(0) or "Kbytes" in match.group(0):
@@ -115,7 +123,7 @@ class BaseFileTransfer(object):
     def _remote_space_available_unix(self, search_pattern=""):
         """Return space available on *nix system (BSD/Linux)."""
         self.ssh_ctl_chan._enter_shell()
-        remote_cmd = "/bin/df -k {}".format(self.file_system)
+        remote_cmd = f"/bin/df -k {self.file_system}"
         remote_output = self.ssh_ctl_chan.send_command(
             remote_cmd, expect_string=r"[\$#]"
         )
@@ -149,8 +157,17 @@ class BaseFileTransfer(object):
 
     def local_space_available(self):
         """Return space available on local filesystem."""
-        destination_stats = os.statvfs(".")
-        return destination_stats.f_bsize * destination_stats.f_bavail
+        if platform.system() == "Windows":
+            import ctypes
+
+            free_bytes = ctypes.c_ulonglong(0)
+            ctypes.windll.kernel32.GetDiskFreeSpaceExW(
+                ctypes.c_wchar_p("."), None, None, ctypes.pointer(free_bytes)
+            )
+            return free_bytes.value
+        else:
+            destination_stats = os.statvfs(".")
+            return destination_stats.f_bsize * destination_stats.f_bavail
 
     def verify_space_available(self, search_pattern=r"(\d+) \w+ free"):
         """Verify sufficient space is available on destination file system (return boolean)."""
@@ -166,7 +183,7 @@ class BaseFileTransfer(object):
         """Check if the dest_file already exists on the file system (return boolean)."""
         if self.direction == "put":
             if not remote_cmd:
-                remote_cmd = "dir {}/{}".format(self.file_system, self.dest_file)
+                remote_cmd = f"dir {self.file_system}/{self.dest_file}"
             remote_out = self.ssh_ctl_chan.send_command_expect(remote_cmd)
             search_string = r"Directory of .*{0}".format(self.dest_file)
             if (
@@ -186,7 +203,7 @@ class BaseFileTransfer(object):
         """Check if the dest_file already exists on the file system (return boolean)."""
         if self.direction == "put":
             self.ssh_ctl_chan._enter_shell()
-            remote_cmd = "ls {}".format(self.file_system)
+            remote_cmd = f"ls {self.file_system}"
             remote_out = self.ssh_ctl_chan.send_command(
                 remote_cmd, expect_string=r"[\$#]"
             )
@@ -203,7 +220,7 @@ class BaseFileTransfer(object):
             elif self.direction == "get":
                 remote_file = self.source_file
         if not remote_cmd:
-            remote_cmd = "dir {}/{}".format(self.file_system, remote_file)
+            remote_cmd = f"dir {self.file_system}/{remote_file}"
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd)
         # Strip out "Directory of flash:/filename line
         remote_out = re.split(r"Directory of .*", remote_out)
@@ -228,9 +245,9 @@ class BaseFileTransfer(object):
                 remote_file = self.dest_file
             elif self.direction == "get":
                 remote_file = self.source_file
-        remote_file = "{}/{}".format(self.file_system, remote_file)
+        remote_file = f"{self.file_system}/{remote_file}"
         if not remote_cmd:
-            remote_cmd = "ls -l {}".format(remote_file)
+            remote_cmd = f"ls -l {remote_file}"
 
         self.ssh_ctl_chan._enter_shell()
         remote_out = self.ssh_ctl_chan.send_command(remote_cmd, expect_string=r"[\$#]")
@@ -252,12 +269,27 @@ class BaseFileTransfer(object):
             "Search pattern not found for remote file size during SCP transfer."
         )
 
-    def file_md5(self, file_name):
-        """Compute MD5 hash of file."""
+    def file_md5(self, file_name, add_newline=False):
+        """Compute MD5 hash of file.
+
+        add_newline is needed to support Cisco IOS MD5 calculation which expects the newline in
+        the string
+
+        Args:
+          file_name: name of file to get md5 digest of
+          add_newline: add newline to end of file contents or not
+
+        """
+        file_hash = hashlib.md5()
         with open(file_name, "rb") as f:
-            file_contents = f.read()
-            file_hash = hashlib.md5(file_contents).hexdigest()
-        return file_hash
+            while True:
+                file_contents = f.read(512)
+                if not file_contents:
+                    if add_newline:
+                        file_contents + b"\n"
+                    break
+                file_hash.update(file_contents)
+        return file_hash.hexdigest()
 
     @staticmethod
     def process_md5(md5_output, pattern=r"=\s+(\S+)"):
@@ -272,7 +304,7 @@ class BaseFileTransfer(object):
         if match:
             return match.group(1)
         else:
-            raise ValueError("Invalid output from MD5 command: {}".format(md5_output))
+            raise ValueError(f"Invalid output from MD5 command: {md5_output}")
 
     def compare_md5(self):
         """Compare md5 of file on network device to md5 of local file."""
@@ -293,7 +325,7 @@ class BaseFileTransfer(object):
                 remote_file = self.dest_file
             elif self.direction == "get":
                 remote_file = self.source_file
-        remote_md5_cmd = "{} {}/{}".format(base_cmd, self.file_system, remote_file)
+        remote_md5_cmd = f"{base_cmd} {self.file_system}/{remote_file}"
         dest_md5 = self.ssh_ctl_chan.send_command(remote_md5_cmd, max_loops=1500)
         dest_md5 = self.process_md5(dest_md5)
         return dest_md5
@@ -307,13 +339,13 @@ class BaseFileTransfer(object):
 
     def get_file(self):
         """SCP copy the file from the remote device to local system."""
-        source_file = "{}/{}".format(self.file_system, self.source_file)
+        source_file = f"{self.file_system}/{self.source_file}"
         self.scp_conn.scp_get_file(source_file, self.dest_file)
         self.scp_conn.close()
 
     def put_file(self):
         """SCP copy the file from the local system to the remote device."""
-        destination = "{}/{}".format(self.file_system, self.dest_file)
+        destination = f"{self.file_system}/{self.dest_file}"
         self.scp_conn.scp_transfer_file(self.source_file, destination)
         # Must close the SCP connection to get the file written (flush)
         self.scp_conn.close()
diff --git a/netmiko/snmp_autodetect.py b/netmiko/snmp_autodetect.py
index 2928def6bcc1d2377059d0b55595f298e2c167c9..9da6d52690063547b408f409f7431a526374f65a 100644
--- a/netmiko/snmp_autodetect.py
+++ b/netmiko/snmp_autodetect.py
@@ -20,8 +20,6 @@ SNMPDetect class defaults to SNMPv3
 Note, pysnmp is a required dependency for SNMPDetect and is intentionally not included in
 netmiko requirements. So installation of pysnmp might be required.
 """
-from __future__ import unicode_literals
-
 import re
 
 try:
@@ -30,7 +28,6 @@ except ImportError:
     raise ImportError("pysnmp not installed; please install it: 'pip install pysnmp'")
 
 from netmiko.ssh_dispatcher import CLASS_MAPPER
-from netmiko.py23_compat import text_type
 
 
 # Higher priority indicates a better match.
@@ -47,7 +44,7 @@ SNMP_MAPPER_BASE = {
     },
     "hp_comware": {
         "oid": ".1.3.6.1.2.1.1.1.0",
-        "expr": re.compile(r".*HP Comware.*", re.IGNORECASE),
+        "expr": re.compile(r".*HP(E)? Comware.*", re.IGNORECASE),
         "priority": 99,
     },
     "hp_procurve": {
@@ -105,6 +102,11 @@ SNMP_MAPPER_BASE = {
         "expr": re.compile(r".*Juniper.*"),
         "priority": 99,
     },
+    "nokia_sros": {
+        "oid": ".1.3.6.1.2.1.1.1.0",
+        "expr": re.compile(r".*TiMOS.*"),
+        "priority": 99,
+    },
 }
 
 # Ensure all SNMP device types are supported by Netmiko
@@ -262,7 +264,7 @@ class SNMPDetect(object):
         )
 
         if not error_detected and snmp_data[0][1]:
-            return text_type(snmp_data[0][1])
+            return str(snmp_data[0][1])
         return ""
 
     def _get_snmpv2c(self, oid):
@@ -291,7 +293,7 @@ class SNMPDetect(object):
         )
 
         if not error_detected and snmp_data[0][1]:
-            return text_type(snmp_data[0][1])
+            return str(snmp_data[0][1])
         return ""
 
     def _get_snmp(self, oid):
@@ -328,15 +330,15 @@ class SNMPDetect(object):
                 oid = v["oid"]
                 regex = v["expr"]
 
-            # Used cache data if we already queryied this OID
-            if self._response_cache.get(oid):
-                snmp_response = self._response_cache.get(oid)
-            else:
-                snmp_response = self._get_snmp(oid)
-                self._response_cache[oid] = snmp_response
+                # Used cache data if we already queryied this OID
+                if self._response_cache.get(oid):
+                    snmp_response = self._response_cache.get(oid)
+                else:
+                    snmp_response = self._get_snmp(oid)
+                    self._response_cache[oid] = snmp_response
 
-            # See if we had a match
-            if re.search(regex, snmp_response):
-                return device_type
+                # See if we had a match
+                if re.search(regex, snmp_response):
+                    return device_type
 
         return None
diff --git a/netmiko/ssh_autodetect.py b/netmiko/ssh_autodetect.py
index 5838cc43a905851f6b4c322051c99ef3ba92c50d..524a94195ce7c174f1f0c4b07489d051ebeb4e11 100644
--- a/netmiko/ssh_autodetect.py
+++ b/netmiko/ssh_autodetect.py
@@ -38,8 +38,6 @@ Examples
 >>> remote_device['device_type'] = best_match
 >>> connection = ConnectHandler(**remote_device)
 """
-from __future__ import unicode_literals
-
 import re
 import time
 from netmiko.ssh_dispatcher import ConnectHandler
@@ -262,7 +260,6 @@ class SSHDetect(object):
         self.connection.write_channel(cmd + "\n")
         time.sleep(1)
         output = self.connection._read_channel_timing()
-        output = self.connection.strip_ansi_escape_codes(output)
         output = self.connection.strip_backspaces(output)
         return output
 
diff --git a/netmiko/ssh_dispatcher.py b/netmiko/ssh_dispatcher.py
index 7e40c5b15c13d8e69ccf5c4c6928c0869943b3bd..893b170f49c770cb7957056fe03820da3132ac9b 100644
--- a/netmiko/ssh_dispatcher.py
+++ b/netmiko/ssh_dispatcher.py
@@ -1,17 +1,14 @@
 """Controls selection of proper class based on the device type."""
-from __future__ import unicode_literals
-
 from netmiko.a10 import A10SSH
 from netmiko.accedian import AccedianSSH
 from netmiko.alcatel import AlcatelAosSSH
-from netmiko.alcatel import AlcatelSrosSSH
 from netmiko.arista import AristaSSH, AristaTelnet
 from netmiko.arista import AristaFileTransfer
 from netmiko.apresia import ApresiaAeosSSH, ApresiaAeosTelnet
 from netmiko.aruba import ArubaSSH
 from netmiko.calix import CalixB6SSH, CalixB6Telnet
 from netmiko.checkpoint import CheckPointGaiaSSH
-from netmiko.ciena import CienaSaosSSH
+from netmiko.ciena import CienaSaosSSH, CienaSaosTelnet, CienaSaosFileTransfer
 from netmiko.cisco import CiscoAsaSSH, CiscoAsaFileTransfer
 from netmiko.cisco import (
     CiscoIosSSH,
@@ -34,7 +31,7 @@ from netmiko.dell import DellOS10SSH, DellOS10FileTransfer
 from netmiko.dell import DellPowerConnectSSH
 from netmiko.dell import DellPowerConnectTelnet
 from netmiko.dell import DellIsilonSSH
-from netmiko.eltex import EltexSSH
+from netmiko.eltex import EltexSSH, EltexEsrSSH
 from netmiko.endace import EndaceSSH
 from netmiko.enterasys import EnterasysSSH
 from netmiko.extreme import ExtremeErsSSH
@@ -53,7 +50,7 @@ from netmiko.fortinet import FortinetSSH
 from netmiko.hp import HPProcurveSSH, HPProcurveTelnet, HPComwareSSH, HPComwareTelnet
 from netmiko.huawei import HuaweiSSH, HuaweiVrpv8SSH, HuaweiTelnet
 from netmiko.ipinfusion import IpInfusionOcNOSSSH, IpInfusionOcNOSTelnet
-from netmiko.juniper import JuniperSSH, JuniperTelnet
+from netmiko.juniper import JuniperSSH, JuniperTelnet, JuniperScreenOsSSH
 from netmiko.juniper import JuniperFileTransfer
 from netmiko.keymile import KeymileSSH, KeymileNOSSSH
 from netmiko.linux import LinuxSSH, LinuxFileTransfer
@@ -63,6 +60,7 @@ from netmiko.mellanox import MellanoxMlnxosSSH
 from netmiko.mrv import MrvLxSSH
 from netmiko.mrv import MrvOptiswitchSSH
 from netmiko.netapp import NetAppcDotSSH
+from netmiko.nokia import NokiaSrosSSH
 from netmiko.oneaccess import OneaccessOneOSTelnet, OneaccessOneOSSSH
 from netmiko.ovs import OvsLinuxSSH
 from netmiko.paloalto import PaloAltoPanosSSH
@@ -73,6 +71,7 @@ from netmiko.rad import RadETXSSH
 from netmiko.rad import RadETXTelnet
 from netmiko.ruckus import RuckusFastironSSH
 from netmiko.ruckus import RuckusFastironTelnet
+from netmiko.ruijie import RuijieOSSSH, RuijieOSTelnet
 from netmiko.terminal_server import TerminalServerSSH
 from netmiko.terminal_server import TerminalServerTelnet
 from netmiko.ubiquiti import UbiquitiEdgeSSH
@@ -84,7 +83,7 @@ CLASS_MAPPER_BASE = {
     "a10": A10SSH,
     "accedian": AccedianSSH,
     "alcatel_aos": AlcatelAosSSH,
-    "alcatel_sros": AlcatelSrosSSH,
+    "alcatel_sros": NokiaSrosSSH,
     "apresia_aeos": ApresiaAeosSSH,
     "arista_eos": AristaSSH,
     "aruba_os": ArubaSSH,
@@ -117,6 +116,7 @@ CLASS_MAPPER_BASE = {
     "dell_isilon": DellIsilonSSH,
     "endace": EndaceSSH,
     "eltex": EltexSSH,
+    "eltex_esr": EltexEsrSSH,
     "enterasys": EnterasysSSH,
     "extreme": ExtremeExosSSH,
     "extreme_ers": ExtremeErsSSH,
@@ -140,6 +140,7 @@ CLASS_MAPPER_BASE = {
     "ipinfusion_ocnos": IpInfusionOcNOSSSH,
     "juniper": JuniperSSH,
     "juniper_junos": JuniperSSH,
+    "juniper_screenos": JuniperScreenOsSSH,
     "keymile": KeymileSSH,
     "keymile_nos": KeymileNOSSSH,
     "linux": LinuxSSH,
@@ -151,6 +152,7 @@ CLASS_MAPPER_BASE = {
     "mrv_optiswitch": MrvOptiswitchSSH,
     "netapp_cdot": NetAppcDotSSH,
     "netscaler": NetscalerSSH,
+    "nokia_sros": NokiaSrosSSH,
     "oneaccess_oneos": OneaccessOneOSSSH,
     "ovs_linux": OvsLinuxSSH,
     "paloalto_panos": PaloAltoPanosSSH,
@@ -158,6 +160,7 @@ CLASS_MAPPER_BASE = {
     "quanta_mesh": QuantaMeshSSH,
     "rad_etx": RadETXSSH,
     "ruckus_fastiron": RuckusFastironSSH,
+    "ruijie_os": RuijieOSSSH,
     "ubiquiti_edge": UbiquitiEdgeSSH,
     "ubiquiti_edgeswitch": UbiquitiEdgeSSH,
     "vyatta_vyos": VyOSSSH,
@@ -166,12 +169,13 @@ CLASS_MAPPER_BASE = {
 
 FILE_TRANSFER_MAP = {
     "arista_eos": AristaFileTransfer,
+    "ciena_saos": CienaSaosFileTransfer,
     "cisco_asa": CiscoAsaFileTransfer,
     "cisco_ios": CiscoIosFileTransfer,
-    "dell_os10": DellOS10FileTransfer,
     "cisco_nxos": CiscoNxosFileTransfer,
     "cisco_xe": CiscoIosFileTransfer,
     "cisco_xr": CiscoXrFileTransfer,
+    "dell_os10": DellOS10FileTransfer,
     "juniper_junos": JuniperFileTransfer,
     "linux": LinuxFileTransfer,
 }
@@ -197,6 +201,7 @@ CLASS_MAPPER["arista_eos_telnet"] = AristaTelnet
 CLASS_MAPPER["brocade_fastiron_telnet"] = RuckusFastironTelnet
 CLASS_MAPPER["brocade_netiron_telnet"] = ExtremeNetironTelnet
 CLASS_MAPPER["calix_b6_telnet"] = CalixB6Telnet
+CLASS_MAPPER["ciena_saos_telnet"] = CienaSaosTelnet
 CLASS_MAPPER["cisco_ios_telnet"] = CiscoIosTelnet
 CLASS_MAPPER["cisco_xr_telnet"] = CiscoXrTelnet
 CLASS_MAPPER["dell_dnos6_telnet"] = DellDNOS6Telnet
@@ -214,6 +219,7 @@ CLASS_MAPPER["paloalto_panos_telnet"] = PaloAltoPanosTelnet
 CLASS_MAPPER["oneaccess_oneos_telnet"] = OneaccessOneOSTelnet
 CLASS_MAPPER["rad_etx_telnet"] = RadETXTelnet
 CLASS_MAPPER["ruckus_fastiron_telnet"] = RuckusFastironTelnet
+CLASS_MAPPER["ruijie_os_telnet"] = RuijieOSTelnet
 
 # Add serial drivers
 CLASS_MAPPER["cisco_ios_serial"] = CiscoIosSerial
diff --git a/netmiko/ssh_exception.py b/netmiko/ssh_exception.py
index 92ec5653e505d947b111a747e2d8b368c5a61707..8e553e6863ae6deff2d8bb8eb9b62b01e1f466cd 100644
--- a/netmiko/ssh_exception.py
+++ b/netmiko/ssh_exception.py
@@ -1,15 +1,18 @@
-from __future__ import unicode_literals
 from paramiko.ssh_exception import SSHException
 from paramiko.ssh_exception import AuthenticationException
 
 
-class NetMikoTimeoutException(SSHException):
+class NetmikoTimeoutException(SSHException):
     """SSH session timed trying to connect to the device."""
 
     pass
 
 
-class NetMikoAuthenticationException(AuthenticationException):
+class NetmikoAuthenticationException(AuthenticationException):
     """SSH authentication exception based on Paramiko AuthenticationException."""
 
     pass
+
+
+NetMikoTimeoutException = NetmikoTimeoutException
+NetMikoAuthenticationException = NetmikoAuthenticationException
diff --git a/netmiko/terminal_server/__init__.py b/netmiko/terminal_server/__init__.py
index 269ee8fce3eb7a47c06090fb46dbf0afa1918c18..d8025cef59302ee1c59fa3b4af60b26043d20e4c 100644
--- a/netmiko/terminal_server/__init__.py
+++ b/netmiko/terminal_server/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.terminal_server.terminal_server import TerminalServerSSH
 from netmiko.terminal_server.terminal_server import TerminalServerTelnet
 
diff --git a/netmiko/terminal_server/terminal_server.py b/netmiko/terminal_server/terminal_server.py
index 94c2626bc4679997ff4bc01cd10921a989b8fcde..670ac06e0da1bedd7015d6ab24ee74206f895691 100644
--- a/netmiko/terminal_server/terminal_server.py
+++ b/netmiko/terminal_server/terminal_server.py
@@ -1,5 +1,4 @@
 """Generic Terminal Server driver."""
-from __future__ import unicode_literals
 from netmiko.base_connection import BaseConnection
 
 
@@ -29,4 +28,4 @@ class TerminalServerTelnet(TerminalServer):
         pass
 
     def std_login(self, *args, **kwargs):
-        return super(TerminalServerTelnet, self).telnet_login(*args, **kwargs)
+        return super().telnet_login(*args, **kwargs)
diff --git a/netmiko/ubiquiti/__init__.py b/netmiko/ubiquiti/__init__.py
index 0f74d98f46b4898a57b9f8f412abde9a81d616ef..066697941b570313de781813ff86b2043dbf3542 100644
--- a/netmiko/ubiquiti/__init__.py
+++ b/netmiko/ubiquiti/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.ubiquiti.edge_ssh import UbiquitiEdgeSSH
 
 __all__ = ["UbiquitiEdgeSSH"]
diff --git a/netmiko/ubiquiti/edge_ssh.py b/netmiko/ubiquiti/edge_ssh.py
index aa5c5133df7de724b9d8b5e1c032e631a8d6ff5c..9650e9e0be2fc7399a926b51d52ead7d0ea76ea8 100644
--- a/netmiko/ubiquiti/edge_ssh.py
+++ b/netmiko/ubiquiti/edge_ssh.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -26,22 +25,22 @@ class UbiquitiEdgeSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string=")#"):
         """Checks if the device is in configuration mode or not."""
-        return super(UbiquitiEdgeSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="configure"):
         """Enter configuration mode."""
-        return super(UbiquitiEdgeSSH, self).config_mode(config_command=config_command)
+        return super().config_mode(config_command=config_command)
 
     def exit_config_mode(self, exit_config="exit"):
         """Exit configuration mode."""
-        return super(UbiquitiEdgeSSH, self).exit_config_mode(exit_config=exit_config)
+        return super().exit_config_mode(exit_config=exit_config)
 
     def exit_enable_mode(self, exit_command="exit"):
         """Exit enable mode."""
-        return super(UbiquitiEdgeSSH, self).exit_enable_mode(exit_command=exit_command)
+        return super().exit_enable_mode(exit_command=exit_command)
 
     def save_config(self, cmd="write memory", confirm=False, confirm_response=""):
         """Saves configuration."""
-        return super(UbiquitiEdgeSSH, self).save_config(
+        return super().save_config(
             cmd=cmd, confirm=confirm, confirm_response=confirm_response
         )
diff --git a/netmiko/utilities.py b/netmiko/utilities.py
index 1961c714fbad3e7b0be8793ceb9c078e60afa3b6..c514b9e674656627b9e18486cc66a1da2d378614 100644
--- a/netmiko/utilities.py
+++ b/netmiko/utilities.py
@@ -1,13 +1,10 @@
 """Miscellaneous utility functions."""
-from __future__ import print_function
-from __future__ import unicode_literals
-
 from glob import glob
 import sys
 import io
 import os
+from pathlib import Path
 import serial.tools.list_ports
-from netmiko.py23_compat import text_type
 from netmiko._textfsm import _clitable as clitable
 from netmiko._textfsm._clitable import CliTableError
 
@@ -71,7 +68,7 @@ def load_yaml_file(yaml_file):
         with io.open(yaml_file, "rt", encoding="utf-8") as fname:
             return yaml.safe_load(fname)
     except IOError:
-        sys.exit("Unable to open YAML file: {0}".format(yaml_file))
+        sys.exit(f"Unable to open YAML file: {yaml_file}")
 
 
 def load_devices(file_name=None):
@@ -83,13 +80,10 @@ def load_devices(file_name=None):
 def find_cfg_file(file_name=None):
     """
     Search for netmiko_tools inventory file in the following order:
-
     NETMIKO_TOOLS_CFG environment variable
     Current directory
     Home directory
-
     Look for file named: .netmiko.yml or netmiko.yml
-
     Also allow NETMIKO_TOOLS_CFG to point directly at a file
     """
     if file_name:
@@ -102,9 +96,7 @@ def find_cfg_file(file_name=None):
     # Filter optional_path if null
     search_paths = [path for path in search_paths if path]
     for path in search_paths:
-        files = glob("{}/.netmiko.yml".format(path)) + glob(
-            "{}/netmiko.yml".format(path)
-        )
+        files = glob(f"{path}/.netmiko.yml") + glob(f"{path}/netmiko.yml")
         if files:
             return files[0]
     raise IOError(
@@ -128,8 +120,8 @@ def display_inventory(my_devices):
     print("\nDevices:")
     print("-" * 40)
     for a_device, device_type in inventory_devices:
-        device_type = "  ({})".format(device_type)
-        print("{:<25}{:>15}".format(a_device, device_type))
+        device_type = f"  ({device_type})"
+        print(f"{a_device:<25}{device_type:>15}")
     print("\n\nGroups:")
     print("-" * 40)
     for a_group in inventory_groups:
@@ -150,7 +142,7 @@ def obtain_all_devices(my_devices):
 def obtain_netmiko_filename(device_name):
     """Create file name based on device_name."""
     _, netmiko_full_dir = find_netmiko_dir()
-    return "{}/{}.txt".format(netmiko_full_dir, device_name)
+    return f"{netmiko_full_dir}/{device_name}.txt"
 
 
 def write_tmp_file(device_name, output):
@@ -169,7 +161,7 @@ def ensure_dir_exists(verify_dir):
         # Exists
         if not os.path.isdir(verify_dir):
             # Not a dir, raise an exception
-            raise ValueError("{} is not a directory".format(verify_dir))
+            raise ValueError(f"{verify_dir} is not a directory")
 
 
 def find_netmiko_dir():
@@ -181,12 +173,12 @@ def find_netmiko_dir():
     netmiko_base_dir = os.path.expanduser(netmiko_base_dir)
     if netmiko_base_dir == "/":
         raise ValueError("/ cannot be netmiko_base_dir")
-    netmiko_full_dir = "{}/tmp".format(netmiko_base_dir)
+    netmiko_full_dir = f"{netmiko_base_dir}/tmp"
     return (netmiko_base_dir, netmiko_full_dir)
 
 
 def write_bytes(out_data, encoding="ascii"):
-    """Write Python2 and Python3 compatible byte stream."""
+    """Legacy for Python2 and Python3 compatible byte stream."""
     if sys.version_info[0] >= 3:
         if isinstance(out_data, type("")):
             if encoding == "utf-8":
@@ -195,14 +187,6 @@ def write_bytes(out_data, encoding="ascii"):
                 return out_data.encode("ascii", "ignore")
         elif isinstance(out_data, type(b"")):
             return out_data
-    else:
-        if isinstance(out_data, type("")):
-            if encoding == "utf-8":
-                return out_data.encode("utf-8")
-            else:
-                return out_data.encode("ascii", "ignore")
-        elif isinstance(out_data, type(str(""))):
-            return out_data
     msg = "Invalid value for out_data neither unicode nor byte string: {}".format(
         out_data
     )
@@ -215,11 +199,11 @@ def check_serial_port(name):
         cdc = next(serial.tools.list_ports.grep(name))
         return cdc[0]
     except StopIteration:
-        msg = "device {} not found. ".format(name)
+        msg = f"device {name} not found. "
         msg += "available devices are: "
         ports = list(serial.tools.list_ports.comports())
         for p in ports:
-            msg += "{},".format(text_type(p))
+            msg += f"{str(p)},"
         raise ValueError(msg)
 
 
@@ -257,22 +241,53 @@ def clitable_to_dict(cli_table):
     return objs
 
 
-def get_structured_data(raw_output, platform, command):
-    """Convert raw CLI output to structured data using TextFSM template."""
-    template_dir = get_template_dir()
-    index_file = os.path.join(template_dir, "index")
-    textfsm_obj = clitable.CliTable(index_file, template_dir)
-    attrs = {"Command": command, "Platform": platform}
+def _textfsm_parse(textfsm_obj, raw_output, attrs, template_file=None):
+    """Perform the actual TextFSM parsing using the CliTable object."""
     try:
         # Parse output through template
-        textfsm_obj.ParseCmd(raw_output, attrs)
+        if template_file is not None:
+            textfsm_obj.ParseCmd(raw_output, templates=template_file)
+        else:
+            textfsm_obj.ParseCmd(raw_output, attrs)
         structured_data = clitable_to_dict(textfsm_obj)
         output = raw_output if structured_data == [] else structured_data
         return output
-    except CliTableError:
+    except (FileNotFoundError, CliTableError):
         return raw_output
 
 
+def get_structured_data(raw_output, platform=None, command=None, template=None):
+    """
+    Convert raw CLI output to structured data using TextFSM template.
+
+    You can use a straight TextFSM file i.e. specify "template". If no template is specified,
+    then you must use an CliTable index file.
+    """
+    if platform is None or command is None:
+        attrs = {}
+    else:
+        attrs = {"Command": command, "Platform": platform}
+
+    if template is None:
+        if attrs == {}:
+            raise ValueError(
+                "Either 'platform/command' or 'template' must be specified."
+            )
+        template_dir = get_template_dir()
+        index_file = os.path.join(template_dir, "index")
+        textfsm_obj = clitable.CliTable(index_file, template_dir)
+        return _textfsm_parse(textfsm_obj, raw_output, attrs)
+    else:
+        template_path = Path(os.path.expanduser(template))
+        template_file = template_path.name
+        template_dir = template_path.parents[0]
+        # CliTable with no index will fall-back to a TextFSM parsing behavior
+        textfsm_obj = clitable.CliTable(template_dir=template_dir)
+        return _textfsm_parse(
+            textfsm_obj, raw_output, attrs, template_file=template_file
+        )
+
+
 def get_structured_data_genie(raw_output, platform, command):
     if not sys.version_info >= (3, 4):
         raise ValueError("Genie requires Python >= 3.4")
diff --git a/netmiko/vyos/__init__.py b/netmiko/vyos/__init__.py
index f169ebabb6c59c6574489949b8740e9fb9646a74..b5c586e3684b9317fabc81cbe6291b45919da6f3 100644
--- a/netmiko/vyos/__init__.py
+++ b/netmiko/vyos/__init__.py
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
 from netmiko.vyos.vyos_ssh import VyOSSSH
 
 __all__ = ["VyOSSSH"]
diff --git a/netmiko/vyos/vyos_ssh.py b/netmiko/vyos/vyos_ssh.py
index e72745541777a4f28ba408855a67a0d81bf30d72..1efb031ea79b7952726788802c73ce560506e547 100644
--- a/netmiko/vyos/vyos_ssh.py
+++ b/netmiko/vyos/vyos_ssh.py
@@ -1,5 +1,3 @@
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 from netmiko.cisco_base_connection import CiscoSSHConnection
 
@@ -30,13 +28,11 @@ class VyOSSSH(CiscoSSHConnection):
 
     def check_config_mode(self, check_string="#"):
         """Checks if the device is in configuration mode"""
-        return super(VyOSSSH, self).check_config_mode(check_string=check_string)
+        return super().check_config_mode(check_string=check_string)
 
     def config_mode(self, config_command="configure", pattern=r"[edit]"):
         """Enter configuration mode."""
-        return super(VyOSSSH, self).config_mode(
-            config_command=config_command, pattern=pattern
-        )
+        return super().config_mode(config_command=config_command, pattern=pattern)
 
     def exit_config_mode(self, exit_config="exit", pattern=r"exit"):
         """Exit configuration mode"""
@@ -71,7 +67,7 @@ class VyOSSSH(CiscoSSHConnection):
         command_string = "commit"
 
         if comment:
-            command_string += ' comment "{}"'.format(comment)
+            command_string += f' comment "{comment}"'
 
         output = self.config_mode()
         output += self.send_command_expect(
@@ -82,16 +78,14 @@ class VyOSSSH(CiscoSSHConnection):
         )
 
         if any(x in output for x in error_marker):
-            raise ValueError(
-                "Commit failed with following errors:\n\n{}".format(output)
-            )
+            raise ValueError(f"Commit failed with following errors:\n\n{output}")
         return output
 
     def set_base_prompt(
         self, pri_prompt_terminator="$", alt_prompt_terminator="#", delay_factor=1
     ):
         """Sets self.base_prompt: used as delimiter for stripping of trailing prompt in output."""
-        prompt = super(VyOSSSH, self).set_base_prompt(
+        prompt = super().set_base_prompt(
             pri_prompt_terminator=pri_prompt_terminator,
             alt_prompt_terminator=alt_prompt_terminator,
             delay_factor=delay_factor,
@@ -100,25 +94,10 @@ class VyOSSSH(CiscoSSHConnection):
         self.base_prompt = prompt[:-2].strip()
         return self.base_prompt
 
-    def send_config_set(
-        self,
-        config_commands=None,
-        exit_config_mode=False,
-        delay_factor=1,
-        max_loops=150,
-        strip_prompt=False,
-        strip_command=False,
-        config_mode_command=None,
-    ):
+    def send_config_set(self, config_commands=None, exit_config_mode=False, **kwargs):
         """Remain in configuration mode."""
-        return super(VyOSSSH, self).send_config_set(
-            config_commands=config_commands,
-            exit_config_mode=exit_config_mode,
-            delay_factor=delay_factor,
-            max_loops=max_loops,
-            strip_prompt=strip_prompt,
-            strip_command=strip_command,
-            config_mode_command=config_mode_command,
+        return super().send_config_set(
+            config_commands=config_commands, exit_config_mode=exit_config_mode, **kwargs
         )
 
     def save_config(self, *args, **kwargs):
diff --git a/release_process.txt b/release_process.txt
index 18586bd4402d5bee37375f2de32663515e92896b..c671ea0d5514dc06dc9b75786f48428e1bc79630 100644
--- a/release_process.txt
+++ b/release_process.txt
@@ -1,6 +1,6 @@
 
-# Use pynetcio machine
-# Use virtual environment = py36_netmiko
+# Use pydev1 machine
+# Use virtual environment = py3_netmiko
 
 # Run the following command to update docs: 
 $ pdoc3 --html --output-dir docs netmiko --force
diff --git a/requirements-dev.txt b/requirements-dev.txt
index ac8f0e9e57c0d43a242af38ab5280f3741cb18ce..280e9706722b44f191db9ec22376dfa74744fd94 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,8 +1,8 @@
-PyYAML==5.1
-pytest==4.6.3
+PyYAML==5.1.2
+pytest==5.1.2
 pylama==7.7.1
-tox==3.13.1
+tox==3.13.2
 twine==1.13.0
-pysnmp==4.4.9
-pdoc3==0.6.2; python_version >= '3.6'
+pysnmp==4.4.11
+pdoc3==0.6.3
 -r requirements.txt
diff --git a/requirements-genie.txt b/requirements-genie.txt
index 707710677303b2f739e5bb11e33068605897626a..b26dbd6f68356a80f900d8c9229ba49618892a27 100644
--- a/requirements-genie.txt
+++ b/requirements-genie.txt
@@ -1,2 +1,3 @@
-pyats>=19.7; python_version>="3.4"
-genie>=19.7; python_version>="3.4"
+# pyats and genie are not available for Python 3.8 yet
+pyats>=19.7; python_version<"3.8"
+genie>=19.7; python_version<"3.8"
diff --git a/setup.cfg b/setup.cfg
index d3d9701fc6cc6db967f1100bc95e09bc858d91c8..db0a5cd893a7ab8f2f4ed4102cd08251f1dc070e 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -7,7 +7,10 @@ license_file = LICENSE
 [pylama]
 linters = mccabe,pep8,pyflakes
 ignore = D203,C901
-skip = tests/*,build/*,.tox/*,netmiko/_textfsm/*,examples/use_cases/*
+skip = build/*,.tox/*,netmiko/_textfsm/*,examples/use_cases/*
 
 [pylama:pep8]
 max_line_length = 100
+
+[tool:pytest]
+addopts = -rs
diff --git a/setup.py b/setup.py
index 84588a9423af4ab50c8e6d737ee23a33ff25b9c9..59c9fb7baebeaa02de6e23524047ccaecece36e1 100644
--- a/setup.py
+++ b/setup.py
@@ -39,12 +39,10 @@ setup(
     license="MIT",
     classifiers=[
         "License :: OSI Approved :: MIT License",
-        "Programming Language :: Python :: 2",
-        "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.5",
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3.8",
     ],
     packages=find_packages(exclude=("test*",)),
     install_requires=[
@@ -53,8 +51,6 @@ setup(
         "scp>=0.13.2",
         "pyserial",
         "textfsm",
-        'enum34; python_version == "2.7"',
-        'ipaddress; python_version == "2.7"',
     ],
-    extras_require={"test": ["pyyaml==5.1", "pytest>=4.6.3"]},
+    extras_require={"test": ["pyyaml==5.1.2", "pytest>=5.1.2"]},
 )
diff --git a/tests/SLOG/cisco881_slog.log b/tests/SLOG/cisco881_slog.log
index 7b8e1e87c59f90e764a28506c4a9f50ffd1f7a73..d18bd25b02a4b6a1e91742a662e0145650a96fe6 100644
--- a/tests/SLOG/cisco881_slog.log
+++ b/tests/SLOG/cisco881_slog.log
@@ -1,21 +1,15 @@
-
+
 cisco1#
-
 cisco1#terminal length 0
-terminal length 0
 cisco1#terminal width 511
-terminal width 511
 cisco1#
-
 cisco1#show ip interface brief
-show ip interface brief
-Interface                  IP-Address      OK? Method Status                Protocol
-FastEthernet0              unassigned      YES unset  down                  down    
-FastEthernet1              unassigned      YES unset  down                  down    
-FastEthernet2              unassigned      YES unset  down                  down    
-FastEthernet3              unassigned      YES unset  down                  down    
-FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
-Vlan1                      unassigned      YES unset  down                  down    
+Interface                  IP-Address      OK? Method Status                Protocol
+FastEthernet0              unassigned      YES unset  down                  down    
+FastEthernet1              unassigned      YES unset  down                  down    
+FastEthernet2              unassigned      YES unset  down                  down    
+FastEthernet3              unassigned      YES unset  down                  down    
+FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
+Vlan1                      unassigned      YES unset  down                  down    
 cisco1#
-
 cisco1#exit
diff --git a/tests/SLOG/cisco881_slog_append.log b/tests/SLOG/cisco881_slog_append.log
index 8ab89db3f405493753347541b0c1a1a71e5a8d12..adda598b3e1707256e58d8abaef84d98e86da8f6 100644
--- a/tests/SLOG/cisco881_slog_append.log
+++ b/tests/SLOG/cisco881_slog_append.log
@@ -1,16 +1,16 @@
 Initial file contents
 
-cisco1#
-cisco1#terminal length 0
-cisco1#terminal width 511
-cisco1#
-cisco1#show ip interface brief
-Interface                  IP-Address      OK? Method Status                Protocol
-FastEthernet0              unassigned      YES unset  down                  down    
-FastEthernet1              unassigned      YES unset  down                  down    
-FastEthernet2              unassigned      YES unset  down                  down    
-FastEthernet3              unassigned      YES unset  down                  down    
-FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
-Vlan1                      unassigned      YES unset  down                  down    
-cisco1#
+cisco1#
+cisco1#terminal length 0
+cisco1#terminal width 511
+cisco1#
+cisco1#show ip interface brief
+Interface                  IP-Address      OK? Method Status                Protocol
+FastEthernet0              unassigned      YES unset  down                  down    
+FastEthernet1              unassigned      YES unset  down                  down    
+FastEthernet2              unassigned      YES unset  down                  down    
+FastEthernet3              unassigned      YES unset  down                  down    
+FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
+Vlan1                      unassigned      YES unset  down                  down    
+cisco1#
 cisco1#exit
diff --git a/tests/SLOG/cisco881_slog_append_compare.log b/tests/SLOG/cisco881_slog_append_compare.log
index 24eff7b9204ff45b4dfca68b65f37e72c26988f3..07f3262558bfc5e7b168b26cfc78eb3e2bfdc73f 100644
--- a/tests/SLOG/cisco881_slog_append_compare.log
+++ b/tests/SLOG/cisco881_slog_append_compare.log
@@ -1,14 +1,14 @@
-cisco1#
-cisco1#terminal length 0
-cisco1#terminal width 511
-cisco1#
-cisco1#show ip interface brief
-Interface                  IP-Address      OK? Method Status                Protocol
-FastEthernet0              unassigned      YES unset  down                  down    
-FastEthernet1              unassigned      YES unset  down                  down    
-FastEthernet2              unassigned      YES unset  down                  down    
-FastEthernet3              unassigned      YES unset  down                  down    
-FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
-Vlan1                      unassigned      YES unset  down                  down    
-cisco1#
+cisco1#
+cisco1#terminal length 0
+cisco1#terminal width 511
+cisco1#
+cisco1#show ip interface brief
+Interface                  IP-Address      OK? Method Status                Protocol
+FastEthernet0              unassigned      YES unset  down                  down    
+FastEthernet1              unassigned      YES unset  down                  down    
+FastEthernet2              unassigned      YES unset  down                  down    
+FastEthernet3              unassigned      YES unset  down                  down    
+FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
+Vlan1                      unassigned      YES unset  down                  down    
+cisco1#
 cisco1#exit
diff --git a/tests/SLOG/cisco881_slog_compare.log b/tests/SLOG/cisco881_slog_compare.log
index 24eff7b9204ff45b4dfca68b65f37e72c26988f3..07f3262558bfc5e7b168b26cfc78eb3e2bfdc73f 100644
--- a/tests/SLOG/cisco881_slog_compare.log
+++ b/tests/SLOG/cisco881_slog_compare.log
@@ -1,14 +1,14 @@
-cisco1#
-cisco1#terminal length 0
-cisco1#terminal width 511
-cisco1#
-cisco1#show ip interface brief
-Interface                  IP-Address      OK? Method Status                Protocol
-FastEthernet0              unassigned      YES unset  down                  down    
-FastEthernet1              unassigned      YES unset  down                  down    
-FastEthernet2              unassigned      YES unset  down                  down    
-FastEthernet3              unassigned      YES unset  down                  down    
-FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
-Vlan1                      unassigned      YES unset  down                  down    
-cisco1#
+cisco1#
+cisco1#terminal length 0
+cisco1#terminal width 511
+cisco1#
+cisco1#show ip interface brief
+Interface                  IP-Address      OK? Method Status                Protocol
+FastEthernet0              unassigned      YES unset  down                  down    
+FastEthernet1              unassigned      YES unset  down                  down    
+FastEthernet2              unassigned      YES unset  down                  down    
+FastEthernet3              unassigned      YES unset  down                  down    
+FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
+Vlan1                      unassigned      YES unset  down                  down    
+cisco1#
 cisco1#exit
diff --git a/tests/SLOG/cisco881_slog_wr.log b/tests/SLOG/cisco881_slog_wr.log
new file mode 100644
index 0000000000000000000000000000000000000000..56ea3931b0dfaa9098aa0f6d04ad30aea2b5eed1
--- /dev/null
+++ b/tests/SLOG/cisco881_slog_wr.log
@@ -0,0 +1,20 @@
+cisco1#
+
+cisco1#terminal length 0
+terminal length 0
+cisco1#terminal width 511
+terminal width 511
+cisco1#
+
+cisco1#show ip interface brief
+show ip interface brief
+Interface                  IP-Address      OK? Method Status                Protocol
+FastEthernet0              unassigned      YES unset  down                  down    
+FastEthernet1              unassigned      YES unset  down                  down    
+FastEthernet2              unassigned      YES unset  down                  down    
+FastEthernet3              unassigned      YES unset  down                  down    
+FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
+Vlan1                      unassigned      YES unset  down                  down    
+cisco1#
+
+cisco1#exit
diff --git a/tests/SLOG/cisco881_slog_wr_compare.log b/tests/SLOG/cisco881_slog_wr_compare.log
index b5d38c8f86a59fe6ce9edf3d84734546b99a3b97..56ea3931b0dfaa9098aa0f6d04ad30aea2b5eed1 100644
--- a/tests/SLOG/cisco881_slog_wr_compare.log
+++ b/tests/SLOG/cisco881_slog_wr_compare.log
@@ -1,20 +1,20 @@
 cisco1#
-
+
 cisco1#terminal length 0
-terminal length 0
+terminal length 0
 cisco1#terminal width 511
-terminal width 511
+terminal width 511
 cisco1#
-
+
 cisco1#show ip interface brief
-show ip interface brief
-Interface                  IP-Address      OK? Method Status                Protocol
-FastEthernet0              unassigned      YES unset  down                  down    
-FastEthernet1              unassigned      YES unset  down                  down    
-FastEthernet2              unassigned      YES unset  down                  down    
-FastEthernet3              unassigned      YES unset  down                  down    
-FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
-Vlan1                      unassigned      YES unset  down                  down    
+show ip interface brief
+Interface                  IP-Address      OK? Method Status                Protocol
+FastEthernet0              unassigned      YES unset  down                  down    
+FastEthernet1              unassigned      YES unset  down                  down    
+FastEthernet2              unassigned      YES unset  down                  down    
+FastEthernet3              unassigned      YES unset  down                  down    
+FastEthernet4              10.220.88.20    YES NVRAM  up                    up      
+Vlan1                      unassigned      YES unset  down                  down    
 cisco1#
-
+
 cisco1#exit
diff --git a/tests/add_delay.sh b/tests/add_delay.sh
new file mode 100755
index 0000000000000000000000000000000000000000..5eef74d7523621d3978421514e6f76c114f9ec99
--- /dev/null
+++ b/tests/add_delay.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+# Add delay for cisco3; must be root or sudo to execute
+sudo -s /sbin/tc qdisc del dev eth0 root
+sudo -s /sbin/tc qdisc add dev eth0 root handle 1: prio
+sudo -s /sbin/tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 20kbit buffer 1600 limit  3000
+sudo -s /sbin/tc qdisc add dev eth0 parent 30:1 handle 31: netem  delay 1000ms 10ms distribution normal loss 10%
+sudo -s /sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst 184.105.247.89/32 flowid 1:3
+
diff --git a/tests/ciena_saos_commands.txt b/tests/ciena_saos_commands.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f3601eb91b705af2e47f62440d5936487ecf0edb
--- /dev/null
+++ b/tests/ciena_saos_commands.txt
@@ -0,0 +1,3 @@
+system set time-offset 7200
+system set timestamp local
+system set time-offset 3600
diff --git a/tests/conftest.py b/tests/conftest.py
index 7a07f61a73f4f968f09f41f03fa6cbb0b467cee2..4ae802cd0d4fe8ac9fccbb72102ed2d50b47b14b 100755
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -41,7 +41,7 @@ def net_connect(request):
 @pytest.fixture()
 def net_connect_cm(request):
     """
-    Create the SSH connection to the remote device using a context manager 
+    Create the SSH connection to the remote device using a context manager
     retrieve the find_prompt() data and close the connection.
     """
     device_under_test = request.config.getoption("test_device")
@@ -65,6 +65,8 @@ def net_connect_slog_wr(request):
     test_devices = parse_yaml(PWD + "/etc/test_devices.yml")
     device = test_devices[device_under_test]
     device["verbose"] = False
+    # Overwrite default session_log location
+    device["session_log"] = "SLOG/cisco881_slog_wr.log"
     device["session_log_record_writes"] = True
     conn = ConnectHandler(**device)
     return conn
@@ -140,17 +142,17 @@ def delete_file_ios(ssh_conn, dest_file_system, dest_file):
     if not dest_file:
         raise ValueError("Invalid dest file specified")
 
-    full_file_name = "{0}/{1}".format(dest_file_system, dest_file)
+    full_file_name = f"{dest_file_system}/{dest_file}"
 
-    cmd = "delete {0}".format(full_file_name)
-    output = ssh_conn.send_command_timing(cmd)
+    cmd = f"delete {full_file_name}"
+    output = ssh_conn.send_command_timing(cmd, delay_factor=2)
     if "Delete" in output and dest_file in output:
-        output += ssh_conn.send_command_timing("\n")
+        output += ssh_conn.send_command_timing("\n", delay_factor=2)
         if "Delete" in output and full_file_name in output and "confirm" in output:
-            output += ssh_conn.send_command_timing("y")
+            output += ssh_conn.send_command_timing("y", delay_factor=2)
             return output
         else:
-            output += ssh_conn.send_command_timing("n")
+            output += ssh_conn.send_command_timing("n", delay_factor=2)
 
     raise ValueError("An error happened deleting file on Cisco IOS")
 
@@ -179,6 +181,14 @@ def delete_file_generic(ssh_conn, dest_file_system, dest_file):
     return output
 
 
+def delete_file_ciena_saos(ssh_conn, dest_file_system, dest_file):
+    """Delete a remote file for a ciena device."""
+    full_file_name = "{}/{}".format(dest_file_system, dest_file)
+    cmd = "file rm {}".format(full_file_name)
+    output = ssh_conn.send_command_timing(cmd, strip_command=False, strip_prompt=False)
+    return output
+
+
 @pytest.fixture(scope="module")
 def scp_fixture(request):
     """
@@ -206,6 +216,9 @@ def scp_fixture(request):
 
     platform = device["device_type"]
     dest_file_system = platform_args[platform]["file_system"]
+    if "ciena_saos" in platform and ssh_conn.username:
+        dest_file_system = f"/tmp/users/{ssh_conn.username}"
+
     source_file = "test9.txt"
     dest_file = "test9.txt"
     local_file = "testx.txt"
@@ -316,7 +329,7 @@ def tcl_fixture(request):
 
 @pytest.fixture(scope="module")
 def ssh_autodetect(request):
-    """Create an SSH autodetect object. 
+    """Create an SSH autodetect object.
 
     return (ssh_conn, real_device_type)
     """
@@ -422,4 +435,9 @@ def get_platform_args():
             "enable_scp": False,
             "delete_file": delete_file_dellos10,
         },
+        "ciena_saos": {
+            "file_system": "/tmp/users/ciena",
+            "enable_scp": False,
+            "delete_file": delete_file_ciena_saos,
+        },
     }
diff --git a/tests/etc/commands.yml.example b/tests/etc/commands.yml.example
index 7f06e5c35b919998691eb820c3029647925ab142..d5ab89f591b456446d392b1a2df15c16d2a052bd 100644
--- a/tests/etc/commands.yml.example
+++ b/tests/etc/commands.yml.example
@@ -58,6 +58,14 @@ juniper:
   rollback: 'rollback 0'
   commit_verification: "run show system commit"
 
+juniper_screenos:
+  version: "get system version"
+  basic: "get route"
+  extended_output: "get config" # requires paging to be disabled
+  config:
+    - 'set alias test "test"'
+  config_verification: "get config | inc alias"
+
 fortinet:
   version: "get system status"
   basic: "get system interface physical"
@@ -274,3 +282,15 @@ keymile_nos:
   save_config_confirm: True
   save_config_response: '[OK]'
 
+ruijie_os:
+  version: "show version"
+  basic: "show ip interface brief"
+  extended_output: "show version"
+  config:
+    - "logging buffered 20000"
+    - "no logging console"
+    - "logging buffered 20010"
+  config_verification: "show run | inc logging buffer"
+  save_config_cmd: 'write'
+  save_config_confirm: False
+  save_config_response: 'OK'
diff --git a/tests/etc/responses.yml.example b/tests/etc/responses.yml.example
index 1da7517e88178f09a8b91862dddbba9c31eb5e3f..88132f0ff3e8569b8d1153a79ab1101bba758e42 100644
--- a/tests/etc/responses.yml.example
+++ b/tests/etc/responses.yml.example
@@ -21,6 +21,16 @@ juniper:
   cmd_response_final: 'archive size 120k files 3'
   commit_comment: 'Unit test on commit with comment'
 
+juniper_screenos:
+  base_prompt: "ssg5-serial-"
+  router_prompt: "ssg5-serial->"
+  enable_prompt: "ssg5-serial->"
+  interface_ip: 100.65.1.1
+  multiple_line_output: 'Total Config size'
+  version_banner: 'Version: 6.3.0.1.0.0.0.0'
+  cmd_response_init: ""
+  cmd_response_final: 'set alias test'
+
 paloalto_panos:
   base_prompt: ntc@pa1
   router_prompt: ntc@pa1>
@@ -213,3 +223,13 @@ keymile_nos:
   interface_ip: 1.2.3.5 
   version_banner: "NOS version 2.09 #0001"
   multiple_line_output: "Interface br328"
+
+ruijie_os:
+  base_prompt: Ruijie
+  router_prompt : Ruijie>
+  enable_prompt: Ruijie#
+  interface_ip: 172.30.31.101
+  version_banner: "Ruijie Networks"
+  multiple_line_output: ""
+  file_check_cmd: "logging buffered 8880"
+  save_config: 'OK'
diff --git a/tests/etc/test_devices.yml.example b/tests/etc/test_devices.yml.example
index 903c99dd4f08e879c1236dc21bdf8a9c54f7dba0..8abb009c52dd5a2648375fd1e6e6e9dbfcd61abd 100644
--- a/tests/etc/test_devices.yml.example
+++ b/tests/etc/test_devices.yml.example
@@ -38,6 +38,12 @@ juniper:
   username: admin
   password: juniper123
 
+juniper_screenos:
+  device_type: juniper_screenos
+  ip: 100.65.1.1
+  username: netscreen
+  password: netscreen
+
 paloalto_panos:
   device_type: paloalto_panos
   ip: 10.10.10.15
@@ -171,3 +177,10 @@ keymile_nos:
   ip: 1.2.3.5
   username: TEST
   password: TEST
+
+ruijie_os:
+  device_type: ruijie_os
+  ip: 1.1.1.1
+  username: ruijie
+  password: ruijie
+  secret: ruijie
diff --git a/tests/my_test.sh b/tests/my_test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e15414a67cc4745814bc538f998121aaf3ba9b92
--- /dev/null
+++ b/tests/my_test.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+for i in `seq 5` ; do 
+    py.test -s -v test_netmiko_scp.py --test_device cisco3 --pdb
+    py.test -s -v test_netmiko_show.py --test_device cisco3 --pdb
+    py.test -s -v test_netmiko_config.py --test_device cisco3 --pdb
+    py.test -s -v test_netmiko_config_acl.py --test_device cisco3 --pdb
+    if [ "$?" != "0" ]; then
+        break
+    fi
+done
+#    py.test -s -v test_netmiko_show.py --test_device cisco3
+#    py.test -s -v test_netmiko_show.py --test_device arista_sw
diff --git a/tests/remove_delay.sh b/tests/remove_delay.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4619b5d7fa6cec78bf2892a583f4efe90b790dd4
--- /dev/null
+++ b/tests/remove_delay.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+# Remove delay for cisco3; must be root or sudo to execute
+sudo -s /sbin/tc qdisc del dev eth0 root
diff --git a/tests/test_cisco_ios_serial.py b/tests/test_cisco_ios_serial.py
index bafafbf1f8d51362a5d5fdf2207ec48623c5b50f..f6c422dc8435c6581655d1cc0f40a99c3a62d070 100644
--- a/tests/test_cisco_ios_serial.py
+++ b/tests/test_cisco_ios_serial.py
@@ -3,8 +3,6 @@
 This will run an command via serial on an cisco ios switch and so
 serial cable must be attached to the device
 """
-
-from __future__ import print_function
 from netmiko import ConnectHandler
 import serial
 
diff --git a/tests/test_cisco_w_key.py b/tests/test_cisco_w_key.py
index c8034b0104a8ee366db7c477aca3199c798932e7..be45bde23330e60d4171094c3ddf9321eeabb4a2 100755
--- a/tests/test_cisco_w_key.py
+++ b/tests/test_cisco_w_key.py
@@ -1,6 +1,4 @@
 #!/usr/bin/env python
-
-from __future__ import print_function
 from netmiko import ConnectHandler
 from os import path
 
diff --git a/tests/test_enterasys_switch.py b/tests/test_enterasys_switch.py
index c33dc3956feb764b98da1f1c947dfe3a1b83c99d..21cd55349ccc89311cd39e7877030c0f33af3e44 100755
--- a/tests/test_enterasys_switch.py
+++ b/tests/test_enterasys_switch.py
@@ -3,8 +3,6 @@
 This will run an ssh command successfully on an enterasys SSA and so SSH must
 be enabled on the device
 """
-
-from __future__ import print_function
 from netmiko import ConnectHandler
 
 
diff --git a/tests/test_extreme_switch.py b/tests/test_extreme_switch.py
index e00bcb07b767954f862fe37410c468656be9efaa..5d2089a964c57509c6e6cbdad808d2e7a6b178d7 100755
--- a/tests/test_extreme_switch.py
+++ b/tests/test_extreme_switch.py
@@ -3,8 +3,6 @@
 This will run an ssh command successfully on an extreme switch and so SSH must
 be enabled on the device
 """
-
-from __future__ import print_function
 from netmiko import ConnectHandler
 
 
diff --git a/tests/test_import_netmiko.py b/tests/test_import_netmiko.py
index 8a9807a105e7ba15a659720f2b0e122b587176ee..bf71c9212c0532d7eeea371f10a2c12be0f648f1 100644
--- a/tests/test_import_netmiko.py
+++ b/tests/test_import_netmiko.py
@@ -1,4 +1,4 @@
-from netmiko import ConnectHandler
+from netmiko import ConnectHandler  # noqa
 
 
 def test_placeholder():
diff --git a/tests/test_juniper_screenos.sh b/tests/test_juniper_screenos.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0148c6c6f268ff7050bb7c1b2b7abafaf2fb807a
--- /dev/null
+++ b/tests/test_juniper_screenos.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+RETURN_CODE=0
+
+# Exit on the first test failure and set RETURN_CODE = 1
+echo "Starting tests...good luck:" \
+&& py.test -v test_netmiko_show.py --test_device juniper_screenos \
+&& py.test -v test_netmiko_config.py --test_device juniper_screenos \
+|| RETURN_CODE=1
+
+exit $RETURN_CODE
diff --git a/tests/test_linux.py b/tests/test_linux.py
index f6a4a50326bcf3ae3754e697cf48ba54b662dc86..4926fd96a8ad78693e1411330d9ffb9a2de9a195 100755
--- a/tests/test_linux.py
+++ b/tests/test_linux.py
@@ -1,6 +1,4 @@
 #!/usr/bin/env python
-
-from __future__ import print_function
 from netmiko import ConnectHandler
 
 
diff --git a/tests/test_netmiko_autodetect.py b/tests/test_netmiko_autodetect.py
index 72cfb2f7c719dc7d70ad2cbdecccd0ff2cb6a215..7051ee14a08df798ee1c1f7b92550d895df6f2d2 100755
--- a/tests/test_netmiko_autodetect.py
+++ b/tests/test_netmiko_autodetect.py
@@ -1,9 +1,4 @@
 #!/usr/bin/env python
-from __future__ import print_function
-from __future__ import unicode_literals
-import time
-
-
 def test_ssh_connect(ssh_autodetect):
     """Verify the connection was established successfully."""
     net_conn, real_device_type = ssh_autodetect
diff --git a/tests/test_netmiko_commit.py b/tests/test_netmiko_commit.py
index f748aa7805daad0ebf6c10e12c341455a23ea816..4442df9ab952e09afa22ea0f214fb1edbaaa0237 100755
--- a/tests/test_netmiko_commit.py
+++ b/tests/test_netmiko_commit.py
@@ -90,7 +90,7 @@ def test_config_mode(net_connect, commands, expected_responses):
     Test enter config mode
     """
     net_connect.config_mode()
-    assert net_connect.check_config_mode() == True
+    assert net_connect.check_config_mode() is True
 
 
 def test_commit_base(net_connect, commands, expected_responses):
@@ -263,7 +263,7 @@ def test_commit_comment(net_connect, commands, expected_responses):
     if net_connect.device_type == "cisco_xr":
         commit_comment = tmp_output
     else:
-        commit_comment = tmp_output.split("\n")[2]
+        commit_comment = tmp_output.strip().split("\n")[1]
     assert expected_responses.get("commit_comment") in commit_comment.strip()
 
 
@@ -390,7 +390,7 @@ def test_exit_config_mode(net_connect, commands, expected_responses):
     """
     net_connect.exit_config_mode()
     time.sleep(1)
-    assert net_connect.check_config_mode() == False
+    assert net_connect.check_config_mode() is False
 
 
 def test_disconnect(net_connect, commands, expected_responses):
diff --git a/tests/test_netmiko_config.py b/tests/test_netmiko_config.py
index 1281a2744b02003be8a8662bd2a471c7d9e1c095..da36d8e8ae9bbe867f345988d628807ab28d18bf 100755
--- a/tests/test_netmiko_config.py
+++ b/tests/test_netmiko_config.py
@@ -1,8 +1,4 @@
 #!/usr/bin/env python
-from __future__ import print_function
-from __future__ import unicode_literals
-
-
 def test_ssh_connect(net_connect, commands, expected_responses):
     """
     Verify the connection was established successfully
@@ -22,15 +18,18 @@ def test_enable_mode(net_connect, commands, expected_responses):
         enable_prompt = net_connect.find_prompt()
         assert enable_prompt == expected_responses["enable_prompt"]
     except AttributeError:
-        assert True == True
+        assert True
 
 
 def test_config_mode(net_connect, commands, expected_responses):
     """
     Test enter config mode
     """
-    net_connect.config_mode()
-    assert net_connect.check_config_mode() == True
+    # Behavior for devices with no config mode is to return null string
+    if net_connect.config_mode() != "":
+        assert net_connect.check_config_mode() is True
+    else:
+        assert True
 
 
 def test_exit_config_mode(net_connect, commands, expected_responses):
@@ -38,7 +37,7 @@ def test_exit_config_mode(net_connect, commands, expected_responses):
     Test exit config mode
     """
     net_connect.exit_config_mode()
-    assert net_connect.check_config_mode() == False
+    assert net_connect.check_config_mode() is False
 
 
 def test_command_set(net_connect, commands, expected_responses):
diff --git a/tests/test_netmiko_config_acl.py b/tests/test_netmiko_config_acl.py
new file mode 100755
index 0000000000000000000000000000000000000000..82a3cd2910d0b7c73a093c1f36835839e71f17ea
--- /dev/null
+++ b/tests/test_netmiko_config_acl.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+import re
+import pytest
+from ipaddress import ip_address
+
+
+def test_large_acl(net_connect, acl_entries=100):
+    """
+    Test creating an ACL with tons of lines
+    """
+
+    platforms = {
+        "cisco_xe": {
+            "base_cmd": "ip access-list extended netmiko_test_large_acl",
+            "verify_cmd": "show ip access-lists netmiko_test_large_acl",
+            "offset": 4,
+        },
+        "cisco_ios": {
+            "base_cmd": "ip access-list extended netmiko_test_large_acl",
+            "verify_cmd": "show ip access-lists netmiko_test_large_acl",
+            "offset": 4,
+        },
+        "cisco_xr": {
+            "base_cmd": "ipv4 access-list netmiko_test_large_acl",
+            "verify_cmd": "show access-lists netmiko_test_large_acl",
+            "offset": 3,
+        },
+        "cisco_nxos": {
+            "base_cmd": "ip access-list netmiko_test_large_acl",
+            "verify_cmd": "show ip access-lists netmiko_test_large_acl",
+            "offset": 4,
+        },
+    }
+
+    if net_connect.device_type not in platforms.keys():
+        pytest.skip("Platform not supported for ACL test")
+    cmd = platforms[net_connect.device_type]["base_cmd"]
+    verify_cmd = platforms[net_connect.device_type]["verify_cmd"]
+    offset = platforms[net_connect.device_type]["offset"]
+    net_connect.send_config_set(f"no {cmd}")
+    if "cisco_xr" in net_connect.device_type:
+        net_connect.commit()
+        net_connect.exit_config_mode()
+    cfg_lines = [cmd]
+
+    # Generate sequence of ACL entries
+    for i in range(1, acl_entries + 1):
+        if "cisco_xr" in net_connect.device_type:
+            cmd = f"permit ipv4 host {ip_address('192.168.0.0') + i} any"
+        else:
+            cmd = f"permit ip host {ip_address('192.168.0.0') + i} any"
+        cfg_lines.append(cmd)
+
+    result = net_connect.send_config_set(cfg_lines)
+    if "cisco_xr" in net_connect.device_type:
+        net_connect.commit()
+        net_connect.exit_config_mode()
+
+    # send_config_set should return same num lines + offset lines for entering/exiting cfg-mode
+    # NX-OS is will have more than one newline (per line)
+    result_list = re.split(r"\n+", result)
+    assert len(result_list) == len(cfg_lines) + offset
+
+    # Check that length of lines in show of the acl matches lines configured
+    verify = net_connect.send_command(verify_cmd)
+    verify_list = re.split(r"\n+", verify.strip())
+    # IOS-XR has a timestamp on the show command
+    if "UTC" in verify_list[0]:
+        verify_list.pop(0)
+    assert len(verify_list) == len(cfg_lines)
+    net_connect.send_config_set(f"no {cmd}")
+    if "cisco_xr" in net_connect.device_type:
+        net_connect.commit()
+        net_connect.exit_config_mode()
+    net_connect.disconnect()
diff --git a/tests/test_netmiko_save.py b/tests/test_netmiko_save.py
index 4fe25be11faf8af4f91d4f3984919c0f3a876a34..1b89155c0750cf3bf7e930826d7bfdb2fc231358 100755
--- a/tests/test_netmiko_save.py
+++ b/tests/test_netmiko_save.py
@@ -1,6 +1,4 @@
 #!/usr/bin/env python
-from __future__ import print_function
-from __future__ import unicode_literals
 
 
 def test_save_base(net_connect, commands, expected_responses):
diff --git a/tests/test_netmiko_scp.py b/tests/test_netmiko_scp.py
index 925e0c5842cb35805f23947db8c242a8145a9225..9852a10375e726d437030639f72526599cd01e8a 100755
--- a/tests/test_netmiko_scp.py
+++ b/tests/test_netmiko_scp.py
@@ -1,25 +1,17 @@
 #!/usr/bin/env python
-from __future__ import print_function
-from __future__ import unicode_literals
-import time
-import sys
-import os
 import pytest
-from datetime import datetime
-from getpass import getpass
-from netmiko import ConnectHandler, FileTransfer
 from netmiko import file_transfer
 
-###def test_enable_scp(scp_fixture):
-###    ssh_conn, scp_transfer = scp_fixture
-###
-###    scp_transfer.disable_scp()
-###    output = ssh_conn.send_command_expect("show run | inc scp")
-###    assert 'ip scp server enable' not in output
-###
-###    scp_transfer.enable_scp()
-###    output = ssh_conn.send_command_expect("show run | inc scp")
-###    assert 'ip scp server enable' in output
+# def test_enable_scp(scp_fixture):
+#    ssh_conn, scp_transfer = scp_fixture
+#
+#    scp_transfer.disable_scp()
+#    output = ssh_conn.send_command_expect("show run | inc scp")
+#    assert 'ip scp server enable' not in output
+#
+#    scp_transfer.enable_scp()
+#    output = ssh_conn.send_command_expect("show run | inc scp")
+#    assert 'ip scp server enable' in output
 
 
 def test_scp_put(scp_fixture):
@@ -28,7 +20,7 @@ def test_scp_put(scp_fixture):
         assert False
     else:
         scp_transfer.put_file()
-        assert scp_transfer.check_file_exists() == True
+        assert scp_transfer.check_file_exists() is True
 
 
 def test_remote_space_available(scp_fixture, expected_responses):
@@ -45,10 +37,10 @@ def test_local_space_available(scp_fixture):
 
 def test_verify_space_available_put(scp_fixture):
     ssh_conn, scp_transfer = scp_fixture
-    assert scp_transfer.verify_space_available() == True
+    assert scp_transfer.verify_space_available() is True
     # intentional make there not be enough space available
     scp_transfer.file_size = 100000000000
-    assert scp_transfer.verify_space_available() == False
+    assert scp_transfer.verify_space_available() is False
 
 
 def test_remote_file_size(scp_fixture):
@@ -65,7 +57,7 @@ def test_md5_methods(scp_fixture):
 
     remote_md5 = scp_transfer.remote_md5()
     assert remote_md5 == md5_value
-    assert scp_transfer.compare_md5() == True
+    assert scp_transfer.compare_md5() is True
 
 
 def test_disconnect(scp_fixture):
@@ -76,10 +68,10 @@ def test_disconnect(scp_fixture):
 
 def test_verify_space_available_get(scp_fixture_get):
     ssh_conn, scp_transfer = scp_fixture_get
-    assert scp_transfer.verify_space_available() == True
+    assert scp_transfer.verify_space_available() is True
     # intentional make there not be enough space available
-    scp_transfer.file_size = 100000000000
-    assert scp_transfer.verify_space_available() == False
+    scp_transfer.file_size = 100000000000000
+    assert scp_transfer.verify_space_available() is False
 
 
 def test_scp_get(scp_fixture_get):
@@ -101,7 +93,7 @@ def test_md5_methods_get(scp_fixture_get):
     md5_value = "d8df36973ff832b564ad84642d07a261"
     local_md5 = scp_transfer.file_md5("test9.txt")
     assert local_md5 == md5_value
-    assert scp_transfer.compare_md5() == True
+    assert scp_transfer.compare_md5() is True
 
 
 def test_disconnect_get(scp_fixture_get):
diff --git a/tests/test_netmiko_session_log.py b/tests/test_netmiko_session_log.py
index 381b9c80643699019cfd21774162f544f9231778..7282bd2e1fce8da2d8fc337c8bd6c02b73e0a66c 100755
--- a/tests/test_netmiko_session_log.py
+++ b/tests/test_netmiko_session_log.py
@@ -1,11 +1,8 @@
 #!/usr/bin/env python
-from __future__ import print_function
-from __future__ import unicode_literals
 import time
 import hashlib
 import io
 from netmiko import ConnectHandler
-from netmiko.py23_compat import bufferedio_types
 
 
 def calc_md5(file_name=None, contents=None):
@@ -18,7 +15,7 @@ def calc_md5(file_name=None, contents=None):
     else:
         raise ValueError("Most specify either file_name or contents")
 
-    return hashlib.md5(contents).hexdigest()
+    return hashlib.md5(contents.strip()).hexdigest()
 
 
 def read_session_log(session_file, append=False):
@@ -73,7 +70,7 @@ def test_session_log_write(net_connect_slog_wr, commands, expected_responses):
     session_action(net_connect_slog_wr, command)
 
     compare_file = expected_responses["compare_log_wr"]
-    session_file = expected_responses["session_log"]
+    session_file = expected_responses["session_log_wr"]
     session_log_md5(session_file, compare_file)
 
 
@@ -122,7 +119,7 @@ def test_session_log_secrets(device_slog):
     conn._write_session_log("This is my password {}\n".format(conn.password))
     conn._write_session_log("This is my secret {}\n".format(conn.secret))
 
-    if not isinstance(conn.session_log, bufferedio_types):
+    if not isinstance(conn.session_log, io.BufferedIOBase):
         with open(conn.session_log.name, "r") as f:
             session_log = f.read()
         if conn.password:
diff --git a/tests/test_netmiko_show.py b/tests/test_netmiko_show.py
index 96e587e47e7b81c5136cb8811d5d27b6e3bc7f57..f8484aa5844b84cd050a8c95c980507e65999117 100755
--- a/tests/test_netmiko_show.py
+++ b/tests/test_netmiko_show.py
@@ -14,12 +14,14 @@ test_clear_buffer: clear text buffer
 test_enable_mode: verify enter enable mode
 test_disconnect: cleanly disconnect the SSH session
 """
-
-from __future__ import print_function
-from __future__ import unicode_literals
 import pytest
 import time
 
+# import logging
+
+# logging.basicConfig(filename="test.log", level=logging.DEBUG)
+# logger = logging.getLogger("netmiko")
+
 
 def test_disable_paging(net_connect, commands, expected_responses):
     """Verify paging is disabled by looking for string after when paging would normally occur."""
@@ -28,11 +30,6 @@ def test_disable_paging(net_connect, commands, expected_responses):
         net_connect.send_command("clear logging")
     multiple_line_output = net_connect.send_command(commands["extended_output"])
     assert expected_responses["multiple_line_output"] in multiple_line_output
-    if net_connect.device_type == "arista_eos":
-        # Arista output is slow and has router-name in output
-        time.sleep(5)
-        net_connect.clear_buffer()
-        net_connect.send_command("clear logging", expect_string="#")
 
 
 def test_ssh_connect(net_connect, commands, expected_responses):
@@ -53,6 +50,9 @@ def test_send_command_timing(net_connect, commands, expected_responses):
     net_connect.clear_buffer()
     show_ip = net_connect.send_command_timing(commands["basic"])
     assert expected_responses["interface_ip"] in show_ip
+    # Force verification of command echo
+    show_ip = net_connect.send_command_timing(commands["basic"], cmd_echo=True)
+    assert expected_responses["interface_ip"] in show_ip
 
 
 def test_send_command(net_connect, commands, expected_responses):
@@ -63,6 +63,17 @@ def test_send_command(net_connect, commands, expected_responses):
     assert expected_responses["interface_ip"] in show_ip_alt
 
 
+def test_send_command_juniper(net_connect, commands, expected_responses):
+    """Verify Juniper complete on space is disabled."""
+    # If complete on space is enabled will get re-written to "show ipv6 neighbors"
+    if net_connect.device_type == "juniper_junos":
+        net_connect.write_channel("show ip neighbors\n")
+        output = net_connect.read_until_prompt()
+        assert "show ip neighbors" in output
+    else:
+        assert pytest.skip()
+
+
 def test_send_command_textfsm(net_connect, commands, expected_responses):
     """Verify a command can be sent down the channel successfully using send_command method."""
 
@@ -108,7 +119,7 @@ def test_send_command_genie(net_connect, commands, expected_responses):
         "cisco_nxos",
         "cisco_asa",
     ]:
-        assert pytest.skip("TextFSM/ntc-templates not supported on this platform")
+        assert pytest.skip("Genie not supported on this platform")
     else:
         time.sleep(1)
         net_connect.clear_buffer()
@@ -146,8 +157,8 @@ def test_normalize_linefeeds(net_connect, commands, expected_responses):
     """Ensure no '\r\n' sequences."""
     show_version = net_connect.send_command_timing(commands["version"])
     show_version_alt = net_connect.send_command(commands["version"])
-    assert not "\r\n" in show_version
-    assert not "\r\n" in show_version_alt
+    assert "\r\n" not in show_version
+    assert "\r\n" not in show_version_alt
 
 
 def test_clear_buffer(net_connect, commands, expected_responses):
@@ -173,7 +184,7 @@ def test_enable_mode(net_connect, commands, expected_responses):
         enable_prompt = net_connect.find_prompt()
         assert enable_prompt == expected_responses["enable_prompt"]
     except AttributeError:
-        assert True == True
+        assert True is True
 
 
 def test_disconnect(net_connect, commands, expected_responses):
diff --git a/tests/test_netmiko_tcl.py b/tests/test_netmiko_tcl.py
index 387bedeae964d41cb60f2af844550705faf68b06..ccb08e961153c0991fa9857a36dc6ccd6ed7ecaf 100755
--- a/tests/test_netmiko_tcl.py
+++ b/tests/test_netmiko_tcl.py
@@ -1,14 +1,4 @@
 #!/usr/bin/env python
-from __future__ import print_function
-from __future__ import unicode_literals
-import time
-import sys
-import os
-from datetime import datetime
-from getpass import getpass
-from netmiko import ConnectHandler, InLineTransfer
-
-
 def test_tcl_put(tcl_fixture):
     ssh_conn, transfer = tcl_fixture
     if transfer.check_file_exists():
@@ -17,7 +7,7 @@ def test_tcl_put(tcl_fixture):
         transfer._enter_tcl_mode()
         transfer.put_file()
         transfer._exit_tcl_mode()
-        assert transfer.check_file_exists() == True
+        assert transfer.check_file_exists() is True
 
 
 def test_remote_space_available(tcl_fixture):
@@ -28,10 +18,10 @@ def test_remote_space_available(tcl_fixture):
 
 def test_verify_space_available_put(tcl_fixture):
     ssh_conn, transfer = tcl_fixture
-    assert transfer.verify_space_available() == True
+    assert transfer.verify_space_available() is True
     # intentional make there not be enough space available
     transfer.file_size = 1000000000
-    assert transfer.verify_space_available() == False
+    assert transfer.verify_space_available() is False
 
 
 def test_remote_file_size(tcl_fixture):
@@ -46,7 +36,7 @@ def test_md5_methods(tcl_fixture):
 
     remote_md5 = transfer.remote_md5()
     assert remote_md5 == md5_value
-    assert transfer.compare_md5() == True
+    assert transfer.compare_md5() is True
 
 
 def test_disconnect(tcl_fixture):
diff --git a/tests/test_suite_alt.sh b/tests/test_suite_alt.sh
index 67e345fe92c2fe7e1375d7bbd14b466778849338..ba7e03f8229b497ce1978259fe76af0c984a012c 100755
--- a/tests/test_suite_alt.sh
+++ b/tests/test_suite_alt.sh
@@ -8,16 +8,19 @@ echo "Starting tests...good luck:" \
 && py.test -v test_netmiko_scp.py --test_device cisco3 \
 && py.test -v test_netmiko_show.py --test_device cisco3 \
 && py.test -v test_netmiko_config.py --test_device cisco3 \
+&& py.test -v test_netmiko_config_acl.py --test_device cisco3 \
 \
 && echo "Cisco IOS SSH (including SCP) using key auth" \
 && py.test -v test_netmiko_tcl.py --test_device cisco881_key \
 && py.test -v test_netmiko_show.py --test_device cisco881_key \
 && py.test -v test_netmiko_config.py --test_device cisco881_key \
+&& py.test -v test_netmiko_config_acl.py --test_device cisco881_key \
 \
 && echo "Cisco IOS SSH (including SCP)" \
 && py.test -v test_netmiko_tcl.py --test_device cisco881 \
 && py.test -v test_netmiko_show.py --test_device cisco881 \
 && py.test -v test_netmiko_config.py --test_device cisco881 \
+&& py.test -v test_netmiko_config_acl.py --test_device cisco881 \
 && py.test -v test_netmiko_session_log.py --test_device cisco881_slog \
 \
 && echo "Cisco IOS SSH fast_cli (including SCP)" \
@@ -28,14 +31,17 @@ echo "Starting tests...good luck:" \
 && echo "Cisco IOS using SSH config with SSH Proxy" \
 && py.test -v test_netmiko_show.py --test_device cisco881_ssh_config \
 && py.test -v test_netmiko_config.py --test_device cisco881_ssh_config \
+&& py.test -v test_netmiko_config_acl.py --test_device cisco881_ssh_config \
 \
 && echo "Cisco IOS using SSH config with SSH Proxy using ProxyJump" \
 && py.test -v test_netmiko_show.py --test_device cisco881_ssh_proxyjump \
 && py.test -v test_netmiko_config.py --test_device cisco881_ssh_proxyjump \
+&& py.test -v test_netmiko_config_acl.py --test_device cisco881_ssh_proxyjump \
 \
 && echo "Cisco IOS telnet" \
 && py.test -v test_netmiko_show.py --test_device cisco881_telnet \
 && py.test -v test_netmiko_config.py --test_device cisco881_telnet \
+&& py.test -v test_netmiko_config_acl.py --test_device cisco881_telnet \
 \
 && echo "Cisco SG300" \
 && py.test -v test_netmiko_show.py --test_device cisco_s300 \
@@ -45,6 +51,7 @@ echo "Starting tests...good luck:" \
 && py.test -v test_netmiko_scp.py --test_device arista_sw \
 && py.test -v test_netmiko_show.py --test_device arista_sw \
 && py.test -v test_netmiko_config.py --test_device arista_sw \
+&& py.test -v test_netmiko_config_acl.py --test_device arista_sw \
 \
 && echo "Juniper" \
 && py.test -v test_netmiko_scp.py --test_device juniper_srx \
diff --git a/tests/test_utils.py b/tests/test_utils.py
index d4769831a6644e3d9d595741f8d3415afa0d0331..719a96cf2ec7b43ac03a936060466a53f7c5545b 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -2,9 +2,6 @@
 """
 Implement common functions for tests
 """
-from __future__ import print_function
-from __future__ import unicode_literals
-
 import io
 import sys
 
diff --git a/tests/unit/test_base_connection.py b/tests/unit/test_base_connection.py
index daa9e77657080b23a1468dd102928f6365a01b97..81d1af3cc5cd04c15ba0cf46792c880b8076f33b 100755
--- a/tests/unit/test_base_connection.py
+++ b/tests/unit/test_base_connection.py
@@ -4,7 +4,7 @@ import time
 from os.path import dirname, join
 from threading import Lock
 
-from netmiko import NetMikoTimeoutException
+from netmiko import NetmikoTimeoutException
 from netmiko.base_connection import BaseConnection
 
 RESOURCE_FOLDER = join(dirname(dirname(__file__)), "etc")
@@ -18,20 +18,20 @@ class FakeBaseConnection(BaseConnection):
 
 
 def test_timeout_exceeded():
-    """Raise NetMikoTimeoutException if waiting too much"""
+    """Raise NetmikoTimeoutException if waiting too much"""
     connection = FakeBaseConnection(session_timeout=10)
     start = time.time() - 11
     try:
         connection._timeout_exceeded(start)
-    except NetMikoTimeoutException as exc:
-        assert isinstance(exc, NetMikoTimeoutException)
+    except NetmikoTimeoutException as exc:
+        assert isinstance(exc, NetmikoTimeoutException)
         return
 
     assert False
 
 
 def test_timeout_not_exceeded():
-    """Do not raise NetMikoTimeoutException if not waiting too much"""
+    """Do not raise NetmikoTimeoutException if not waiting too much"""
     connection = FakeBaseConnection(session_timeout=10)
     start = time.time()
     assert not connection._timeout_exceeded(start)
@@ -59,6 +59,7 @@ def test_use_ssh_file():
         auth_timeout=None,
         banner_timeout=10,
         ssh_config_file=join(RESOURCE_FOLDER, "ssh_config"),
+        sock=None,
     )
 
     connect_dict = connection._connect_params_dict()
@@ -102,6 +103,7 @@ def test_use_ssh_file_proxyjump():
         auth_timeout=None,
         banner_timeout=10,
         ssh_config_file=join(RESOURCE_FOLDER, "ssh_config_proxyjump"),
+        sock=None,
     )
 
     connect_dict = connection._connect_params_dict()
@@ -144,6 +146,7 @@ def test_connect_params_dict():
         auth_timeout=None,
         banner_timeout=10,
         ssh_config_file=None,
+        sock=None,
     )
 
     expected = {
@@ -159,6 +162,7 @@ def test_connect_params_dict():
         "passphrase": None,
         "auth_timeout": None,
         "banner_timeout": 10,
+        "sock": None,
     }
     result = connection._connect_params_dict()
     assert result == expected
@@ -382,7 +386,7 @@ def lock_unlock_timeout(timeout=0):
 
     try:
         connection._lock_netmiko_session()
-    except NetMikoTimeoutException:
+    except NetmikoTimeoutException:
         return
     finally:
         assert connection._session_locker.locked()
diff --git a/tests/unit/test_utilities.py b/tests/unit/test_utilities.py
index 2f97b8c35e30d8588effc5490f2c4cbb13843120..a6fbfc509f3f0eefd5da02451e0ed95a10885f06 100755
--- a/tests/unit/test_utilities.py
+++ b/tests/unit/test_utilities.py
@@ -4,6 +4,8 @@ import os
 from os.path import dirname, join, relpath
 import sys
 
+import pytest
+
 from netmiko import utilities
 from netmiko._textfsm import _clitable as clitable
 
@@ -37,7 +39,7 @@ def test_invalid_yaml_file():
 def test_find_cfg_file():
     """
     Search for netmiko_tools config file in the following order:
- 
+
     NETMIKO_TOOLS_CFG environment variable
     Current directory
     Home directory
@@ -149,7 +151,7 @@ def test_bytes_to_bytes():
 def test_invalid_data_to_bytes():
     """Convert an invalid data type to bytes"""
     try:
-        utilities.write_bytes(456779)
+        utilities.write_bytes(456_779)
     except ValueError as exc:
         assert isinstance(exc, ValueError)
         return
@@ -187,7 +189,7 @@ def test_clitable_to_dict():
     assert result == [{"model": "4500"}]
 
 
-def test_get_structured_data():
+def test_textfsm_w_index():
     """Convert raw CLI output to structured data using TextFSM template"""
     os.environ["NET_TEXTFSM"] = RESOURCE_FOLDER
     raw_output = "Cisco IOS Software, Catalyst 4500 L3 Switch Software"
@@ -197,7 +199,7 @@ def test_get_structured_data():
     assert result == [{"model": "4500"}]
 
 
-def test_get_structured_data_relative_path():
+def test_textfsm_index_relative_path():
     """Test relative path for textfsm ntc directory"""
     os.environ["NET_TEXTFSM"] = RELATIVE_RESOURCE_FOLDER
     raw_output = "Cisco IOS Software, Catalyst 4500 L3 Switch Software"
@@ -207,12 +209,60 @@ def test_get_structured_data_relative_path():
     assert result == [{"model": "4500"}]
 
 
+def test_textfsm_direct_template():
+    """Convert raw CLI output to structured data using TextFSM template (no index)."""
+    raw_output = "Cisco IOS Software, Catalyst 4500 L3 Switch Software"
+    result = utilities.get_structured_data(
+        raw_output,
+        platform="cisco_ios",
+        command="show version",
+        template=f"{RESOURCE_FOLDER}/cisco_ios_show_version.template",
+    )
+    assert result == [{"model": "4500"}]
+
+    # Should also work with no-platform or command
+    result = utilities.get_structured_data(
+        raw_output, template=f"{RESOURCE_FOLDER}/cisco_ios_show_version.template"
+    )
+    assert result == [{"model": "4500"}]
+
+
+def test_textfsm_failed_parsing():
+    """Verify raw_output is returned if TextFSM template parsing fails."""
+    raw_output = "This is not 'show version' output"
+    result = utilities.get_structured_data(
+        raw_output,
+        platform="cisco_ios",
+        command="show version",
+        template=f"{RESOURCE_FOLDER}/nothinghere",
+    )
+    assert result == raw_output
+
+
+def test_textfsm_missing_template():
+    """Verify raw_output is returned if TextFSM template is missing."""
+    raw_output = "Cisco IOS Software, Catalyst 4500 L3 Switch Software"
+    result = utilities.get_structured_data(
+        raw_output,
+        platform="cisco_ios",
+        command="show version",
+        template=f"{RESOURCE_FOLDER}/nothinghere",
+    )
+    assert result == raw_output
+
+
+@pytest.mark.skipif(
+    sys.version_info >= (3, 8),
+    reason="The genie package is not available for Python 3.8 yet",
+)
 def test_get_structured_data_genie():
     """Convert raw CLI output to structured data using Genie"""
-    if not sys.version_info >= (3, 4):
-        assert True
-        return
-    raw_output = """Cisco IOS Software, C3560CX Software (C3560CX-UNIVERSALK9-M), Version 15.2(4)E7, RELEASE SOFTWARE (fc2)
+
+    header_line = (
+        "Cisco IOS Software, C3560CX Software (C3560CX-UNIVERSALK9-M), "
+        "Version 15.2(4)E7, RELEASE SOFTWARE (fc2)"
+    )
+    raw_output = """
 Technical Support: http://www.cisco.com/techsupport
 Copyright (c) 1986-2018 by Cisco Systems, Inc.
 Compiled Tue 18-Sep-18 13:20 by prod_rel_team
@@ -278,6 +328,7 @@ Switch Ports Model                     SW Version            SW Image
 
 Configuration register is 0xF
 """
+    raw_output = header_line + raw_output
     result = utilities.get_structured_data_genie(
         raw_output, platform="cisco_xe", command="show version"
     )
diff --git a/tox.ini b/tox.ini
index 3a670c4e7e116ad7ce80142d12674e3e88b53d09..2b443c1203c38e04adebe9d3256222892de2e1e4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,15 @@
 [tox]
-envlist = py27,py35,py36,py37
+envlist = py3{6,7,8},black,pylama
+skip_missing_interpreters = true
+
+[travis]
+python =
+    3.6: py36,black,pylama
+
+[travis:env]
+TRAVIS_BUILD_STAGE_NAME =
+    Lint: black,pylama
+    Test: py3{6,7,8}
 
 [testenv]
 deps =