diff --git a/Cargo.lock b/Cargo.lock
index 0562121dbb7475db079cb6639d03a73328a04334..cd656d7fc81ca1c86298bdedbb1efbbbd52f8328 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -563,7 +563,7 @@ dependencies = [
 [[package]]
 name = "cyw43"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "atomic-polyfill 0.1.11",
  "cortex-m",
@@ -571,9 +571,9 @@ dependencies = [
  "defmt",
  "embassy-futures",
  "embassy-net-driver-channel",
- "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad)",
+ "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4)",
  "embassy-time",
- "embedded-hal 1.0.0-alpha.10",
+ "embedded-hal 1.0.0-alpha.11",
  "futures",
  "num_enum",
 ]
@@ -581,7 +581,7 @@ dependencies = [
 [[package]]
 name = "cyw43-pio"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "cyw43",
  "embassy-rp",
@@ -858,12 +858,13 @@ dependencies = [
 [[package]]
 name = "embassy-embedded-hal"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "embassy-futures",
- "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad)",
+ "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4)",
+ "embassy-time",
  "embedded-hal 0.2.7",
- "embedded-hal 1.0.0-alpha.10",
+ "embedded-hal 1.0.0-alpha.11",
  "embedded-hal-async",
  "embedded-storage",
  "embedded-storage-async",
@@ -889,7 +890,7 @@ dependencies = [
 [[package]]
 name = "embassy-executor"
 version = "0.2.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "atomic-polyfill 1.0.2",
  "cortex-m",
@@ -904,12 +905,12 @@ dependencies = [
 [[package]]
 name = "embassy-futures"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 
 [[package]]
-name = "embassy-hal-common"
+name = "embassy-hal-internal"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "cortex-m",
  "critical-section 1.1.1",
@@ -932,7 +933,7 @@ dependencies = [
 [[package]]
 name = "embassy-macros"
 version = "0.2.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "darling 0.20.1",
  "proc-macro2",
@@ -943,14 +944,13 @@ dependencies = [
 [[package]]
 name = "embassy-net"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "as-slice 0.2.1",
  "atomic-polyfill 1.0.2",
  "atomic-pool",
- "embassy-hal-common",
  "embassy-net-driver",
- "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad)",
+ "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4)",
  "embassy-time",
  "embedded-io",
  "embedded-nal-async",
@@ -966,34 +966,45 @@ dependencies = [
 [[package]]
 name = "embassy-net-driver"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 
 [[package]]
 name = "embassy-net-driver-channel"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "embassy-futures",
  "embassy-net-driver",
- "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad)",
+ "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4)",
+]
+
+[[package]]
+name = "embassy-net-tuntap"
+version = "0.1.0"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
+dependencies = [
+ "async-io",
+ "embassy-net-driver",
+ "libc",
+ "log",
 ]
 
 [[package]]
 name = "embassy-net-w5500"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "embassy-futures",
  "embassy-net-driver-channel",
  "embassy-time",
- "embedded-hal 1.0.0-alpha.10",
+ "embedded-hal 1.0.0-alpha.11",
  "embedded-hal-async",
 ]
 
 [[package]]
 name = "embassy-rp"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "atomic-polyfill 1.0.2",
  "cfg-if",
@@ -1003,16 +1014,17 @@ dependencies = [
  "defmt",
  "embassy-embedded-hal",
  "embassy-futures",
- "embassy-hal-common",
- "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad)",
+ "embassy-hal-internal",
+ "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4)",
  "embassy-time",
  "embassy-usb-driver",
  "embedded-hal 0.2.7",
- "embedded-hal 1.0.0-alpha.10",
+ "embedded-hal 1.0.0-alpha.11",
  "embedded-hal-async",
  "embedded-hal-nb",
  "embedded-io",
  "embedded-storage",
+ "embedded-storage-async",
  "fixed",
  "futures",
  "nb 1.1.0",
@@ -1040,7 +1052,7 @@ dependencies = [
 [[package]]
 name = "embassy-sync"
 version = "0.2.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "cfg-if",
  "critical-section 1.1.1",
@@ -1051,8 +1063,8 @@ dependencies = [
 
 [[package]]
 name = "embassy-time"
-version = "0.1.1"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+version = "0.1.2"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "atomic-polyfill 1.0.2",
  "cfg-if",
@@ -1067,11 +1079,11 @@ dependencies = [
 [[package]]
 name = "embassy-usb"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "embassy-futures",
  "embassy-net-driver-channel",
- "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad)",
+ "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4)",
  "embassy-usb-driver",
  "heapless",
  "ssmarshal",
@@ -1081,7 +1093,7 @@ dependencies = [
 [[package]]
 name = "embassy-usb-driver"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=2eb7a67c7027c6768fa95031caf60bcd0eade1ad#2eb7a67c7027c6768fa95031caf60bcd0eade1ad"
+source = "git+https://github.com/embassy-rs/embassy/?rev=4d60c715e683aaadf25d9f066bde805c725fefb4#4d60c715e683aaadf25d9f066bde805c725fefb4"
 dependencies = [
  "defmt",
 ]
@@ -1098,26 +1110,26 @@ dependencies = [
 
 [[package]]
 name = "embedded-hal"
-version = "1.0.0-alpha.10"
+version = "1.0.0-alpha.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f65c4d073f5d91c66e629b216818a4c9747eeda0debedf2deda9a0a947e4e93b"
+checksum = "f7724ebabcadfeb15920571dd727bc8ccde8586e52f2890bdb8182fdf42c3ff2"
 
 [[package]]
 name = "embedded-hal-async"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8042370aa7af48de36d5312cda14c18ed8ca6b7ce64f5a07832fedc9dc83063f"
+checksum = "918285ec7b18edb024d4adc64f6f16cdc7c4d72eadfc85c3313d1e0ff40e0229"
 dependencies = [
- "embedded-hal 1.0.0-alpha.10",
+ "embedded-hal 1.0.0-alpha.11",
 ]
 
 [[package]]
 name = "embedded-hal-nb"
-version = "1.0.0-alpha.2"
+version = "1.0.0-alpha.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1465fffd56a95bbc105c17965bca1c1d5815027b1cc6bb183bc05d04563d065c"
+checksum = "a09e4c3f8a54e60803405e1cc17e36c963ab32e654f8d6bb49d48cd8116360d7"
 dependencies = [
- "embedded-hal 1.0.0-alpha.10",
+ "embedded-hal 1.0.0-alpha.11",
  "nb 1.1.0",
 ]
 
@@ -2278,9 +2290,9 @@ dependencies = [
 
 [[package]]
 name = "rp-pac"
-version = "5.0.0"
+version = "6.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33dd6f870a5f492dcd71c74ccb5d9b5987e43467697563c02995ed4f96f50618"
+checksum = "f30f6c4c846269293db805e9c77864ff7b923395b480550df44f0868e3765337"
 dependencies = [
  "cortex-m",
  "cortex-m-rt",
@@ -2800,7 +2812,7 @@ dependencies = [
  "embassy-time",
  "embassy-usb",
  "embassy-usb-driver",
- "embedded-hal 1.0.0-alpha.10",
+ "embedded-hal 1.0.0-alpha.11",
  "embedded-hal-async",
  "embedded-io",
  "futures",
@@ -2831,7 +2843,7 @@ dependencies = [
  "embassy-executor 0.1.1",
  "embassy-futures",
  "embassy-net",
- "embassy-net-driver",
+ "embassy-net-tuntap",
  "embassy-sync 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "embassy-time",
  "embedded-io",
diff --git a/Cargo.toml b/Cargo.toml
index b40b404867142a9faebfbbd61bb37ffab5e184e8..fa8b5d6b3b59e35f6b5976d78c1770209d676ddd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -88,20 +88,21 @@ x25519-dalek = { git = "https://github.com/mkj/curve25519-dalek", branch = "suns
 # ed25519-dalek = { path = "/home/matt/3rd/rs/crypto/curve25519-dalek/ed25519-dalek" }
 # x25519-dalek = { path = "/home/matt/3rd/rs/crypto/curve25519-dalek/x25519-dalek" }
 
-embassy-executor = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-futures = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-rp = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-usb = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-time = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-usb-driver = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
+embassy-executor = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-futures = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-rp = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-usb = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-time = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-usb-driver = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
 # for cyw43
-embassy-net = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-net-driver-channel = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-net-driver = { git = "https://github.com/embassy-rs/embassy", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-
-cyw43 = { git = "https://github.com/embassy-rs/embassy/", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-cyw43-pio = { git = "https://github.com/embassy-rs/embassy/", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
-embassy-net-w5500 = { git = "https://github.com/embassy-rs/embassy/", rev = "2eb7a67c7027c6768fa95031caf60bcd0eade1ad" }
+embassy-net = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-net-driver-channel = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-net-driver = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-net-tuntap = { git = "https://github.com/embassy-rs/embassy", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+
+cyw43 = { git = "https://github.com/embassy-rs/embassy/", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+cyw43-pio = { git = "https://github.com/embassy-rs/embassy/", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
+embassy-net-w5500 = { git = "https://github.com/embassy-rs/embassy/", rev = "4d60c715e683aaadf25d9f066bde805c725fefb4" }
 
 # these are mostly applicable to picow, but can't hurt generally
 [profile.dev]
diff --git a/LICENSE b/LICENSE
index 26ba5b0e5802eb387d0c725bf5551b312aa08f32..5d07d85a0420e4d989e132a38495eff314948dcc 100644
--- a/LICENSE
+++ b/LICENSE
@@ -8,7 +8,6 @@ MIT or Apache-2.0 license.
 Copyright (c) 2019-2022 Embassy project contributors
 
 embassy/demos/picow/src/wifi.rs
-embassy/demos/std/src/tuntap.rs
 embassy/demos/picow/src/w5500.rs
 
 --
diff --git a/embassy/demos/common/src/config.rs b/embassy/demos/common/src/config.rs
index 9d0bac1a41c6e0bdb63b8b18b4c54acd75c4a0ec..2dad30609c5b254cad3c51d053db26d87bfacb9f 100644
--- a/embassy/demos/common/src/config.rs
+++ b/embassy/demos/common/src/config.rs
@@ -181,7 +181,6 @@ where
         let prefix = SSHDecode::dec(s)?;
         if prefix > 32 {
             // emabassy panics, so test it here
-            debug!("Prefix {} > 32", prefix);
             return Err(WireError::PacketWrong)
         }
         let gw: Option<[u8; 4]> = dec_option(s)?;
diff --git a/embassy/demos/picow/Cargo.toml b/embassy/demos/picow/Cargo.toml
index 5371a0fe9d73136389713c09d9f9448c4eda3602..fce77bd8b058a5820e8bf2588a4f5ee9e86c22ab 100644
--- a/embassy/demos/picow/Cargo.toml
+++ b/embassy/demos/picow/Cargo.toml
@@ -41,7 +41,7 @@ snafu = { version = "0.7", default-features = false, features = ["rust_1_61"] }
 cortex-m = { version = "0.7.6", features = ["critical-section-single-core"]}
 cortex-m-rt = "0.7.0"
 
-embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.10" }
+embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.11" }
 embedded-hal-async = { version = "0.2.0-alpha.1" }
 embedded-io = { version = "0.4", features = ["async", "defmt"] }
 heapless = "0.7.15"
diff --git a/embassy/demos/std/Cargo.toml b/embassy/demos/std/Cargo.toml
index b4a2225f147135098b7293958b57fcbabdb23ee3..bd6393f723fde74980ea8717efcdb99ddcc393fc 100644
--- a/embassy/demos/std/Cargo.toml
+++ b/embassy/demos/std/Cargo.toml
@@ -8,7 +8,7 @@ embassy-executor = { version = "0.1.0",  default-features=false, features = ["lo
 embassy-time = { version = "0.1",  default-features=false, features = ["log", "std"] }
 # embassy-net/nightly is required for asynch::Read/Write on TcpReader/TcpWriter
 embassy-net = { version = "0.1.0", features = ["tcp", "dhcpv4", "medium-ethernet", "nightly"] }
-embassy-net-driver = { version = "0.1.0" }
+embassy-net-tuntap = { version = "0.1.0" }
 embassy-sync = { version = "0.2.0" }
 embassy-futures = { version = "0.1.0" }
 atomic-polyfill = "0.1.5"
diff --git a/embassy/demos/std/src/main.rs b/embassy/demos/std/src/main.rs
index 71f6420b4db82887b3f2ae3c2f855e5b73df7506..8c954320a7111195de5eec49d5076ea40a489336 100644
--- a/embassy/demos/std/src/main.rs
+++ b/embassy/demos/std/src/main.rs
@@ -8,7 +8,7 @@ use {
 };
 
 use embassy_executor::{Spawner, Executor};
-use embassy_net::{Stack, StackResources, Config};
+use embassy_net::{Stack, StackResources};
 use static_cell::StaticCell;
 
 use rand::rngs::OsRng;
@@ -18,13 +18,11 @@ use demo_common::menu::Runner as MenuRunner;
 use embedded_io::asynch::Read;
 use embassy_sync::signal::Signal;
 use embassy_sync::blocking_mutex::raw::NoopRawMutex;
-
-use crate::tuntap::TunTapDevice;
+use embassy_net_tuntap::TunTapDevice;
 
 use sunset::*;
 use sunset_embassy::{SSHServer, SunsetMutex};
 
-mod tuntap;
 mod setupmenu;
 pub(crate) use sunset_demo_embassy_common as demo_common;
 use crate::demo_common::singleton;
@@ -47,7 +45,7 @@ async fn main_task(spawner: Spawner) {
 
     let config = &*singleton!(  {
         let mut config = SSHConfig::new().unwrap();
-        // config.set_console_pw(Some("pw")).unwrap();
+        config.set_console_pw(Some("pw")).unwrap();
         SunsetMutex::new(config)
     } );
 
@@ -86,7 +84,7 @@ struct StdDemo {
 impl DemoServer for StdDemo {
     type Init = ();
 
-    fn new(init: &Self::Init) -> Self {
+    fn new(_init: &Self::Init) -> Self {
         Default::default()
     }
 
diff --git a/embassy/demos/std/src/setupmenu.rs b/embassy/demos/std/src/setupmenu.rs
index 051992160c30d0b5420f15c340967134778d65c6..4995d2d72ed4b9d1d792c2824c90784c94904a83 100644
--- a/embassy/demos/std/src/setupmenu.rs
+++ b/embassy/demos/std/src/setupmenu.rs
@@ -96,32 +96,28 @@ const AUTH_ITEM: Item<BufOutput> = Item {
 };
 
 fn enter_top(context: &mut BufOutput) {
-    writeln!(context, "In setup menu").unwrap();
+    let _ = writeln!(context, "In setup menu").unwrap();
 }
 
 fn enter_auth(context: &mut BufOutput) {
-    writeln!(context, "In auth menu").unwrap();
+    let _ = writeln!(context, "In auth menu").unwrap();
 }
 
 fn do_auth_show(_item: &Item<BufOutput>, _args: &[&str], context: &mut BufOutput) {
-    writeln!(context, "auth key");
+    let _ = writeln!(context, "auth key");
 }
 
 fn do_auth_key(_item: &Item<BufOutput>, _args: &[&str], context: &mut BufOutput) {
-    writeln!(context, "auth key");
+    let _ = writeln!(context, "auth key");
 }
 
 fn do_auth_pw(_item: &Item<BufOutput>, _args: &[&str], context: &mut BufOutput) {
-    writeln!(context, "this is auth pw");
+    let _ = writeln!(context, "this is auth pw");
 }
 
-fn do_gpio_show(_item: &Item<BufOutput>, _args: &[&str], context: &mut BufOutput) {
-    writeln!(context, "gpio show here");
-}
-
-fn do_erase_config(_item: &Item<BufOutput>, args: &[&str], context: &mut BufOutput) {
+fn do_erase_config(_item: &Item<BufOutput>, _args: &[&str], _context: &mut BufOutput) {
 }
 
 fn do_about(_item: &Item<BufOutput>, _args: &[&str], context: &mut BufOutput) {
-    writeln!(context, "Sunset SSH, USB serial\nMatt Johnston <matt@ucc.asn.au>\n");
+    let _ = writeln!(context, "Sunset SSH, USB serial\nMatt Johnston <matt@ucc.asn.au>\n");
 }
diff --git a/embassy/demos/std/src/tuntap.rs b/embassy/demos/std/src/tuntap.rs
deleted file mode 100644
index 7a790ad5d79db0bcb3abd72e056ed84d6df2dcf0..0000000000000000000000000000000000000000
--- a/embassy/demos/std/src/tuntap.rs
+++ /dev/null
@@ -1,227 +0,0 @@
-// From https://github.com/embassy-rs/embassy/blob/master/examples/std/src/tuntap.rs
-// Copyright (c) 2019-2022 Embassy project contributors
-// MIT or Apache-2.0 license
-use std::io;
-use std::io::{Read, Write};
-use std::os::unix::io::{AsRawFd, RawFd};
-use std::task::Context;
-
-use async_io::Async;
-use embassy_net_driver::{self, Capabilities, Driver, LinkState};
-use log::*;
-
-pub const SIOCGIFMTU: libc::c_ulong = 0x8921;
-pub const _SIOCGIFINDEX: libc::c_ulong = 0x8933;
-pub const _ETH_P_ALL: libc::c_short = 0x0003;
-pub const TUNSETIFF: libc::c_ulong = 0x400454CA;
-pub const _IFF_TUN: libc::c_int = 0x0001;
-pub const IFF_TAP: libc::c_int = 0x0002;
-pub const IFF_NO_PI: libc::c_int = 0x1000;
-
-const ETHERNET_HEADER_LEN: usize = 14;
-
-#[repr(C)]
-#[derive(Debug)]
-struct ifreq {
-    ifr_name: [libc::c_char; libc::IF_NAMESIZE],
-    ifr_data: libc::c_int, /* ifr_ifindex or ifr_mtu */
-}
-
-fn ifreq_for(name: &str) -> ifreq {
-    let mut ifreq = ifreq {
-        ifr_name: [0; libc::IF_NAMESIZE],
-        ifr_data: 0,
-    };
-    for (i, byte) in name.as_bytes().iter().enumerate() {
-        ifreq.ifr_name[i] = *byte as libc::c_char
-    }
-    ifreq
-}
-
-fn ifreq_ioctl(lower: libc::c_int, ifreq: &mut ifreq, cmd: libc::c_ulong) -> io::Result<libc::c_int> {
-    unsafe {
-        let res = libc::ioctl(lower, cmd as _, ifreq as *mut ifreq);
-        if res == -1 {
-            return Err(io::Error::last_os_error());
-        }
-    }
-
-    Ok(ifreq.ifr_data)
-}
-
-#[derive(Debug)]
-pub struct TunTap {
-    fd: libc::c_int,
-    mtu: usize,
-}
-
-impl AsRawFd for TunTap {
-    fn as_raw_fd(&self) -> RawFd {
-        self.fd
-    }
-}
-
-impl TunTap {
-    pub fn new(name: &str) -> io::Result<TunTap> {
-        unsafe {
-            let fd = libc::open(
-                "/dev/net/tun\0".as_ptr() as *const libc::c_char,
-                libc::O_RDWR | libc::O_NONBLOCK,
-            );
-            if fd == -1 {
-                return Err(io::Error::last_os_error());
-            }
-
-            let mut ifreq = ifreq_for(name);
-            ifreq.ifr_data = IFF_TAP | IFF_NO_PI;
-            ifreq_ioctl(fd, &mut ifreq, TUNSETIFF)?;
-
-            let socket = libc::socket(libc::AF_INET, libc::SOCK_DGRAM, libc::IPPROTO_IP);
-            if socket == -1 {
-                return Err(io::Error::last_os_error());
-            }
-
-            let ip_mtu = ifreq_ioctl(socket, &mut ifreq, SIOCGIFMTU);
-            libc::close(socket);
-            let ip_mtu = ip_mtu? as usize;
-
-            // SIOCGIFMTU returns the IP MTU (typically 1500 bytes.)
-            // smoltcp counts the entire Ethernet packet in the MTU, so add the Ethernet header size to it.
-            let mtu = ip_mtu + ETHERNET_HEADER_LEN;
-
-            Ok(TunTap { fd, mtu })
-        }
-    }
-}
-
-impl Drop for TunTap {
-    fn drop(&mut self) {
-        unsafe {
-            libc::close(self.fd);
-        }
-    }
-}
-
-impl io::Read for TunTap {
-    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
-        let len = unsafe { libc::read(self.fd, buf.as_mut_ptr() as *mut libc::c_void, buf.len()) };
-        if len == -1 {
-            Err(io::Error::last_os_error())
-        } else {
-            Ok(len as usize)
-        }
-    }
-}
-
-impl io::Write for TunTap {
-    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
-        let len = unsafe { libc::write(self.fd, buf.as_ptr() as *mut libc::c_void, buf.len()) };
-        if len == -1 {
-            Err(io::Error::last_os_error())
-        } else {
-            Ok(len as usize)
-        }
-    }
-
-    fn flush(&mut self) -> io::Result<()> {
-        Ok(())
-    }
-}
-
-pub struct TunTapDevice {
-    device: Async<TunTap>,
-}
-
-impl TunTapDevice {
-    pub fn new(name: &str) -> io::Result<TunTapDevice> {
-        Ok(Self {
-            device: Async::new(TunTap::new(name)?)?,
-        })
-    }
-}
-
-impl Driver for TunTapDevice {
-    type RxToken<'a> = RxToken where Self: 'a;
-    type TxToken<'a> = TxToken<'a> where Self: 'a;
-
-    fn receive(&mut self, cx: &mut Context) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
-        let mut buf = vec![0; self.device.get_ref().mtu];
-        loop {
-            match self.device.get_mut().read(&mut buf) {
-                Ok(n) => {
-                    buf.truncate(n);
-                    return Some((
-                        RxToken { buffer: buf },
-                        TxToken {
-                            device: &mut self.device,
-                        },
-                    ));
-                }
-                Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
-                    if !self.device.poll_readable(cx).is_ready() {
-                        return None;
-                    }
-                }
-                Err(e) => panic!("read error: {:?}", e),
-            }
-        }
-    }
-
-    fn transmit(&mut self, _cx: &mut Context) -> Option<Self::TxToken<'_>> {
-        Some(TxToken {
-            device: &mut self.device,
-        })
-    }
-
-    fn capabilities(&self) -> Capabilities {
-        let mut caps = Capabilities::default();
-        caps.max_transmission_unit = self.device.get_ref().mtu;
-        caps
-    }
-
-    fn link_state(&mut self, _cx: &mut Context) -> LinkState {
-        LinkState::Up
-    }
-
-    fn ethernet_address(&self) -> [u8; 6] {
-        [0x02, 0x03, 0x04, 0x05, 0x06, 0x07]
-    }
-}
-
-#[doc(hidden)]
-pub struct RxToken {
-    buffer: Vec<u8>,
-}
-
-impl embassy_net_driver::RxToken for RxToken {
-    fn consume<R, F>(mut self, f: F) -> R
-    where
-        F: FnOnce(&mut [u8]) -> R,
-    {
-        f(&mut self.buffer)
-    }
-}
-
-#[doc(hidden)]
-pub struct TxToken<'a> {
-    device: &'a mut Async<TunTap>,
-}
-
-impl<'a> embassy_net_driver::TxToken for TxToken<'a> {
-    fn consume<R, F>(self, len: usize, f: F) -> R
-    where
-        F: FnOnce(&mut [u8]) -> R,
-    {
-        let mut buffer = vec![0; len];
-        let result = f(&mut buffer);
-
-        // todo handle WouldBlock with async
-        match self.device.get_mut().write(&buffer) {
-            Ok(_) => {}
-            Err(e) if e.kind() == io::ErrorKind::WouldBlock => info!("transmit WouldBlock"),
-            Err(e) => panic!("transmit error: {:?}", e),
-        }
-
-        result
-    }
-}