diff --git a/Cargo.lock b/Cargo.lock
index 3b8a0f9cb1312e056227b1e2bcc6935118a81005..e9c9833e5c91b761602b1fe66205cf5bf1db6698 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -31,18 +31,18 @@ dependencies = [
 
 [[package]]
 name = "aho-corasick"
-version = "1.1.1"
+version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "anyhow"
-version = "1.0.75"
+version = "1.0.77"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+checksum = "c9d19de80eff169429ac1e9f48fffb163916b448a44e8e046186232046d9e1f9"
 
 [[package]]
 name = "argh"
@@ -63,7 +63,7 @@ dependencies = [
  "argh_shared",
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
@@ -131,9 +131,9 @@ dependencies = [
  "log",
  "parking",
  "polling",
- "rustix 0.37.23",
+ "rustix 0.37.27",
  "slab",
- "socket2 0.4.9",
+ "socket2 0.4.10",
  "waker-fn",
 ]
 
@@ -237,9 +237,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce"
 
 [[package]]
 name = "base64"
-version = "0.21.4"
+version = "0.21.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
+checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
 
 [[package]]
 name = "base64ct"
@@ -287,9 +287,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.4.0"
+version = "2.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
 
 [[package]]
 name = "block-buffer"
@@ -351,7 +351,7 @@ dependencies = [
  "cortex-m",
  "critical-section 1.1.2",
  "embassy-rp",
- "getrandom 0.2.10",
+ "getrandom 0.2.11",
  "log",
  "rand 0.8.5",
  "rand_chacha 0.3.1",
@@ -408,18 +408,18 @@ dependencies = [
 
 [[package]]
 name = "concurrent-queue"
-version = "2.3.0"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400"
+checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
 dependencies = [
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "const-oid"
-version = "0.9.5"
+version = "0.9.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f"
+checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
 
 [[package]]
 name = "cortex-m"
@@ -456,18 +456,18 @@ dependencies = [
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.9"
+version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
+checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "crc-any"
-version = "2.4.3"
+version = "2.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df"
+checksum = "c01a5e1f881f6fb6099a7bdf949e946719fd4f1fefa56264890574febf0eb6d0"
 dependencies = [
  "debug-helper",
 ]
@@ -490,9 +490,9 @@ checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216"
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.16"
+version = "0.8.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c"
 dependencies = [
  "cfg-if",
 ]
@@ -570,22 +570,22 @@ source = "git+https://github.com/mkj/curve25519-dalek?branch=sunset#e4d2869ade3a
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
 name = "cyw43"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "cortex-m",
  "cortex-m-rt",
  "defmt",
- "embassy-futures 0.1.0",
+ "embassy-futures 0.1.1 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
  "embassy-net-driver-channel",
- "embassy-sync 0.4.0",
- "embassy-time",
- "embedded-hal 1.0.0-rc.1",
+ "embassy-sync 0.5.0 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
+ "embassy-time 0.2.0",
+ "embedded-hal 1.0.0-rc.3",
  "futures",
  "num_enum",
 ]
@@ -593,7 +593,7 @@ dependencies = [
 [[package]]
 name = "cyw43-pio"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "cyw43",
  "embassy-rp",
@@ -602,38 +602,14 @@ dependencies = [
  "pio-proc",
 ]
 
-[[package]]
-name = "darling"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
-dependencies = [
- "darling_core 0.13.4",
- "darling_macro 0.13.4",
-]
-
 [[package]]
 name = "darling"
 version = "0.20.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e"
 dependencies = [
- "darling_core 0.20.3",
- "darling_macro 0.20.3",
-]
-
-[[package]]
-name = "darling_core"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
-dependencies = [
- "fnv",
- "ident_case",
- "proc-macro2",
- "quote",
- "strsim",
- "syn 1.0.109",
+ "darling_core",
+ "darling_macro",
 ]
 
 [[package]]
@@ -647,18 +623,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "strsim",
- "syn 2.0.37",
-]
-
-[[package]]
-name = "darling_macro"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
-dependencies = [
- "darling_core 0.13.4",
- "quote",
- "syn 1.0.109",
+ "syn 2.0.43",
 ]
 
 [[package]]
@@ -667,9 +632,9 @@ version = "0.20.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
 dependencies = [
- "darling_core 0.20.3",
+ "darling_core",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
@@ -698,7 +663,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
@@ -733,9 +698,12 @@ dependencies = [
 
 [[package]]
 name = "deranged"
-version = "0.3.8"
+version = "0.3.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946"
+checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc"
+dependencies = [
+ "powerfmt",
+]
 
 [[package]]
 name = "diff"
@@ -791,6 +759,15 @@ version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
 
+[[package]]
+name = "document-features"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e493c573fce17f00dcab13b6ac057994f3ce17d1af4dc39bfd482b83c6eb6157"
+dependencies = [
+ "litrs",
+]
+
 [[package]]
 name = "ecdsa"
 version = "0.14.8"
@@ -814,11 +791,11 @@ dependencies = [
 
 [[package]]
 name = "ed25519"
-version = "2.2.2"
+version = "2.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d"
+checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
 dependencies = [
- "signature 2.1.0",
+ "signature 2.2.0",
 ]
 
 [[package]]
@@ -841,7 +818,7 @@ version = "2.0.0-rc.3"
 source = "git+https://github.com/mkj/curve25519-dalek?branch=sunset#e4d2869ade3a2e511d54293a74e28be1d6125bdd"
 dependencies = [
  "curve25519-dalek 4.0.0",
- "ed25519 2.2.2",
+ "ed25519 2.2.3",
  "rand_core 0.6.4",
  "sha2 0.10.8",
  "subtle",
@@ -876,13 +853,13 @@ dependencies = [
 [[package]]
 name = "embassy-embedded-hal"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
- "embassy-futures 0.1.0",
- "embassy-sync 0.4.0",
- "embassy-time",
+ "embassy-futures 0.1.1 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
+ "embassy-sync 0.5.0 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
+ "embassy-time 0.2.0",
  "embedded-hal 0.2.7",
- "embedded-hal 1.0.0-rc.1",
+ "embedded-hal 1.0.0-rc.3",
  "embedded-hal-async",
  "embedded-storage",
  "embedded-storage-async",
@@ -891,48 +868,44 @@ dependencies = [
 
 [[package]]
 name = "embassy-executor"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4f2f7687ed60a799909eca1bf68b41e9f2ad03d740f0956a945ddabccc6aedb"
+version = "0.4.0"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
- "atomic-polyfill 1.0.3",
- "cfg-if",
+ "cortex-m",
  "critical-section 1.1.2",
- "embassy-macros 0.1.0",
- "embassy-time",
- "futures-util",
+ "defmt",
+ "document-features",
+ "embassy-executor-macros",
+ "embassy-time 0.2.0",
  "log",
- "static_cell",
 ]
 
 [[package]]
-name = "embassy-executor"
-version = "0.3.2"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+name = "embassy-executor-macros"
+version = "0.4.0"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
- "atomic-polyfill 1.0.3",
- "cortex-m",
- "critical-section 1.1.2",
- "defmt",
- "embassy-macros 0.2.1",
- "embassy-time",
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.43",
 ]
 
 [[package]]
 name = "embassy-futures"
-version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067"
 
 [[package]]
 name = "embassy-futures"
 version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 
 [[package]]
 name = "embassy-hal-internal"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "cortex-m",
  "critical-section 1.1.2",
@@ -940,44 +913,23 @@ dependencies = [
  "num-traits",
 ]
 
-[[package]]
-name = "embassy-macros"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8f57fb96af50e126bb4ae0826604ac5b9f9ac1d32fb3576d552f7285bf68e67"
-dependencies = [
- "darling 0.13.4",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "embassy-macros"
-version = "0.2.1"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
-dependencies = [
- "darling 0.20.3",
- "proc-macro2",
- "quote",
- "syn 2.0.37",
-]
-
 [[package]]
 name = "embassy-net"
 version = "0.2.1"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "as-slice 0.2.1",
  "atomic-pool",
+ "defmt",
+ "document-features",
  "embassy-net-driver",
- "embassy-sync 0.4.0",
- "embassy-time",
+ "embassy-sync 0.5.0 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
+ "embassy-time 0.2.0",
  "embedded-io-async",
  "embedded-nal-async",
  "futures",
  "generic-array 0.14.7",
- "heapless",
+ "heapless 0.8.0",
  "log",
  "managed",
  "smoltcp",
@@ -987,22 +939,25 @@ dependencies = [
 [[package]]
 name = "embassy-net-driver"
 version = "0.2.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
+dependencies = [
+ "defmt",
+]
 
 [[package]]
 name = "embassy-net-driver-channel"
 version = "0.2.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
- "embassy-futures 0.1.0",
+ "embassy-futures 0.1.1 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
  "embassy-net-driver",
- "embassy-sync 0.4.0",
+ "embassy-sync 0.5.0 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
 ]
 
 [[package]]
 name = "embassy-net-tuntap"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "async-io",
  "embassy-net-driver",
@@ -1013,19 +968,19 @@ dependencies = [
 [[package]]
 name = "embassy-net-wiznet"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
- "embassy-futures 0.1.0",
+ "embassy-futures 0.1.1 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
  "embassy-net-driver-channel",
- "embassy-time",
- "embedded-hal 1.0.0-rc.1",
+ "embassy-time 0.2.0",
+ "embedded-hal 1.0.0-rc.3",
  "embedded-hal-async",
 ]
 
 [[package]]
 name = "embassy-rp"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "atomic-polyfill 1.0.3",
  "cfg-if",
@@ -1033,14 +988,15 @@ dependencies = [
  "cortex-m-rt",
  "critical-section 1.1.2",
  "defmt",
+ "document-features",
  "embassy-embedded-hal",
- "embassy-futures 0.1.0",
+ "embassy-futures 0.1.1 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
  "embassy-hal-internal",
- "embassy-sync 0.4.0",
- "embassy-time",
+ "embassy-sync 0.5.0 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
+ "embassy-time 0.2.0",
  "embassy-usb-driver",
  "embedded-hal 0.2.7",
- "embedded-hal 1.0.0-rc.1",
+ "embedded-hal 1.0.0-rc.3",
  "embedded-hal-async",
  "embedded-hal-nb",
  "embedded-io",
@@ -1059,53 +1015,69 @@ dependencies = [
 
 [[package]]
 name = "embassy-sync"
-version = "0.3.0"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0525b466ca3ace30b57f2db868a35215dfaecd038d8668cb2db03feb7c069a0"
+checksum = "dd938f25c0798db4280fcd8026bf4c2f48789aebf8f77b6e5cf8a7693ba114ec"
 dependencies = [
  "cfg-if",
  "critical-section 1.1.2",
+ "embedded-io-async",
  "futures-util",
- "heapless",
+ "heapless 0.8.0",
 ]
 
 [[package]]
 name = "embassy-sync"
-version = "0.4.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+version = "0.5.0"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "cfg-if",
  "critical-section 1.1.2",
+ "embedded-io-async",
  "futures-util",
- "heapless",
+ "heapless 0.8.0",
 ]
 
 [[package]]
 name = "embassy-time"
-version = "0.1.5"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eece6d4c82b7533d3c5a7751024b83eb790b3a89dd1de29a6e9a76b33b53ce78"
+dependencies = [
+ "cfg-if",
+ "critical-section 1.1.2",
+ "embedded-hal 0.2.7",
+ "futures-util",
+ "heapless 0.7.17",
+]
+
+[[package]]
+name = "embassy-time"
+version = "0.2.0"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "cfg-if",
  "critical-section 1.1.2",
  "defmt",
+ "document-features",
  "embedded-hal 0.2.7",
- "embedded-hal 1.0.0-rc.1",
+ "embedded-hal 1.0.0-rc.3",
  "embedded-hal-async",
  "futures-util",
- "heapless",
+ "heapless 0.8.0",
  "log",
 ]
 
 [[package]]
 name = "embassy-usb"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
- "embassy-futures 0.1.0",
+ "embassy-futures 0.1.1 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
  "embassy-net-driver-channel",
- "embassy-sync 0.4.0",
+ "embassy-sync 0.5.0 (git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8)",
  "embassy-usb-driver",
- "heapless",
+ "heapless 0.8.0",
  "ssmarshal",
  "usbd-hid",
 ]
@@ -1113,7 +1085,7 @@ dependencies = [
 [[package]]
 name = "embassy-usb-driver"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/embassy/?rev=78a7ee7ec48a6ed26d770165e777beb06e92777c#78a7ee7ec48a6ed26d770165e777beb06e92777c"
+source = "git+https://github.com/embassy-rs/embassy/?rev=90e96d281f87efdbea3a1418f5354f14386a42e8#90e96d281f87efdbea3a1418f5354f14386a42e8"
 dependencies = [
  "defmt",
 ]
@@ -1130,54 +1102,54 @@ dependencies = [
 
 [[package]]
 name = "embedded-hal"
-version = "1.0.0-rc.1"
+version = "1.0.0-rc.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2894bc2f0457b8ca3d6b8ab8aad64d9337583672494013457f86c5a9146c0e22"
+checksum = "bc402f79e1fd22731ca945b4f97b5ff37e7b3f379312595c42bb2e8811c29920"
 
 [[package]]
 name = "embedded-hal-async"
-version = "1.0.0-rc.1"
+version = "1.0.0-rc.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76a8a3517745342155b3b00895a0f78417a453fb800d97a8bf4777d5720acde9"
+checksum = "fa1fba2ef2ffb35d614acc6fb323ddf7facc45c069f24544d49ea54e5043626d"
 dependencies = [
- "embedded-hal 1.0.0-rc.1",
+ "embedded-hal 1.0.0-rc.3",
 ]
 
 [[package]]
 name = "embedded-hal-bus"
-version = "0.1.0-rc.1"
+version = "0.1.0-rc.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "662822f2853efaa9629ba6d424d7b0cbf8f7f52d68a8919c9afe56e7f9dd1b2a"
+checksum = "1efb2ecab73461234acd6db8576463c11c315b44ce234f2ced82f87c60831f4f"
 dependencies = [
  "critical-section 1.1.2",
- "embedded-hal 1.0.0-rc.1",
+ "embedded-hal 1.0.0-rc.3",
  "embedded-hal-async",
 ]
 
 [[package]]
 name = "embedded-hal-nb"
-version = "1.0.0-rc.1"
+version = "1.0.0-rc.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "257e3bb0163c69195acb0ebe0083b017b963235861d5ea9741626abdc55f39c9"
+checksum = "3cde58312a0675b6c0389eb0dceb2bf8c735a697b0b5baa1f23bbaf030636deb"
 dependencies = [
- "embedded-hal 1.0.0-rc.1",
+ "embedded-hal 1.0.0-rc.3",
  "nb 1.1.0",
 ]
 
 [[package]]
 name = "embedded-io"
-version = "0.6.0"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa9417478b5440a2c25f95b25e3ec6ec92e7f9a7ae90c9719e434daeec4ece71"
+checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
 dependencies = [
  "defmt",
 ]
 
 [[package]]
 name = "embedded-io-adapters"
-version = "0.6.0"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5aa94ce6a11ae812b533ab3cae0b12a26f231b49324273faa2fd5f4e1775a8c"
+checksum = "b03facd2b544d24916f312a6026c1b548b8af012f788a554d498afdc8ef9c775"
 dependencies = [
  "embedded-io",
  "embedded-io-async",
@@ -1186,9 +1158,9 @@ dependencies = [
 
 [[package]]
 name = "embedded-io-async"
-version = "0.6.0"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de03527d6fb488b2d7c7a4dc81dfb6a657efe264256bfc70bb899746821666b1"
+checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f"
 dependencies = [
  "defmt",
  "embedded-io",
@@ -1196,38 +1168,36 @@ dependencies = [
 
 [[package]]
 name = "embedded-nal"
-version = "0.7.0"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "447416d161ba378782c13e82b11b267d6d2104b4913679a7c5640e7e94f96ea7"
+checksum = "b8a943fad5ed3d3f8a00f1e80f6bba371f1e7f0df28ec38477535eb318dc19cc"
 dependencies = [
- "heapless",
  "nb 1.1.0",
  "no-std-net",
 ]
 
 [[package]]
 name = "embedded-nal-async"
-version = "0.6.0"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0f75f0ac83505f354443332324ef1399463902718b95b4ce153ae9b3660f341"
+checksum = "72229137a4fc12d239b0b7f50f04b30790678da6d782a0f3f1909bf57ec4b759"
 dependencies = [
  "embedded-io-async",
  "embedded-nal",
- "heapless",
  "no-std-net",
 ]
 
 [[package]]
 name = "embedded-storage"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "156d7a2fdd98ebbf9ae579cbceca3058cff946e13f8e17b90e3511db0508c723"
+checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032"
 
 [[package]]
 name = "embedded-storage-async"
-version = "0.4.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "052997a894670d0cde873faa7405bc98e2fd29f569d2acd568561bc1c396b35a"
+checksum = "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc"
 dependencies = [
  "embedded-storage",
 ]
@@ -1268,23 +1238,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
+version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
 dependencies = [
- "cc",
  "libc",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -1344,9 +1303,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
 [[package]]
 name = "futures"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1359,9 +1318,9 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
 dependencies = [
  "futures-core",
  "futures-sink",
@@ -1369,15 +1328,15 @@ dependencies = [
 
 [[package]]
 name = "futures-core"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -1386,9 +1345,9 @@ dependencies = [
 
 [[package]]
 name = "futures-io"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
 
 [[package]]
 name = "futures-lite"
@@ -1407,32 +1366,32 @@ dependencies = [
 
 [[package]]
 name = "futures-macro"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
 name = "futures-sink"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
 
 [[package]]
 name = "futures-task"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
 
 [[package]]
 name = "futures-util"
-version = "0.3.28"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1487,9 +1446,9 @@ dependencies = [
 
 [[package]]
 name = "getrandom"
-version = "0.2.10"
+version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
 dependencies = [
  "cfg-if",
  "libc",
@@ -1498,9 +1457,9 @@ dependencies = [
 
 [[package]]
 name = "gimli"
-version = "0.28.0"
+version = "0.28.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
 
 [[package]]
 name = "group"
@@ -1532,26 +1491,45 @@ dependencies = [
  "byteorder",
 ]
 
+[[package]]
+name = "hash32"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
+dependencies = [
+ "byteorder",
+]
+
 [[package]]
 name = "hashbrown"
-version = "0.14.1"
+version = "0.14.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
 
 [[package]]
 name = "heapless"
-version = "0.7.16"
+version = "0.7.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743"
+checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
 dependencies = [
- "atomic-polyfill 0.1.11",
- "defmt",
- "hash32",
+ "atomic-polyfill 1.0.3",
+ "hash32 0.2.1",
  "rustc_version 0.4.0",
  "spin 0.9.8",
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "heapless"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
+dependencies = [
+ "defmt",
+ "hash32 0.3.1",
+ "stable_deref_trait",
+]
+
 [[package]]
 name = "heck"
 version = "0.4.1"
@@ -1596,9 +1574,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
 
 [[package]]
 name = "indexmap"
-version = "2.0.1"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad227c3af19d4914570ad36d30409928b75967c298feb9ea1969db3a610bb14e"
+checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
 dependencies = [
  "equivalent",
  "hashbrown",
@@ -1630,18 +1608,18 @@ checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
 dependencies = [
  "hermit-abi 0.3.3",
  "libc",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "is-terminal"
-version = "0.4.9"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
+checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455"
 dependencies = [
  "hermit-abi 0.3.3",
- "rustix 0.38.14",
- "windows-sys",
+ "rustix 0.38.28",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -1655,15 +1633,15 @@ dependencies = [
 
 [[package]]
 name = "itoa"
-version = "1.0.9"
+version = "1.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
 
 [[package]]
 name = "js-sys"
-version = "0.3.64"
+version = "0.3.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
 dependencies = [
  "wasm-bindgen",
 ]
@@ -1710,15 +1688,26 @@ dependencies = [
 
 [[package]]
 name = "libc"
-version = "0.2.148"
+version = "0.2.151"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
+checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
 
 [[package]]
 name = "libm"
-version = "0.2.7"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+
+[[package]]
+name = "libredox"
+version = "0.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
+checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+dependencies = [
+ "bitflags 2.4.1",
+ "libc",
+ "redox_syscall",
+]
 
 [[package]]
 name = "linux-raw-sys"
@@ -1728,15 +1717,21 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.7"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128"
+checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
+
+[[package]]
+name = "litrs"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9275e0933cf8bb20f008924c0cb07a0692fe54d8064996520bf998de9eb79aa"
 
 [[package]]
 name = "lock_api"
-version = "0.4.10"
+version = "0.4.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
 dependencies = [
  "autocfg",
  "scopeguard",
@@ -1756,9 +1751,9 @@ checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d"
 
 [[package]]
 name = "memchr"
-version = "2.6.3"
+version = "2.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
 
 [[package]]
 name = "memoffset"
@@ -1780,13 +1775,13 @@ dependencies = [
 
 [[package]]
 name = "mio"
-version = "0.8.8"
+version = "0.8.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
 dependencies = [
  "libc",
  "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -1870,9 +1865,9 @@ dependencies = [
 
 [[package]]
 name = "num-traits"
-version = "0.2.16"
+version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
 dependencies = [
  "autocfg",
  "libm",
@@ -1919,18 +1914,18 @@ dependencies = [
 
 [[package]]
 name = "object"
-version = "0.32.1"
+version = "0.32.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "opaque-debug"
@@ -1972,9 +1967,9 @@ dependencies = [
 
 [[package]]
 name = "parking"
-version = "2.1.1"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e52c774a4c39359c1d1c52e43f73dd91a75a614652c825408eec30c95a9b2067"
+checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
 
 [[package]]
 name = "parking_lot"
@@ -1988,15 +1983,15 @@ dependencies = [
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.8"
+version = "0.9.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.3.5",
+ "redox_syscall",
  "smallvec",
- "windows-targets",
+ "windows-targets 0.48.5",
 ]
 
 [[package]]
@@ -2109,9 +2104,9 @@ dependencies = [
 
 [[package]]
 name = "platforms"
-version = "3.1.2"
+version = "3.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8"
+checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c"
 
 [[package]]
 name = "polling"
@@ -2126,7 +2121,7 @@ dependencies = [
  "libc",
  "log",
  "pin-project-lite",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -2140,6 +2135,21 @@ dependencies = [
  "universal-hash",
 ]
 
+[[package]]
+name = "portable-atomic"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
+dependencies = [
+ "critical-section 1.1.2",
+]
+
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+
 [[package]]
 name = "ppv-lite86"
 version = "0.2.17"
@@ -2184,9 +2194,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.67"
+version = "1.0.71"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
+checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8"
 dependencies = [
  "unicode-ident",
 ]
@@ -2259,7 +2269,7 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom 0.2.10",
+ "getrandom 0.2.11",
 ]
 
 [[package]]
@@ -2273,54 +2283,45 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.3.5"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
 dependencies = [
  "bitflags 1.3.2",
 ]
 
 [[package]]
 name = "redox_users"
-version = "0.4.3"
+version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
 dependencies = [
- "getrandom 0.2.10",
- "redox_syscall 0.2.16",
+ "getrandom 0.2.11",
+ "libredox",
  "thiserror",
 ]
 
 [[package]]
 name = "regex"
-version = "1.9.5"
+version = "1.10.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
 dependencies = [
  "aho-corasick",
  "memchr",
  "regex-automata",
- "regex-syntax 0.7.5",
+ "regex-syntax 0.8.2",
 ]
 
 [[package]]
 name = "regex-automata"
-version = "0.3.8"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-syntax 0.7.5",
+ "regex-syntax 0.8.2",
 ]
 
 [[package]]
@@ -2331,9 +2332,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
 
 [[package]]
 name = "regex-syntax"
-version = "0.7.5"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
 
 [[package]]
 name = "rfc6979"
@@ -2367,13 +2368,13 @@ dependencies = [
 
 [[package]]
 name = "rpassword"
-version = "7.2.0"
+version = "7.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322"
+checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f"
 dependencies = [
  "libc",
  "rtoolbox",
- "winapi",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -2413,19 +2414,19 @@ dependencies = [
  "pkcs8",
  "rand_core 0.6.4",
  "sha2 0.10.8",
- "signature 2.1.0",
+ "signature 2.2.0",
  "subtle",
  "zeroize",
 ]
 
 [[package]]
 name = "rtoolbox"
-version = "0.0.1"
+version = "0.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a"
+checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e"
 dependencies = [
  "libc",
- "winapi",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -2449,34 +2450,34 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
 dependencies = [
- "semver 1.0.19",
+ "semver 1.0.20",
 ]
 
 [[package]]
 name = "rustix"
-version = "0.37.23"
+version = "0.37.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06"
+checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
 dependencies = [
  "bitflags 1.3.2",
  "errno",
  "io-lifetimes",
  "libc",
  "linux-raw-sys 0.3.8",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "rustix"
-version = "0.38.14"
+version = "0.38.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f"
+checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
 dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
  "errno",
  "libc",
- "linux-raw-sys 0.4.7",
- "windows-sys",
+ "linux-raw-sys 0.4.12",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -2516,9 +2517,9 @@ dependencies = [
 
 [[package]]
 name = "semver"
-version = "1.0.19"
+version = "1.0.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0"
+checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
 
 [[package]]
 name = "semver-parser"
@@ -2528,22 +2529,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
 [[package]]
 name = "serde"
-version = "1.0.188"
+version = "1.0.193"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.188"
+version = "1.0.193"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
@@ -2591,9 +2592,9 @@ dependencies = [
 
 [[package]]
 name = "signature"
-version = "2.1.0"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500"
+checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
 dependencies = [
  "digest 0.10.7",
  "rand_core 0.6.4",
@@ -2627,21 +2628,21 @@ dependencies = [
 
 [[package]]
 name = "smallvec"
-version = "1.11.1"
+version = "1.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
 
 [[package]]
 name = "smoltcp"
-version = "0.10.0"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d2e3a36ac8fea7b94e666dfa3871063d6e0a5c9d5d4fec9a1a6b7b6760f0229"
+checksum = "5a1a996951e50b5971a2c8c0fa05a381480d70a933064245c4a223ddc87ccc97"
 dependencies = [
  "bitflags 1.3.2",
  "byteorder",
  "cfg-if",
  "defmt",
- "heapless",
+ "heapless 0.8.0",
  "managed",
 ]
 
@@ -2670,9 +2671,9 @@ dependencies = [
 
 [[package]]
 name = "socket2"
-version = "0.4.9"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
 dependencies = [
  "libc",
  "winapi",
@@ -2680,12 +2681,12 @@ dependencies = [
 
 [[package]]
 name = "socket2"
-version = "0.5.4"
+version = "0.5.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e"
+checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
 dependencies = [
  "libc",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -2761,11 +2762,11 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
 
 [[package]]
 name = "static_cell"
-version = "1.2.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49cd323fc21eb534f903ee78d781d622099f9716c5b408ed23bcf39f8f1651c0"
+checksum = "2cd3f559c6c41cde362aed95cd84765907e06057f087b17269b41750ec40a3e7"
 dependencies = [
- "atomic-polyfill 1.0.3",
+ "portable-atomic",
 ]
 
 [[package]]
@@ -2809,8 +2810,8 @@ dependencies = [
  "ed25519-dalek 2.0.0-rc.3",
  "embedded-io",
  "futures",
- "getrandom 0.2.10",
- "heapless",
+ "getrandom 0.2.11",
+ "heapless 0.8.0",
  "hmac",
  "log",
  "poly1305",
@@ -2818,7 +2819,7 @@ dependencies = [
  "rand_core 0.6.4",
  "rsa 0.8.2",
  "sha2 0.10.8",
- "signature 2.1.0",
+ "signature 2.2.0",
  "simplelog",
  "snafu",
  "ssh-key",
@@ -2834,12 +2835,12 @@ version = "0.1.0"
 dependencies = [
  "anyhow",
  "argh",
- "embassy-futures 0.1.1",
- "embassy-sync 0.3.0",
+ "embassy-futures 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "embassy-sync 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "embedded-io-adapters",
  "embedded-io-async",
  "futures",
- "heapless",
+ "heapless 0.8.0",
  "libc",
  "log",
  "nix",
@@ -2860,16 +2861,17 @@ dependencies = [
 name = "sunset-demo-embassy-common"
 version = "0.1.0"
 dependencies = [
+ "anyhow",
  "bcrypt",
  "defmt",
  "ed25519-dalek 2.0.0-rc.3",
- "embassy-futures 0.1.1",
+ "embassy-futures 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "embassy-net",
  "embassy-net-driver",
- "embassy-sync 0.3.0",
- "embassy-time",
+ "embassy-sync 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "embassy-time 0.1.4",
  "embedded-io-async",
- "heapless",
+ "heapless 0.8.0",
  "hmac",
  "log",
  "pretty-hex",
@@ -2877,6 +2879,7 @@ dependencies = [
  "sunset",
  "sunset-embassy",
  "sunset-sshwire-derive",
+ "tokio",
 ]
 
 [[package]]
@@ -2892,31 +2895,29 @@ dependencies = [
  "cyw43-pio",
  "defmt",
  "defmt-rtt",
- "embassy-executor 0.3.2",
- "embassy-futures 0.1.1",
+ "embassy-executor",
+ "embassy-futures 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "embassy-net",
  "embassy-net-driver",
  "embassy-net-wiznet",
  "embassy-rp",
- "embassy-sync 0.3.0",
- "embassy-time",
+ "embassy-sync 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "embassy-time 0.2.0",
  "embassy-usb",
  "embassy-usb-driver",
- "embedded-hal 1.0.0-rc.1",
+ "embedded-hal 1.0.0-rc.3",
  "embedded-hal-async",
  "embedded-hal-bus",
  "embedded-io-async",
  "embedded-storage-async",
  "futures",
- "getrandom 0.2.10",
- "heapless",
+ "getrandom 0.2.11",
+ "heapless 0.8.0",
  "log",
  "panic-probe",
- "pin-utils",
  "pretty-hex",
  "rand 0.8.5",
  "sha2 0.10.8",
- "smoltcp",
  "snafu",
  "static_cell",
  "sunset",
@@ -2933,20 +2934,19 @@ dependencies = [
  "async-io",
  "atomic-polyfill 0.1.11",
  "critical-section 1.1.2",
- "embassy-executor 0.1.1",
- "embassy-futures 0.1.1",
+ "embassy-executor",
+ "embassy-futures 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "embassy-net",
  "embassy-net-tuntap",
- "embassy-sync 0.3.0",
- "embassy-time",
+ "embassy-sync 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "embassy-time 0.2.0",
  "embedded-io-async",
  "env_logger",
- "heapless",
+ "heapless 0.8.0",
  "libc",
  "log",
  "rand 0.8.5",
  "sha2 0.10.8",
- "static_cell",
  "sunset",
  "sunset-demo-embassy-common",
  "sunset-embassy",
@@ -2958,8 +2958,8 @@ version = "0.2.0-alpha"
 dependencies = [
  "atomic-polyfill 1.0.3",
  "defmt",
- "embassy-futures 0.1.1",
- "embassy-sync 0.3.0",
+ "embassy-futures 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "embassy-sync 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "embedded-io-async",
  "log",
  "pin-utils",
@@ -2986,9 +2986,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.37"
+version = "2.0.43"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8"
+checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3017,34 +3017,35 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.49"
+version = "1.0.52"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4"
+checksum = "83a48fd946b02c0a526b2e9481c8e2a17755e47039164a86c4070446e3a4614d"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.49"
+version = "1.0.52"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc"
+checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
 name = "time"
-version = "0.3.29"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe"
+checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
 dependencies = [
  "deranged",
  "itoa",
  "libc",
  "num_threads",
+ "powerfmt",
  "serde",
  "time-core",
  "time-macros",
@@ -3058,9 +3059,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
 
 [[package]]
 name = "time-macros"
-version = "0.2.15"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20"
+checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"
 dependencies = [
  "time-core",
 ]
@@ -3076,9 +3077,9 @@ dependencies = [
 
 [[package]]
 name = "tokio"
-version = "1.32.0"
+version = "1.35.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
+checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
 dependencies = [
  "backtrace",
  "bytes",
@@ -3088,20 +3089,20 @@ dependencies = [
  "parking_lot",
  "pin-project-lite",
  "signal-hook-registry",
- "socket2 0.5.4",
+ "socket2 0.5.5",
  "tokio-macros",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "tokio-macros"
-version = "2.1.0"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
 
 [[package]]
@@ -3205,9 +3206,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 
 [[package]]
 name = "volatile-register"
-version = "0.2.1"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6"
+checksum = "de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc"
 dependencies = [
  "vcell",
 ]
@@ -3232,9 +3233,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.87"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
 dependencies = [
  "cfg-if",
  "wasm-bindgen-macro",
@@ -3242,24 +3243,24 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.87"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
 dependencies = [
  "bumpalo",
  "log",
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.87"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -3267,28 +3268,28 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.87"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.87"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
 
 [[package]]
 name = "web-sys"
-version = "0.3.64"
+version = "0.3.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -3341,7 +3342,16 @@ version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.0",
 ]
 
 [[package]]
@@ -3350,13 +3360,28 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
 ]
 
 [[package]]
@@ -3365,42 +3390,84 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+
 [[package]]
 name = "windows_i686_gnu"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+
 [[package]]
 name = "windows_i686_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+
 [[package]]
 name = "x25519-dalek"
 version = "2.0.0-rc.3"
@@ -3413,9 +3480,9 @@ dependencies = [
 
 [[package]]
 name = "zeroize"
-version = "1.6.0"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
+checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
 dependencies = [
  "zeroize_derive",
 ]
@@ -3428,5 +3495,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.37",
+ "syn 2.0.43",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 5e459eae7b429dca9dee4bc4873821663a38c710..b7e71d27a12e2ea14f31d164d7f922f956594138 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,7 +24,7 @@ sunset-sshwire-derive = { version = "0.1", path = "sshwire-derive" }
 snafu = { version = "0.7", default-features = false, features = ["rust_1_61"] }
 # TODO: check that log macro calls disappear in no_std builds
 log = { version = "0.4" }
-heapless = "0.7.10"
+heapless = "0.8"
 
 # allows avoiding utf8 for SSH identifier names
 ascii = { version = "1.0", default-features = false }
@@ -88,22 +88,22 @@ 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 = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-time = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-# embassy-futures = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-rp = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-usb = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-# embassy-sync = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-usb-driver = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
+embassy-executor = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-time = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+# embassy-futures = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-rp = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-usb = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+# embassy-sync = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-usb-driver = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
 # for cyw43
-embassy-net = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-net-driver-channel = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-net-driver = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-net-tuntap = { git = "https://github.com/embassy-rs/embassy", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-
-cyw43 = { git = "https://github.com/embassy-rs/embassy/", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-cyw43-pio = { git = "https://github.com/embassy-rs/embassy/", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
-embassy-net-wiznet = { git = "https://github.com/embassy-rs/embassy/", rev = "78a7ee7ec48a6ed26d770165e777beb06e92777c" }
+embassy-net = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-net-driver-channel = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-net-driver = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-net-tuntap = { git = "https://github.com/embassy-rs/embassy", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+
+cyw43 = { git = "https://github.com/embassy-rs/embassy/", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+cyw43-pio = { git = "https://github.com/embassy-rs/embassy/", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
+embassy-net-wiznet = { git = "https://github.com/embassy-rs/embassy/", rev = "90e96d281f87efdbea3a1418f5354f14386a42e8" }
 
 # embassy-net = { path = "/home/matt/3rd/rs/embassy/embassy-net" }
 # embassy-net-driver = { path = "/home/matt/3rd/rs/embassy/embassy-net-driver" }
diff --git a/README.md b/README.md
index f6b410a9095595038f8c48ca66cb03f604c9486a..0333b19d22ec0db3ffe448f6559a8d34b848831e 100644
--- a/README.md
+++ b/README.md
@@ -50,14 +50,7 @@ Desirable:
 
 ## Rust versions
 
-At present `sunset` requires nightly Rust, in order to use async functions in
-the `Behaviour` traits. It is intended to switch to stable Rust once that
-feature stabilises.
-
-`sunset-embassy` requires a nightly Rust version, as required by Embassy. See the
-[embassy/rust-toolchain.toml](rust-toolchain.toml) for a known-good version.
-Once [async functions in traits](https://github.com/rust-lang/rust/issues/91611)
-becomes stable, Embassy should support stable Rust too.
+At present Sunset will build with latest stable (1.75 at time of writing).
 
 ## Safety
 
diff --git a/async/Cargo.toml b/async/Cargo.toml
index d060fd5f8e80a2ec63adaaaab076ad6e67be7ed0..cfd1c1048d39aca2497aa9d1c6a7b0d7769d3cbd 100644
--- a/async/Cargo.toml
+++ b/async/Cargo.toml
@@ -16,8 +16,8 @@ argh = "0.1"
 
 ssh-key = { version = "0.5", default-features = false, features = [ "std"] }
 
-embassy-sync = { version = "0.3.0" }
-embassy-futures = { version = "0.1.0" }
+embassy-sync = { version = "0.5" }
+embassy-futures = { version = "0.1" }
 
 embedded-io-async = "0.6"
 
@@ -28,7 +28,7 @@ futures = "0.3"
 libc = "0.2"
 nix = "0.26"
 
-heapless = "0.7.10"
+heapless = "0.8"
 
 # TODO
 pretty-hex = "0.3"
diff --git a/async/rust-toolchain.toml b/async/rust-toolchain.toml
index 0c21c9ba73d16cf56afcadfbd5d00812df58806e..9993e9361aa381f2f0ad51b26896ac652cdd91fa 100644
--- a/async/rust-toolchain.toml
+++ b/async/rust-toolchain.toml
@@ -1,3 +1,3 @@
 [toolchain]
-channel = "nightly-2023-11-01"
+channel = "stable"
 components = [ "rustfmt" ]
diff --git a/async/src/lib.rs b/async/src/lib.rs
index 2046324ed00050c970127525208433f9e1c82341..8702a4548a79ab5dba90d290f1bd06366e02f950 100644
--- a/async/src/lib.rs
+++ b/async/src/lib.rs
@@ -3,8 +3,6 @@
 // avoid mysterious missing awaits
 #![deny(unused_must_use)]
 
-#![feature(async_fn_in_trait)]
-
 mod pty;
 mod cmdline_client;
 mod knownhosts;
diff --git a/embassy/Cargo.toml b/embassy/Cargo.toml
index 540e5e3ee72dd56ed21aab756318c6209a8b074d..b7a863e177c0568a5b0a796357bcf1cd0ed2f546 100644
--- a/embassy/Cargo.toml
+++ b/embassy/Cargo.toml
@@ -7,8 +7,8 @@ categories = ["network-programming", "embedded", "no-std"]
 license = "0BSD"
 
 [dependencies]
-embassy-sync = { version = "0.3.0" }
-embassy-futures = { version = "0.1.0" }
+embassy-sync = { version = "0.5" }
+embassy-futures = { version = "0.1" }
 embedded-io-async = "0.6"
 atomic-polyfill = "1.0"
 pin-utils = { version = "0.1" }
diff --git a/embassy/demos/common/Cargo.toml b/embassy/demos/common/Cargo.toml
index 161933f9577c1a24cd5bd132a0e5ecb5919fbb8b..96cef121c5898aa6e43b839e9cbdcf7d4b85f5c1 100644
--- a/embassy/demos/common/Cargo.toml
+++ b/embassy/demos/common/Cargo.toml
@@ -9,13 +9,13 @@ sunset-embassy = { path = "../../" }
 sunset = { path = "../../.." }
 sunset-sshwire-derive = { version = "0.1", path = "../../../sshwire-derive" }
 
-embassy-sync = { version = "0.3.0" }
-embassy-net = { version = "0.2.0", features = ["tcp", "dhcpv4", "medium-ethernet", "nightly"] }
-embassy-net-driver = { version = "0.2.0" }
-embassy-futures = { version = "0.1.0" }
+embassy-sync = { version = "0.5" }
+embassy-net = { version = "0.2", features = ["tcp", "dhcpv4", "medium-ethernet"] }
+embassy-net-driver = { version = "0.2" }
+embassy-futures = { version = "0.1" }
 embassy-time = { version = "0.1" }
 
-heapless = "0.7.15"
+heapless = "0.8"
 # using local fork
 # menu = "0.3"
 embedded-io-async = "0.6"
@@ -34,5 +34,5 @@ sunset = { path = "../../..", features = ["std"] }
 tokio = { version = "1.25", features = ["full"] }
 
 [features]
-defmt = ["dep:defmt", "embedded-io-async/defmt-03"]
+defmt = ["dep:defmt", "embedded-io-async/defmt-03", "embassy-net/defmt"]
 log = ["embassy-net/log"]
diff --git a/embassy/demos/common/src/config.rs b/embassy/demos/common/src/config.rs
index 2dad30609c5b254cad3c51d053db26d87bfacb9f..1730dc1c6a01c13df5b92ae3a0cc8f505b09265c 100644
--- a/embassy/demos/common/src/config.rs
+++ b/embassy/demos/common/src/config.rs
@@ -83,8 +83,8 @@ impl SSHConfig {
     pub fn new() -> Result<Self> {
         let hostkey = SignKey::generate(KeyType::Ed25519, None)?;
 
-        let wifi_net = option_env!("WIFI_NET").unwrap_or("guest").into();
-        let wifi_pw = option_env!("WIFI_PW").map(|p| p.into());
+        let wifi_net: String::<32> = option_env!("WIFI_NET").unwrap_or("guest").try_into().trap()?;
+        let wifi_pw: Option<String::<63>> = option_env!("WIFI_PW").map(|s| s.try_into()).transpose().trap()?;
         let mac = random_mac()?;
         Ok(SSHConfig {
             hostkey,
@@ -363,9 +363,9 @@ mod tests {
                 Some(Ed25519PubKey { key: Blob([29u8; 32]) }),
                 Some(Ed25519PubKey { key: Blob([39u8; 32]) }),
             ],
-            wifi_net: core::str::from_utf8([b'a'; 32].as_slice()).unwrap().into(),
+            wifi_net: core::str::from_utf8([b'a'; 32].as_slice()).unwrap().try_into().unwrap(),
             wifi_pw: Some(
-                core::str::from_utf8([b'f'; 63].as_slice()).unwrap().into(),
+                core::str::from_utf8([b'f'; 63].as_slice()).unwrap().try_into().unwrap(),
             ),
             mac: [6, 2, 3, 4, 5, 6],
             ip4_static: Some(embassy_net::StaticConfigV4 {
diff --git a/embassy/demos/common/src/lib.rs b/embassy/demos/common/src/lib.rs
index a206af9c949d7b53bacc77195d0052018a1c7553..24cab1b76f8309d2a1711d0f971bfff40bd43b6e 100644
--- a/embassy/demos/common/src/lib.rs
+++ b/embassy/demos/common/src/lib.rs
@@ -1,8 +1,7 @@
 #![cfg_attr(not(any(feature = "std", test)), no_std)]
 
-#![feature(type_alias_impl_trait)]
-#![feature(async_fn_in_trait)]
-// #![allow(incomplete_features)]
+// avoid warning about Send for the time being
+#[allow(async_fn_in_trait)]
 
 mod server;
 
diff --git a/embassy/demos/common/src/server.rs b/embassy/demos/common/src/server.rs
index 725d13b1583e6c7136d960778c8604e96acf38f5..16b6da13771677fc7e36e5692824527930404490 100644
--- a/embassy/demos/common/src/server.rs
+++ b/embassy/demos/common/src/server.rs
@@ -26,25 +26,6 @@ use sunset_embassy::{SSHServer, SunsetMutex};
 
 use crate::SSHConfig;
 
-// #[macro_export]
-// macro_rules! singleton {
-//     ($val:expr) => {{
-//         type T = impl Sized;
-//         static STATIC_CELL: StaticCell<T> = StaticCell::new();
-//         STATIC_CELL.init($val)
-//     }};
-// }
-#[macro_export]
-macro_rules! singleton {
-    ($val:expr) => {{
-        type T = impl Sized;
-        static STATIC_CELL: StaticCell<T> = StaticCell::new();
-        let (x,) = STATIC_CELL.init(($val,));
-        x
-    }};
-}
-
-
 // common entry point
 pub async fn listener<D: Driver, S: DemoServer>(stack: &'static Stack<D>,
     config: &SunsetMutex<SSHConfig>,
diff --git a/embassy/demos/common/src/takepipe.rs b/embassy/demos/common/src/takepipe.rs
index 87f721dd8ad2ea06b74dcff485b6bed36f193441..995c8967a9c5cdc69c724929861a830ee4beda66 100644
--- a/embassy/demos/common/src/takepipe.rs
+++ b/embassy/demos/common/src/takepipe.rs
@@ -165,7 +165,8 @@ impl Read for TakeRead<'_> {
             if *c != self.counter {
                 return Err(sunset::Error::ChannelEOF);
             }
-            Ok(o.read(buf).await)
+            // OK unwrap, pipe.read() is infallible
+            Ok(o.read(buf).await.unwrap())
         };
 
         let r = select(
@@ -204,7 +205,8 @@ impl Write for TakeWrite<'_> {
             if *c != self.counter {
                 return Err(sunset::Error::ChannelEOF);
             }
-            Ok(o.write(buf).await)
+            // OK unwrap, pipe.write is infallible
+            Ok(o.write(buf).await.unwrap())
         };
 
         let r = select(
diff --git a/embassy/demos/picow/Cargo.toml b/embassy/demos/picow/Cargo.toml
index 0dc43180cecf9f485b8be4ef2ad1e555a13b0f39..2f636621063a5a8e7758f4c4ed7acb3205410c2a 100644
--- a/embassy/demos/picow/Cargo.toml
+++ b/embassy/demos/picow/Cargo.toml
@@ -16,16 +16,16 @@ cyw43-pio = { version = "0.1.0", optional = true }
 
 embassy-net-wiznet = { version = "0.1.0", optional = true }
 
-embassy-executor = { version = "0.3",  features = ["defmt", "integrated-timers", "executor-thread", "arch-cortex-m", "nightly"] }
-embassy-time = { version = "0.1",  features = ["defmt", "defmt-timestamp-uptime", "unstable-traits", "nightly"] }
-embassy-rp = { version = "0.1.0",  features = ["defmt", "unstable-traits", "nightly", "unstable-pac", "time-driver"] }
+embassy-executor = { version = "0.4",  features = ["defmt", "integrated-timers", "executor-thread", "arch-cortex-m"] }
+embassy-time = { version = "0.2",  features = ["defmt", "defmt-timestamp-uptime"] }
+embassy-rp = { version = "0.1",  features = ["defmt", "unstable-pac", "time-driver"] }
 # embassy-net/nightly is required for asynch::Read/Write on TcpReader/TcpWriter
-embassy-net = { version = "0.2.0", features = ["tcp", "dhcpv4", "medium-ethernet", "nightly"] }
-embassy-net-driver = { version = "0.2.0" }
-embassy-usb-driver = { version = "0.1.0" }
-embassy-sync = { version = "0.3.0" }
-embassy-futures = { version = "0.1.0" }
-embassy-usb = { version = "0.1.0" }
+embassy-net = { version = "0.2", features = ["tcp", "dhcpv4", "medium-ethernet"] }
+embassy-net-driver = { version = "0.2" }
+embassy-usb-driver = { version = "0.1" }
+embassy-sync = { version = "0.5" }
+embassy-futures = { version = "0.1" }
+embassy-usb = { version = "0.1" }
 atomic-polyfill = "0.1.5"
 static_cell = { version = "1.0", features = [ "nightly" ] }
 
@@ -46,28 +46,20 @@ embedded-hal-async = { version = "1.0.0-alpha.10" }
 embedded-hal-bus = { version = "0.1.0-rc.1", features = ["async"], optional = true }
 embedded-io-async = "0.6"
 embedded-storage-async = { version = "0.4.0" }
-heapless = "0.7.15"
-
-getrandom = { version = "0.2", default-features = false, features = ["custom"]}
-pin-utils = "0.1"
-
-# using local fork
-# menu = "0.3"
+heapless = "0.8"
 
 caprand = { git = "https://github.com/mkj/caprand" }
+getrandom = { version = "0.2", features = ["custom"] }
 
 critical-section = "1.1"
 rand = { version = "0.8", default-features = false, features = ["getrandom"] }
 sha2 = { version = "0.10", default-features = false }
 
-# for defmt feature
-smoltcp = { version = "0.10", default-features = false }
-
 usbd-hid = "0.6"
 
 [features]
 default = ["cyw43", "defmt", "sunset-demo-embassy-common/defmt" ]
-defmt = ["dep:defmt", "sunset/defmt", "sunset-embassy/defmt", "smoltcp/defmt"]
+defmt = ["dep:defmt", "sunset/defmt", "sunset-embassy/defmt"]
 
 # for pico w board
 cyw43 = ["dep:cyw43", "dep:cyw43-pio"]
diff --git a/embassy/demos/picow/rust-toolchain.toml b/embassy/demos/picow/rust-toolchain.toml
index 0c21c9ba73d16cf56afcadfbd5d00812df58806e..9993e9361aa381f2f0ad51b26896ac652cdd91fa 100644
--- a/embassy/demos/picow/rust-toolchain.toml
+++ b/embassy/demos/picow/rust-toolchain.toml
@@ -1,3 +1,3 @@
 [toolchain]
-channel = "nightly-2023-11-01"
+channel = "stable"
 components = [ "rustfmt" ]
diff --git a/embassy/demos/picow/src/main.rs b/embassy/demos/picow/src/main.rs
index 7e013be0b7e3e7bcbff041aed3f9415388811ec7..7ce795becd799e2161776de1d7116c8cc2db2377 100644
--- a/embassy/demos/picow/src/main.rs
+++ b/embassy/demos/picow/src/main.rs
@@ -1,8 +1,5 @@
 #![no_std]
 #![no_main]
-#![feature(type_alias_impl_trait)]
-#![feature(async_fn_in_trait)]
-// #![allow(incomplete_features)]
 
 #[allow(unused_imports)]
 #[cfg(not(feature = "defmt"))]
@@ -30,7 +27,6 @@ use embassy_sync::signal::Signal;
 use sunset::*;
 use sunset_embassy::{SSHServer, SunsetMutex};
 
-use crate::demo_common::singleton;
 pub(crate) use sunset_demo_embassy_common as demo_common;
 
 mod flashconfig;
@@ -75,19 +71,25 @@ async fn main(spawner: Spawner) {
     } else {
         flashconfig::load_or_create(&mut flash).await.unwrap()
     };
-    let flash = &*singleton!(SunsetMutex::new(flash));
-    let config = &*singleton!(SunsetMutex::new(config));
+    static FLASH: StaticCell<SunsetMutex<flashconfig::Fl>> = StaticCell::new();
+    let flash = FLASH.init(SunsetMutex::new(flash));
+    static CONFIG: StaticCell<SunsetMutex<SSHConfig>> = StaticCell::new();
+    let config = CONFIG.init(SunsetMutex::new(config));
 
     // A shared pipe to a local USB-serial (CDC)
+    static USBS: StaticCell<takepipe::TakePipeStorage> = StaticCell::new();
+    static USBP: StaticCell<takepipe::TakePipe> = StaticCell::new();
     let usb_pipe = {
-        let p = singleton!(takepipe::TakePipeStorage::new());
-        singleton!(p.build())
+        let p = USBS.init(Default::default());
+        USBP.init_with(|| p.build())
     };
 
     // A shared pipe to a local uart
+    static SERS: StaticCell<takepipe::TakePipeStorage> = StaticCell::new();
+    static SERP: StaticCell<takepipe::TakePipe> = StaticCell::new();
     let serial1_pipe = {
-        let s = singleton!(takepipe::TakePipeStorage::new());
-        singleton!(s.build())
+        let p = SERS.init(Default::default());
+        SERP.init_with(|| p.build())
     };
     spawner
         .spawn(serial::task(
@@ -101,10 +103,12 @@ async fn main(spawner: Spawner) {
         .unwrap();
 
     // Watchdog currently only used for triggering reset manually
-    let watchdog = singleton!(SunsetMutex::new(
+    static WD: StaticCell<SunsetMutex<embassy_rp::watchdog::Watchdog>> = StaticCell::new();
+    let watchdog = WD.init(SunsetMutex::new(
         embassy_rp::watchdog::Watchdog::new(p.WATCHDOG)
     ));
 
+    static STATE: StaticCell<GlobalState> = StaticCell::new();
     let state;
 
     // Spawn network tasks to handle incoming connections with demo_common::session()
@@ -120,8 +124,7 @@ async fn main(spawner: Spawner) {
         let net_mac = match stack.hardware_address() {
             HardwareAddress::Ethernet(EthernetAddress(eth)) => eth,
         };
-        let g = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac };
-        state = singleton!(g);
+        state = STATE.init_with(|| GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac });
         for _ in 0..NUM_LISTENERS {
             spawner.spawn(cyw43_listener(&stack, config, state)).unwrap();
         }
@@ -139,8 +142,7 @@ async fn main(spawner: Spawner) {
         let net_mac = match stack.hardware_address() {
             HardwareAddress::Ethernet(EthernetAddress(eth)) => eth,
         };
-        let g = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac };
-        state = singleton!(g);
+        state = STATE.init_with(|| GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac });
         for _ in 0..NUM_LISTENERS {
             spawner.spawn(w5500_listener(&stack, config, state)).unwrap();
         }
diff --git a/embassy/demos/picow/src/picowmenu.rs b/embassy/demos/picow/src/picowmenu.rs
index b8afd5a638f5cc7c85944676ccb9d8e41e235a48..203ab92942a72eacf477c9f5ad6e9aec7830c389 100644
--- a/embassy/demos/picow/src/picowmenu.rs
+++ b/embassy/demos/picow/src/picowmenu.rs
@@ -704,8 +704,10 @@ fn do_wifi_wpa2(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) {
             let _ = writeln!(out, "Too long pw");
             return;
         }
-        c.wifi_net = net.into();
-        c.wifi_pw = Some(pw.into())
+        // OK unwrap, checked length
+        c.wifi_net = net.try_into().unwrap();
+        // OK unwrap, checked length
+        c.wifi_pw = Some(pw.try_into().unwrap())
     });
     wifi_entry(context);
 }
@@ -795,5 +797,5 @@ pub(crate) async fn request_pw<E>(
     }
 
     let pw = core::str::from_utf8(&pw).map_err(|_| ())?;
-    return Ok(pw.into());
+    pw.try_into().map_err(|_| ())
 }
diff --git a/embassy/demos/picow/src/serial.rs b/embassy/demos/picow/src/serial.rs
index 4258cad75055a37e9aadb366544fb2a73eb23639..8dac629144f3cb87aa714131d67c1454ea165bb1 100644
--- a/embassy/demos/picow/src/serial.rs
+++ b/embassy/demos/picow/src/serial.rs
@@ -31,8 +31,10 @@ pub(crate) async fn task(
     pin_rts: PIN_3,
     pipe: &'static TakePipe<'static>,
 ) -> ! {
-    let tx_buf = singleton!([0u8; 16]).as_mut_slice();
-    let rx_buf = singleton!([0u8; 300]).as_mut_slice();
+    static TX_BUF: StaticCell<[u8; 16]> = StaticCell::new();
+    let tx_buf = TX_BUF.init(Default::default()).as_mut_slice();
+    static RX_BUF: StaticCell<[u8; 300]> = StaticCell::new();
+    let rx_buf = RX_BUF.init_with(|| [0u8; 300]).as_mut_slice();
     let uart = BufferedUart::new_with_rtscts(
         uart,
         Irqs,
diff --git a/embassy/demos/picow/src/usb.rs b/embassy/demos/picow/src/usb.rs
index e158ce77dcd1ffac4aed6214fe858b7433f606e0..cc8c636c491f612379e64c68bff69754095b07ce 100644
--- a/embassy/demos/picow/src/usb.rs
+++ b/embassy/demos/picow/src/usb.rs
@@ -53,6 +53,7 @@ pub(crate) async fn task(
     let mut device_descriptor = [0; 256];
     let mut config_descriptor = [0; 256];
     let mut bos_descriptor = [0; 256];
+    let mut msos_descriptor = [0; 16];
     let mut control_buf = [0; 64];
 
     // lives longer than builder
@@ -66,6 +67,7 @@ pub(crate) async fn task(
         &mut device_descriptor,
         &mut config_descriptor,
         &mut bos_descriptor,
+        &mut msos_descriptor,
         &mut control_buf,
     );
 
diff --git a/embassy/demos/picow/src/w5500.rs b/embassy/demos/picow/src/w5500.rs
index cf61fb555ca0c92c84c9a4eceecf1553f3e7b4b6..e045ab7a3a86608b79a80e9f9045de74147ee8aa 100644
--- a/embassy/demos/picow/src/w5500.rs
+++ b/embassy/demos/picow/src/w5500.rs
@@ -20,8 +20,7 @@ use embedded_hal_bus::spi::ExclusiveDevice;
 
 use embassy_net_wiznet::*;
 
-use static_cell::make_static;
-
+use static_cell::StaticCell;
 use rand::rngs::OsRng;
 use rand::RngCore;
 
@@ -63,7 +62,8 @@ pub(crate) async fn w5500_stack(
 
     let mac_addr = config.lock().await.mac;
     // 
-    let state = make_static!(State::<8, 8>::new());
+    static STATE: StaticCell<State<8, 8>> = StaticCell::new();
+    let state = STATE.init_with(|| State::new());
     let (device, runner) = embassy_net_wiznet::new(
         mac_addr,
         state,
@@ -84,15 +84,17 @@ pub(crate) async fn w5500_stack(
     let seed = OsRng.next_u64();
 
     // Init network stack
-    let stack = &*make_static!(Stack::new(
+    static SR: StaticCell<StackResources::<{crate::NUM_SOCKETS}>> = StaticCell::new();
+    static STACK: StaticCell<Stack<embassy_net_wiznet::Device>> = StaticCell::new();
+    let stack = STACK.init_with(|| Stack::new(
         device,
         config,
-        make_static!(StackResources::<{ crate::NUM_SOCKETS }>::new()),
+        SR.init_with(|| StackResources::new()),
         seed
     ));
 
     // Launch network task
-    spawner.spawn(net_task(&stack)).unwrap();
+    spawner.spawn(net_task(stack)).unwrap();
 
     stack
 }
diff --git a/embassy/demos/picow/src/wifi.rs b/embassy/demos/picow/src/wifi.rs
index f0492c03f80b25ef5226c526cf3e1ad822c7e505..e0444362e45bbde3b7351212087454986a473f6e 100644
--- a/embassy/demos/picow/src/wifi.rs
+++ b/embassy/demos/picow/src/wifi.rs
@@ -26,7 +26,6 @@ use static_cell::StaticCell;
 use rand::rngs::OsRng;
 use rand::RngCore;
 
-use crate::demo_common::singleton;
 use crate::{SunsetMutex, SSHConfig};
 
 bind_interrupts!(struct Irqs {
@@ -60,7 +59,8 @@ pub(crate) async fn wifi_stack(spawner: &Spawner,
     let mut pio = Pio::new(pio0, Irqs);
     let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p24, p29, dma);
 
-    let state = singleton!(cyw43::State::new());
+    static STATE: StaticCell<cyw43::State> = StaticCell::new();
+    let state = STATE.init_with(|| cyw43::State::new());
     let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
     spawner.spawn(wifi_task(runner)).unwrap();
 
@@ -99,16 +99,18 @@ pub(crate) async fn wifi_stack(spawner: &Spawner,
 
     let seed = OsRng.next_u64();
 
+    static SR: StaticCell<StackResources::<{crate::NUM_SOCKETS}>> = StaticCell::new();
+
     // Init network stack
-    let stack = Stack::new(
+    static STACK: StaticCell<Stack<cyw43::NetDriver>> = StaticCell::new();
+    let stack = STACK.init_with(|| Stack::new(
         net_device,
         config,
-        singleton!(StackResources::<{crate::NUM_SOCKETS}>::new()),
-        seed
+        SR.init_with(|| StackResources::new()),
+        seed)
     );
 
-    let stack = &*singleton!(stack);
-    spawner.spawn(net_task(&stack)).unwrap();
+    spawner.spawn(net_task(stack)).unwrap();
 
     stack
 }
diff --git a/embassy/demos/std/Cargo.toml b/embassy/demos/std/Cargo.toml
index 06396b13d3dd263d5f9e8c0a835fd59a6fd3732f..6883315f02f48e25486bc6d0a03ed2af71e4a818 100644
--- a/embassy/demos/std/Cargo.toml
+++ b/embassy/demos/std/Cargo.toml
@@ -4,21 +4,21 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
-embassy-executor = { version = "0.1.0",  default-features=false, features = ["log", "std", "nightly", "integrated-timers"] }
-embassy-time = { version = "0.1",  default-features=false, features = ["log", "std"] }
+# 131072 was determined empirically
+embassy-executor = { version = "0.4",  features = ["log", "arch-std", "integrated-timers", "executor-thread", "task-arena-size-131072"] }
+embassy-time = { version = "0.2",  default-features=false, features = ["log", "std"] }
 # embassy-net/nightly is required for asynch::Read/Write on TcpReader/TcpWriter
-embassy-net = { version = "0.2.0", features = ["tcp", "dhcpv4", "medium-ethernet", "nightly"] }
-embassy-net-tuntap = { version = "0.1.0" }
-embassy-sync = { version = "0.3.0" }
-embassy-futures = { version = "0.1.0" }
+embassy-net = { version = "0.2", features = ["tcp", "dhcpv4", "medium-ethernet"] }
+embassy-net-tuntap = { version = "0.1" }
+embassy-sync = { version = "0.5" }
+embassy-futures = { version = "0.1" }
 atomic-polyfill = "0.1.5"
-static_cell = "1.0"
 
 log = { version = "0.4" }
 env_logger = "0.9.0"
 
 embedded-io-async = "0.6"
-heapless = "0.7.15"
+heapless = "0.8"
 
 # for tuntap
 libc = "0.2.101"
diff --git a/embassy/demos/std/rust-toolchain.toml b/embassy/demos/std/rust-toolchain.toml
index 0c21c9ba73d16cf56afcadfbd5d00812df58806e..9993e9361aa381f2f0ad51b26896ac652cdd91fa 100644
--- a/embassy/demos/std/rust-toolchain.toml
+++ b/embassy/demos/std/rust-toolchain.toml
@@ -1,3 +1,3 @@
 [toolchain]
-channel = "nightly-2023-11-01"
+channel = "stable"
 components = [ "rustfmt" ]
diff --git a/embassy/demos/std/src/main.rs b/embassy/demos/std/src/main.rs
index fdef7a556d386fa2cf6907100f83c9e6d87055a8..8188b1a499bc2ede460f65972c327b08aefc5fe3 100644
--- a/embassy/demos/std/src/main.rs
+++ b/embassy/demos/std/src/main.rs
@@ -1,15 +1,11 @@
-#![feature(type_alias_impl_trait)]
-#![feature(async_fn_in_trait)]
-#![allow(incomplete_features)]
 
 #[allow(unused_imports)]
 use {
     log::{debug, error, info, log, trace, warn},
 };
 
-use embassy_executor::{Spawner, Executor};
+use embassy_executor::Spawner;
 use embassy_net::{Stack, StackResources};
-use static_cell::StaticCell;
 
 use rand::rngs::OsRng;
 use rand::RngCore;
@@ -25,7 +21,6 @@ use sunset_embassy::{SSHServer, SunsetMutex};
 
 mod setupmenu;
 pub(crate) use sunset_demo_embassy_common as demo_common;
-use crate::demo_common::singleton;
 
 use demo_common::{SSHConfig, demo_menu, DemoServer};
 
@@ -43,11 +38,11 @@ async fn main_task(spawner: Spawner) {
     // TODO config
     let opt_tap0 = "tap0";
 
-    let config = &*singleton!(  {
+    let config = Box::leak(Box::new({
         let mut config = SSHConfig::new().unwrap();
         config.set_console_pw(Some("pw")).unwrap();
         SunsetMutex::new(config)
-    } );
+    }));
 
     let net_config = if let Some(ref s) = config.lock().await.ip4_static {
         embassy_net::Config::ipv4_static(s.clone())
@@ -61,12 +56,13 @@ async fn main_task(spawner: Spawner) {
     let seed = OsRng.next_u64();
 
     // Init network stack
-    let stack = &*singleton!(Stack::new(
+    let res = Box::leak(Box::new(StackResources::<NUM_SOCKETS>::new()));
+    let stack = Box::leak(Box::new(Stack::new(
         device,
         net_config,
-        singleton!(StackResources::<NUM_SOCKETS>::new()),
+        res,
         seed
-    ));
+    )));
 
     // Launch network task
     spawner.spawn(net_task(stack)).unwrap();
@@ -140,10 +136,8 @@ async fn listener(stack: &'static Stack<TunTapDevice>,
     demo_common::listener::<_, StdDemo>(stack, config, ()).await
 }
 
-
-static EXECUTOR: StaticCell<Executor> = StaticCell::new();
-
-fn main() {
+#[embassy_executor::main]
+async fn main(spawner: Spawner) {
     env_logger::builder()
         .filter_level(log::LevelFilter::Trace)
         .filter_module("sunset::runner", log::LevelFilter::Info)
@@ -156,8 +150,5 @@ fn main() {
         .format_timestamp_nanos()
         .init();
 
-    let executor = EXECUTOR.init(Executor::new());
-    executor.run(|spawner| {
-        spawner.spawn(main_task(spawner)).unwrap();
-    });
+    spawner.spawn(main_task(spawner)).unwrap();
 }
diff --git a/embassy/rust-toolchain.toml b/embassy/rust-toolchain.toml
index 0c21c9ba73d16cf56afcadfbd5d00812df58806e..9993e9361aa381f2f0ad51b26896ac652cdd91fa 100644
--- a/embassy/rust-toolchain.toml
+++ b/embassy/rust-toolchain.toml
@@ -1,3 +1,3 @@
 [toolchain]
-channel = "nightly-2023-11-01"
+channel = "stable"
 components = [ "rustfmt" ]
diff --git a/embassy/src/lib.rs b/embassy/src/lib.rs
index d29e242456bff54373c50237363b7de993bae31a..48143e7b8a1785377d577a9918c1f66aace952f8 100644
--- a/embassy/src/lib.rs
+++ b/embassy/src/lib.rs
@@ -1,6 +1,4 @@
 #![no_std]
-#![feature(async_fn_in_trait)]
-#![allow(incomplete_features)]
 
 #![forbid(unsafe_code)]
 
diff --git a/rust-toolchain.toml b/rust-toolchain.toml
index 0c21c9ba73d16cf56afcadfbd5d00812df58806e..9993e9361aa381f2f0ad51b26896ac652cdd91fa 100644
--- a/rust-toolchain.toml
+++ b/rust-toolchain.toml
@@ -1,3 +1,3 @@
 [toolchain]
-channel = "nightly-2023-11-01"
+channel = "stable"
 components = [ "rustfmt" ]
diff --git a/testing/ci.sh b/testing/ci.sh
index 737b6cf5a7f0447b10f84f64f8e7efca5665751d..246e4a9de29ca9f495a47632ad66066f8d31d2d8 100755
--- a/testing/ci.sh
+++ b/testing/ci.sh
@@ -26,17 +26,17 @@ if [ -z "$OFFLINE" ]; then
     )
 fi
 
-# stable - disabled now due to async fn in Behaviour
-#cargo test
+# stable
+cargo test
 # build non-testing, will be no_std
-#cargo build
-cargo +nightly build
+cargo build
+cargo doc
+cargo test --doc
+
 # nightly
+cargo +nightly build
 cargo +nightly test
 
-cargo +nightly doc
-cargo +nightly test --doc
-
 (
 cd async
 # only test lib since some examples are broken