diff --git a/embassy/demos/picow/src/main.rs b/embassy/demos/picow/src/main.rs
index 47d64ea8e8f0d8c2484eb6eba3757d3f0a79b607..9603fd6a43923d12c1a8815fce79db9e1d4de4eb 100644
--- a/embassy/demos/picow/src/main.rs
+++ b/embassy/demos/picow/src/main.rs
@@ -105,12 +105,8 @@ async fn main(spawner: Spawner) {
         embassy_rp::watchdog::Watchdog::new(p.WATCHDOG)
     ));
 
-    let state = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog };
-    let state = singleton!(state);
+    let state;
 
-    spawner.spawn(usbserial::task(p.USB, state)).unwrap();
-
-    // spawn the wifi stack
     #[cfg(feature = "cyw43")]
     {
         let stack = wifi::wifi_stack(
@@ -119,12 +115,15 @@ async fn main(spawner: Spawner) {
         )
         .await;
 
+        let net_mac = stack.ethernet_address();
+        let g = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac };
+        state = singleton!(g);
         for _ in 0..NUM_LISTENERS {
             spawner.spawn(cyw43_listener(&stack, config, state)).unwrap();
         }
     }
 
-    // spawn the ethernet stack
+
     #[cfg(feature = "w5500")]
     {
         let stack = w5500::w5500_stack(
@@ -133,10 +132,15 @@ async fn main(spawner: Spawner) {
         )
         .await;
 
+        let net_mac = stack.ethernet_address();
+        let g = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac };
+        state = singleton!(g);
         for _ in 0..NUM_LISTENERS {
             spawner.spawn(w5500_listener(&stack, config, state)).unwrap();
         }
     }
+
+    spawner.spawn(usbserial::task(p.USB, state)).unwrap();
 }
 
 // TODO: pool_size should be NUM_LISTENERS but needs a literal
@@ -170,6 +174,8 @@ pub(crate) struct GlobalState {
         embassy_rp::flash::Flash<'static, FLASH, { flashconfig::FLASH_SIZE }>,
     >,
     pub watchdog: &'static SunsetMutex<embassy_rp::watchdog::Watchdog>,
+
+    pub net_mac: [u8; 6],
 }
 
 struct DemoShell {
diff --git a/embassy/demos/picow/src/picowmenu.rs b/embassy/demos/picow/src/picowmenu.rs
index 58c54922f1ab80729958ad10d0dee58b5e05c337..6088c77913ca5cc7b87f944ff7abd7001b0b9124 100644
--- a/embassy/demos/picow/src/picowmenu.rs
+++ b/embassy/demos/picow/src/picowmenu.rs
@@ -9,7 +9,7 @@ pub use log::{debug, error, info, log, trace, warn};
 #[cfg(feature = "defmt")]
 pub use defmt::{debug, error, info, panic, trace, warn};
 
-use core::fmt::Write;
+use core::fmt::{Write, Debug, Display};
 use core::future::{poll_fn, Future};
 use core::ops::DerefMut;
 use core::sync::atomic::Ordering::{Relaxed, SeqCst};
@@ -23,6 +23,8 @@ use embassy_net::{Ipv4Cidr, Ipv4Address};
 
 use heapless::{String, Vec};
 
+use pretty_hex::PrettyHex;
+
 use crate::demo_common;
 use crate::flashconfig;
 use crate::GlobalState;
@@ -723,9 +725,29 @@ fn do_wifi_open(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) {
     wifi_entry(context);
 }
 
+struct Mac([u8; 6]);
+
+impl Display for Mac {
+    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+        write!(f, "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}",
+            self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5])
+    }
+}
+
 fn do_net_info(_item: &Item<MenuCtx>, _args: &[&str], context: &mut MenuCtx) {
+    #[cfg(feature = "w5500")]
+    let _ = writeln!(context.out, "w5500 wired ethernet");
+    #[cfg(feature = "cyw43")]
+    let _ = writeln!(context.out, "cyw43 wifi");
+    let _ = writeln!(context.out, "mac address {}", Mac(context.state.net_mac));
+
     context.with_config(|c, out| {
-        let _ = write!(out, "wired mac {:x?} ", c.mac);
+        if let Some(ref stat) = c.ip4_static {
+            let _ = writeln!(out, "static ip4 {stat:?}");
+        } else {
+            // TODO the actual address
+            let _ = writeln!(out, "Using dhcp");
+        }
     });
 }
 
@@ -733,6 +755,7 @@ fn do_net_dhcp(_item: &Item<MenuCtx>, _args: &[&str], context: &mut MenuCtx) {
     context.with_config(|c, out| {
         c.ip4_static = None;
     });
+    context.need_save = true;
 }
 
 fn do_net_static(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) {
@@ -756,6 +779,7 @@ fn do_net_static(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) {
             }
         }
     });
+    context.need_save = true;
 }
 
 // Returns an error on EOF etc.