diff --git a/async/src/cmdline_client.rs b/async/src/cmdline_client.rs
index 32e4763d68879cd10500c48a9944494417f9f98f..a7e0f786edffecc6fbd12bf6455af77c5c53f952 100644
--- a/async/src/cmdline_client.rs
+++ b/async/src/cmdline_client.rs
@@ -320,7 +320,6 @@ impl<'a> CmdlineClient<'a> {
                             // TODO is there a better way
                             launch_chan.send((io.clone().unwrap(), extin.clone(), self.pty_guard.take())).await;
                         }
-                        CliEvent::PollAgain => (),
                         CliEvent::Defunct => {
                             break Ok::<_, Error>(())
                         }
diff --git a/embassy/demos/common/src/server.rs b/embassy/demos/common/src/server.rs
index ff52045474e9fbd7b4d1a0c86dbc567c75816240..84929505438d6550b154ccfc39792ea82edb5a16 100644
--- a/embassy/demos/common/src/server.rs
+++ b/embassy/demos/common/src/server.rs
@@ -117,7 +117,7 @@ impl ServerApp {
     }
 
     // Handles most events except for channel open and Defunct
-    pub fn handle_event(&mut self, event: ServEvent<'_, '_>) -> Result<()> {
+    pub fn handle_event<'f>(&mut self, event: ServEvent<'_, '_>) -> Result<()> {
         match event {
             ServEvent::Hostkeys(h) => h.hostkeys(&[&self.config.hostkey]),
             ServEvent::AuthMethods(a) => {
@@ -132,7 +132,7 @@ impl ServerApp {
             | ServEvent::PubkeyAuth(_)
             // should be handled by the caller.
             | ServEvent::Defunct
-             => Err(error::BadUsage.fail()),
+             => error::BadUsage.fail(),
         }
     }
 
@@ -152,8 +152,8 @@ impl ServerApp {
             &self.config.console_pw
         };
         let p = match p {
-            Ok(u) => u,
-            Err(_) => return Ok(()),
+            Some(u) => u,
+            None => return Ok(()),
         };
 
         if p.check(password) {
@@ -167,15 +167,14 @@ impl ServerApp {
     }
 
     fn handle_authmethods(&self, a: ServAuthMethods) -> Result<()> {
-        let let Some(username) = match a.username() {
-            if !self.is_admin(username) && self.config.console_noauth {
-                info!("Allowing auth for user {}", username.as_str().unwrap_or("bad"));
-                // self.shell.authed(username.as_str().unwrap_or("")).await;
-                return a.allow_immediately();
-            };
+        let username = a.username()?;
+        if !self.is_admin(username) && self.config.console_noauth {
+            info!("Allowing auth for user {username}");
+            // self.shell.authed(username.as_str().unwrap_or("")).await;
+            return a.allow_immediately();
         };
 
-        a.pubkey().password()
+        // a.pubkey().password()
         Ok(())
     }
 
@@ -184,64 +183,65 @@ impl ServerApp {
     }
 }
 
-impl ServBehaviour for ServerApp {
-
-    fn hostkeys(&mut self) -> BhResult<heapless::Vec<&SignKey, 2>> {
-        // OK unwrap: only one element
-        Ok(heapless::Vec::from_slice(&[&self.config.hostkey]).unwrap())
-    }
-
-    async fn auth_unchallenged(&mut self, username: TextString<'_>) -> bool {
-    }
-
-    fn have_auth_password(&self, username: TextString) -> bool {
-        if self.is_admin(username) {
-            self.config.admin_pw.is_some()
-        } else {
-            self.config.console_pw.is_some()
-        }
-    }
-
-    fn have_auth_pubkey(&self, username: TextString) -> bool {
-        if self.is_admin(username) {
-            self.config.admin_keys.iter().any(|k| k.is_some())
-        } else {
-            self.config.console_keys.iter().any(|k| k.is_some())
-        }
-    }
-
-    fn open_session(&mut self, chan: ChanHandle) -> ChanOpened {
-        if self.sess.is_some() {
-            ChanOpened::Failure((ChanFail::SSH_OPEN_ADMINISTRATIVELY_PROHIBITED, chan))
-        } else {
-            self.sess = Some(chan.num());
-            self.handle = Some(chan);
-            ChanOpened::Success
-        }
-    }
-
-    fn sess_shell(&mut self, chan: ChanNum) -> bool {
-        if self.sess != Some(chan) {
-            return false
-        }
-
-        if let Some(handle) = self.handle.take() {
-            debug_assert_eq!(self.sess, Some(handle.num()));
-            // self.shell.open_shell(handle);
-            true
-        } else {
-            false
-        }
-    }
-
-    fn sess_pty(&mut self, chan: ChanNum, _pty: &Pty) -> bool {
-        self.sess == Some(chan)
-    }
-
-    fn disconnected(&mut self, desc: TextString) {
-        info!("Disconnect by client: {}", desc.as_str().unwrap_or("bad"));
-    }
-}
+// impl ServBehaviour for ServerApp {
+
+//     fn hostkeys(&mut self) -> BhResult<heapless::Vec<&SignKey, 2>> {
+//         // OK unwrap: only one element
+//         Ok(heapless::Vec::from_slice(&[&self.config.hostkey]).unwrap())
+//     }
+
+//     async fn auth_unchallenged(&mut self, username: TextString<'_>) -> bool {
+//     }
+
+//     fn have_auth_password(&self, username: TextString) -> bool {
+//         if self.is_admin(username) {
+//             self.config.admin_pw.is_some()
+//         } else {
+//             self.config.console_pw.is_some()
+//         }
+//     }
+
+//     fn have_auth_pubkey(&self, username: TextString) -> bool {
+//         todo!();
+//         // if self.is_admin(username) {
+//         //     self.config.admin_keys.iter().any(|k| k.is_some())
+//         // } else {
+//         //     self.config.console_keys.iter().any(|k| k.is_some())
+//         // }
+//     }
+
+//     fn open_session(&mut self, chan: ChanHandle) -> ChanOpened {
+//         if self.sess.is_some() {
+//             ChanOpened::Failure((ChanFail::SSH_OPEN_ADMINISTRATIVELY_PROHIBITED, chan))
+//         } else {
+//             self.sess = Some(chan.num());
+//             self.handle = Some(chan);
+//             ChanOpened::Success
+//         }
+//     }
+
+//     fn sess_shell(&mut self, chan: ChanNum) -> bool {
+//         if self.sess != Some(chan) {
+//             return false
+//         }
+
+//         if let Some(handle) = self.handle.take() {
+//             debug_assert_eq!(self.sess, Some(handle.num()));
+//             // self.shell.open_shell(handle);
+//             true
+//         } else {
+//             false
+//         }
+//     }
+
+//     fn sess_pty(&mut self, chan: ChanNum, _pty: &Pty) -> bool {
+//         self.sess == Some(chan)
+//     }
+
+//     fn disconnected(&mut self, desc: TextString) {
+//         info!("Disconnect by client: {}", desc.as_str().unwrap_or("bad"));
+//     }
+// }
 
 pub trait DemoServer {
     /// State to be passed to each new connection by the server
diff --git a/embassy/demos/std/src/main.rs b/embassy/demos/std/src/main.rs
index c696b8d21f37decf993ceca6f0f11e88304fd9ed..e8b102fdb3e578067f6d5242ab94b070b43a3cec 100644
--- a/embassy/demos/std/src/main.rs
+++ b/embassy/demos/std/src/main.rs
@@ -17,7 +17,7 @@ use embassy_sync::blocking_mutex::raw::NoopRawMutex;
 use embassy_net_tuntap::TunTapDevice;
 
 use sunset::{event::ServEventId, *};
-use sunset_embassy::{SSHServer, SunsetMutex};
+use sunset_embassy::{SSHServer, SunsetMutex, ProgressHolder};
 
 mod setupmenu;
 pub(crate) use sunset_demo_embassy_common as demo_common;
@@ -93,10 +93,10 @@ impl DemoServer for StdDemo {
         let prog_loop = async {
 
             loop {
-                let mut ph = serv.progress().await?;
-                match ph.event()? {
+                let mut ph = ProgressHolder::new();
+                match serv.progress(&mut ph).await? {
                     other => common.handle_event(other)?,
-                }
+                };
             }
 
             // // wait for a shell to start
diff --git a/embassy/src/client.rs b/embassy/src/client.rs
index 650e58916411d2bc5c9f067976d405bafd4a1063..9dff28a32085150e38881d1ebfd1506dce3e9eca 100644
--- a/embassy/src/client.rs
+++ b/embassy/src/client.rs
@@ -46,8 +46,6 @@ impl<'a> SSHClient<'a> {
         -> Result<CliEvent<'f, 'a>> {
         match self.sunset.progress(ph).await? {
             Event::Cli(x) => Ok(x),
-            // workaround, seem comment where Progressed is emitted
-            Event::Progressed => Ok(CliEvent::PollAgain),
             _ => Err(Error::bug()),
         }
     }
diff --git a/embassy/src/server.rs b/embassy/src/server.rs
index 3f173dca8c9cb389b2bcb6972dfb88f4635b45ef..ccbac1a6980bf9b62abc356d7a6b0c0e8b4c69f4 100644
--- a/embassy/src/server.rs
+++ b/embassy/src/server.rs
@@ -40,8 +40,8 @@ impl<'a> SSHServer<'a> {
     ///
     /// Note that the returned `ProgressHolder` holds a mutex over the session,
     /// so other calls to `SSHServer` may block until it is dropped.
-    pub async fn progress<'g, 's: 'g>(&'g self, ph: &'g mut ProgressHolder<'g, 'a>) 
-        -> Result<ServEvent<'g, 'a>> {
+    pub async fn progress<'g, 'f>(&'g self, ph: &'f mut ProgressHolder<'g, 'a>)
+        -> Result<ServEvent<'f, 'a>> {
 
         // poll until we get an actual event to return
         match self.sunset.progress(ph).await? {
diff --git a/src/event.rs b/src/event.rs
index 3138710a4cafb3c18e71abbb8bf56a2b1a095060..facfccee95785385af14d9f5548ceb28faa2e3f9 100644
--- a/src/event.rs
+++ b/src/event.rs
@@ -59,10 +59,6 @@ pub enum CliEvent<'g, 'a>
     Authenticated,
     SessionOpened(CliSessionOpener<'g, 'a>),
     Defunct,
-    /// Caller should run `.progress()` again.
-    ///
-    /// This is a workaround.
-    PollAgain,
 
     // Hostkey { /* todo */ },
 }
@@ -76,7 +72,6 @@ impl Debug for CliEvent<'_, '_> {
             Self::Authenticated => "Authenticated",
             Self::SessionOpened(_) => "SessionOpened",
             Self::Defunct => "Defunct",
-            Self::PollAgain => "PollAgain",
         };
         write!(f, "CliEvent({e})")
     }
@@ -184,10 +179,6 @@ pub enum ServEvent<'g, 'a> {
     PasswordAuth(ServPasswordAuth<'g, 'a>),
     PubkeyAuth(ServPubkeyAuth<'g, 'a>),
     Defunct,
-    /// Caller should run `.progress()` again.
-    ///
-    /// This is a workaround.
-    PollAgain,
 }
 
 impl Debug for ServEvent<'_, '_> {
@@ -198,7 +189,6 @@ impl Debug for ServEvent<'_, '_> {
             Self::PasswordAuth(_) => "PasswordAuth",
             Self::PubkeyAuth(_) => "PubkeyAuth",
             Self::Defunct => "Defunct",
-            Self::PollAgain => "PollAgain",
         };
         write!(f, "ServEvent({e})")
     }