diff --git a/async/src/async_door.rs b/async/src/async_door.rs
index 9dd764cc375e9ddf9fe462936cee16d94dc8c8fa..a76f3d58d4189cbfbc697dad844ff3ec64eee74d 100644
--- a/async/src/async_door.rs
+++ b/async/src/async_door.rs
@@ -19,7 +19,7 @@ use core::ops::DerefMut;
 use std::sync::Arc;
 
 use door_sshproto as door;
-use door::{Runner, Result, Event, ChanEvent, Behaviour};
+use door::{Runner, Result, Behaviour};
 
 use pretty_hex::PrettyHex;
 
diff --git a/sshproto/src/channel.rs b/sshproto/src/channel.rs
index 5fd560f1b5163dfcab781f091631f282268e736d..175a2e10e328b07627a7f67c491bf931ba3ae686 100644
--- a/sshproto/src/channel.rs
+++ b/sshproto/src/channel.rs
@@ -30,7 +30,7 @@ pub enum ChanOpened {
 pub(crate) struct Channels {
     ch: [Option<Channel>; config::MAX_CHANNELS],
 
-    /// The size of data last set with `ChanEvent::DataIn`.
+    /// The size of channel data last set with `DataIn`.
     pending_input: Option<PendInput>,
 }
 
@@ -252,7 +252,7 @@ impl Channels {
         let r = match &p.ty {
             ChannelOpenType::Session => {
                 // unwrap: earlier test ensures b.server() succeeds
-                let mut bserv = b.server().unwrap();
+                let bserv = b.server().unwrap();
                 bserv.open_session(ch.num())
             }
             ChannelOpenType::ForwardedTcpip(t) => b.open_tcp_forwarded(ch.num(), t),
@@ -319,7 +319,7 @@ impl Channels {
     ) -> Result<Dispatched> {
         trace!("chan dispatch");
         let mut disp = Dispatched(None);
-        let r = match packet {
+        match packet {
             Packet::ChannelOpen(p) => {
                 self.dispatch_open(&p, s, b)?;
             }
@@ -481,7 +481,7 @@ impl TryFrom<&packets::Pty<'_>> for Pty {
     type Error = Error;
     fn try_from(p: &packets::Pty) -> Result<Self, Self::Error> {
         warn!("TODO implement pty modes");
-        let term = p.term.as_ascii()?.try_into().map_err(|e| Error::BadString)?;
+        let term = p.term.as_ascii()?.try_into().map_err(|_| Error::BadString)?;
         Ok(Pty {
             term,
             cols: p.cols,
@@ -668,7 +668,7 @@ impl Channel {
     fn dispatch_server_request(
         &self,
         p: &packets::ChannelRequest,
-        s: &mut TrafSend,
+        _s: &mut TrafSend,
         b: &mut dyn ServBehaviour,
     ) -> Result<bool> {
         if !matches!(self.ty, ChanType::Session) {
@@ -749,88 +749,6 @@ pub(crate) struct DataIn {
     pub len: usize,
 }
 
-/// Application API
-#[derive(Debug)]
-pub enum ChanEvent<'a> {
-    // TODO: perhaps this one should go a level above since it isn't for existing channels?
-    OpenSuccess { num: u32 },
-
-    // TODO details
-    // OpenRequest { },
-    ReqPty { num: u32, want_reply: bool, pty: packets::Pty<'a> },
-
-    Req { num: u32, req: ChannelReqType<'a> },
-    // TODO closein/closeout/eof, etc. Should also return the exit status etc
-    Eof { num: u32 },
-
-    Close { num: u32 },
-    // TODO: responses to a previous ChanMsg?
-}
-
-/// An event returned from `Channel::dispatch()`.
-/// Most are propagated to the application, `DataIn is caught by `runner`
-#[derive(Debug)]
-pub(crate) enum ChanEventMaker {
-    /// Channel data is ready with `channel_input()`. This breaks the `Packet` abstraction
-    /// by returning the offset into the payload buffer, used by `traffic`.
-    DataIn(DataIn),
-
-    OpenSuccess {
-        num: u32,
-    },
-
-    // A ChannelRequest. Will be split into separate ChanEvent variants
-    // for each type.
-    Req,
-    // TODO closein/closeout/eof, etc. Should also return the exit status etc
-    Eof {
-        num: u32,
-    },
-
-    Close {
-        num: u32,
-    },
-    // TODO: responses to a previous ChanMsg?
-}
-
-impl ChanEventMaker {
-    // To be called on the same packet that created the ChanEventMaker.
-    pub fn make<'p>(&self, packet: Packet<'p>) -> Option<ChanEvent<'p>> {
-        match self {
-            // Datain is handled at the traffic level, not propagated as an Event
-            Self::DataIn(_) => {
-                debug!("DataIn should not be reached");
-                None
-            }
-            Self::OpenSuccess { num } => Some(ChanEvent::OpenSuccess { num: *num }),
-            Self::Req => {
-                if let Packet::ChannelRequest(ChannelRequest {
-                    num,
-                    want_reply,
-                    req,
-                }) = packet
-                {
-                    match req {
-                        ChannelReqType::Pty(pty) => {
-                            Some(ChanEvent::ReqPty { num, want_reply, pty })
-                        }
-                        _ => {
-                            warn!("Unhandled {:?}", self);
-                            None
-                        }
-                    }
-                } else {
-                    // TODO: return a bug result?
-                    warn!("Req event maker but not request packet");
-                    None
-                }
-            }
-            Self::Eof { num } => Some(ChanEvent::Eof { num: *num }),
-            Self::Close { num } => Some(ChanEvent::Close { num: *num }),
-        }
-    }
-}
-
 struct PendInput {
     chan: u32,
     len: usize,
diff --git a/sshproto/src/conn.rs b/sshproto/src/conn.rs
index fc1e941d2db3c83b447a669e6f953d87725c40a9..b18de6a5a54833d1f3bdb4fc66fdfdecb5a04416 100644
--- a/sshproto/src/conn.rs
+++ b/sshproto/src/conn.rs
@@ -18,7 +18,7 @@ use encrypt::KeyState;
 use packets::{Packet,ParseContext};
 use server::Server;
 use traffic::TrafSend;
-use channel::{Channels, ChanEvent, ChanEventMaker};
+use channel::Channels;
 use config::MAX_CHANNELS;
 use kex::{SessId, AlgoConfig};
 
@@ -84,18 +84,6 @@ enum ConnState {
     // Cleanup ??
 }
 
-// Application API
-#[derive(Debug)]
-pub enum Event<'a> {
-    Channel(ChanEvent<'a>),
-    CliAuthed,
-}
-
-pub(crate) enum EventMaker {
-    Channel(ChanEventMaker),
-    CliAuthed,
-}
-
 pub(crate) struct Dispatched(pub Option<channel::DataIn>);
 
 impl Conn {
@@ -135,7 +123,7 @@ impl Conn {
         match self.state {
             ConnState::SendIdent => {
                 s.send_version(ident::OUR_VERSION)?;
-                let p = self.kex.send_kexinit(&self.algo_conf, s)?;
+                self.kex.send_kexinit(&self.algo_conf, s)?;
                 // TODO: first_follows would have a second packet here
                 self.state = ConnState::ReceiveIdent
             }
@@ -250,7 +238,7 @@ impl Conn {
                     done_auth: matches!(self.state, ConnState::Authed),
                     output: None,
                 };
-                let r = self.kex.handle_kexinit(
+                self.kex.handle_kexinit(
                     &packet,
                     self.cliserv.is_client(),
                     &self.algo_conf,
@@ -280,7 +268,7 @@ impl Conn {
             Packet::KexDHReply(p) => {
                 match self.state {
                     ConnState::InKex { done_auth: _, ref mut output } => {
-                        if let ClientServer::Client(cli) = &mut self.cliserv {
+                        if let ClientServer::Client(_cli) = &mut self.cliserv {
                             if self.kex.maybe_discard_packet() {
                                 // ok
                             } else {
@@ -415,10 +403,5 @@ mod tests {
     use crate::doorlog::*;
     use crate::conn::*;
     use crate::error::Error;
-
-    // #[test]
-    // fn event_variants() {
-    //     // TODO sanity check event variants.
-    // }
 }
 
diff --git a/sshproto/src/lib.rs b/sshproto/src/lib.rs
index b77e37a6eedcc4bc3544004b515b23e6b2559f6d..a85260dda067a8a6bfa71cacc51d23bf5a806858 100644
--- a/sshproto/src/lib.rs
+++ b/sshproto/src/lib.rs
@@ -46,12 +46,11 @@ pub mod config;
 // Application API
 pub use behaviour::{Behaviour, ServBehaviour, CliBehaviour,
     BhError, BhResult, ResponseString};
-pub use sshwire::{TextString};
+pub use sshwire::TextString;
 
 pub use runner::Runner;
 pub use sign::SignKey;
 pub use packets::PubKey;
 pub use error::{Error,Result};
-pub use channel::{ChanMsg, ChanMsgDetails, ChanEvent, Pty, ChanOpened};
-pub use sshnames::{ChanFail};
-pub use conn::Event;
+pub use channel::{ChanMsg, ChanMsgDetails, Pty, ChanOpened};
+pub use sshnames::ChanFail;
diff --git a/sshproto/src/runner.rs b/sshproto/src/runner.rs
index 12a6df08ea53be08bfac8d5a13b9a96b9ea63e40..e95920d3050383ff1a5672310ecd22a4b1102894 100644
--- a/sshproto/src/runner.rs
+++ b/sshproto/src/runner.rs
@@ -8,12 +8,11 @@ use core::task::{Poll, Waker};
 
 use pretty_hex::PrettyHex;
 
-use crate::{*, channel::ChanEvent};
+use crate::*;
 use encrypt::KeyState;
 use traffic::{TrafIn, TrafOut, TrafSend};
 
 use conn::{Conn, Dispatched};
-use channel::ChanEventMaker;
 
 pub struct Runner<'a> {
     conn: Conn,
@@ -249,7 +248,7 @@ impl<'a> Runner<'a> {
         self.conn.channels.send_allowed(chan).map(|s| s.min(buf_space))
     }
 
-    pub fn term_window_change(&self, chan: u32, wc: packets::WinChange) -> Result<()> {
+    pub fn term_window_change(&self, _chan: u32, _wc: packets::WinChange) -> Result<()> {
         todo!();
         // self.conn.channels.term_window_change(chan, wc)
     }
diff --git a/sshproto/src/servauth.rs b/sshproto/src/servauth.rs
index b7b2f70e6374ecdef74f245b36cb42ebef39e6c2..32ad66daa878ebbc4962e54f9678890941289b98 100644
--- a/sshproto/src/servauth.rs
+++ b/sshproto/src/servauth.rs
@@ -16,7 +16,7 @@ pub(crate) struct ServAuth {
 }
 
 impl ServAuth {
-    pub fn new(b: &mut dyn ServBehaviour) -> Self {
+    pub fn new(_b: &mut dyn ServBehaviour) -> Self {
         Self { authed: false }
     }
 
diff --git a/sshproto/src/sshnames.rs b/sshproto/src/sshnames.rs
index 5a73a735b3b3e7cdb2f09b33d0e6bf72cca92c7d..97b179b5e8a6485ad8683cb7ba9376295c97c387 100644
--- a/sshproto/src/sshnames.rs
+++ b/sshproto/src/sshnames.rs
@@ -50,7 +50,6 @@ pub const SSH_AUTHMETHOD_PASSWORD: &str = "password";
 pub const SSH_AUTHMETHOD_PUBLICKEY: &str = "publickey";
 /// [RFC4256](https://tools.ietf.org/html/rfc4256)
 pub const SSH_AUTHMETHOD_INTERACTIVE: &str = "keyboard-interactive";
-pub(crate) const NUM_AUTHMETHOD: usize = 3;
 
 /// [RFC4254](https://tools.ietf.org/html/rfc4254)
 pub const SSH_EXTENDED_DATA_STDERR: u32 = 1;
diff --git a/sshproto/src/sshwire.rs b/sshproto/src/sshwire.rs
index 0cf26baab50e99c0b42534883a3c32e04ae9f37b..35c96d6a2b6a5b5bbfec5dc6fd188e668afbc745 100644
--- a/sshproto/src/sshwire.rs
+++ b/sshproto/src/sshwire.rs
@@ -159,7 +159,7 @@ where
 {
     let mut s = EncodeLen { pos: 0 };
     value.enc(&mut s)?;
-    s.pos.try_into().map_err(|e| WireError::NoRoom)
+    s.pos.try_into().map_err(|_| WireError::NoRoom)
 }
 
 struct EncodeBytes<'a> {
diff --git a/sshproto/src/traffic.rs b/sshproto/src/traffic.rs
index a648911aae9f54f00138b0ed5633163333d70476..e41287682d270254869138b5b1ae369ed7a0bfae 100644
--- a/sshproto/src/traffic.rs
+++ b/sshproto/src/traffic.rs
@@ -288,10 +288,6 @@ impl<'a> TrafOut<'a> {
         let (idx, len) = match self.state {
             TxState::Idle => (0, 0),
             TxState::Write { idx, len } => (idx, len),
-            _ => {
-                trace!("bad state {:?}", self.state);
-                Err(Error::bug())?
-            }
         };
 
         // Use the remainder of our buffer to write the packet. Payload starts