diff --git a/src/rust/amalib/src/amadeus.rs b/src/rust/amalib/src/amadeus.rs
index bbb2448e67586a49b4a975784695647ef6bc1030..837b492f37d6073cb949a41cea7d5b9736247659 100644
--- a/src/rust/amalib/src/amadeus.rs
+++ b/src/rust/amalib/src/amadeus.rs
@@ -86,18 +86,19 @@ impl AmaClientBuilder {
 
         let cache = AmaDB::new();
 
-        let connexion = Box::new(match self.sockty {
+        let connexion: Box<dyn LektorStream> = match self.sockty {
             LektorSocketType::TCP => {
                 let (Some(hostname), Some(port)) = (self.address, self.port) else {
                     unreachable!("the state is invalid, with TCP socket we should have a hostname and a port")
                 };
-                let address = format!("{hostname}:{port}");
-                let connexion = LektorConnexion::<TcpStream>::new(address);
-                err_ctx!(connexion.await => AmaClientError::TCPClientCreateError)
+                LektorConnexion::<TcpStream>::new(format!("{hostname}:{port}"))
+                    .await
+                    .map_err(|err| err_ctx!(err => AmaClientError::TCPClientCreateError))
             }
 
             #[cfg(unix)]
             LektorSocketType::UNIX => {
+                use tokio::net::UnixStream;
                 let Some(path) = self.socket else {
                     unreachable!("the state is invalid, with UNIX socket we should have a path")
                 };
@@ -108,11 +109,13 @@ impl AmaClientBuilder {
                             format!("path has no canonical name: {e}")
                         ])
                     })?
-                    .to_string_lossy();
-                let connexion = LektorConnexion::<UnixStream, String>::new(address);
-                err_ctx!(connexion.await => AmaClientError::UNIXClientCreateError)
+                    .to_string_lossy()
+                    .to_string();
+                LektorConnexion::<UnixStream>::new(address)
+                    .await
+                    .map_err(|err| err_ctx!(err => AmaClientError::UNIXClientCreateError))
             }
-        }?);
+        }?;
 
         Ok(AmaClient { connexion, cache })
     }
diff --git a/src/rust/amalib/src/connexion/mod.rs b/src/rust/amalib/src/connexion/mod.rs
index a7c2ec634b885260a680eb83c06605e01250faa5..ef71f20f35882d7845c8578b347655905e6459ef 100644
--- a/src/rust/amalib/src/connexion/mod.rs
+++ b/src/rust/amalib/src/connexion/mod.rs
@@ -47,7 +47,7 @@ pub enum LektorSocketType {
 
 pub struct LektorConnexion<Stream>
 where
-    Stream: StreamConnect<Stream> + StreamReadWrite,
+    Stream: StreamReadWrite + Sized,
 {
     version: String,
     pub(super) stream: Stream,
@@ -56,7 +56,7 @@ where
 /// The idle TCP client.
 pub struct LektorIdleConnexion<Stream>
 where
-    Stream: StreamConnect<Stream> + StreamReadWrite,
+    Stream: StreamReadWrite + Sized,
 {
     version: String,
     stream: Stream,
@@ -65,11 +65,11 @@ where
 
 impl<Stream> LektorConnexion<Stream>
 where
-    Stream: StreamConnect<Stream> + StreamReadWrite,
+    Stream: StreamReadWrite,
 {
     /// Create a new connexion to a lektord server. If the versions mismatch we
     /// log an error but continue...
-    pub async fn new(addr: impl ToString) -> StackedResult<Self, LektorCommError> {
+    pub async fn new(addr: impl ToString) -> StackedResult<Box<dyn LektorStream>, LektorCommError> {
         let addr = addr.to_string();
         let stream = Stream::connect(addr.clone()).await.map_err(
             |e| err_report!(LektorCommError::Io(e) => [ format!("faild to connect to {addr}") ]),
@@ -101,7 +101,7 @@ where
             ;  error!("got MPD version {version} from {addr}, but amalib is compatible with {}", constants::MPD_VERSION)
         );
 
-        Ok(Self { version, stream })
+        Ok(Box::new(Self { version, stream }))
     }
 
     pub fn version(&self) -> &str {
@@ -111,7 +111,7 @@ where
 
 impl<Stream> LektorIdleConnexion<Stream>
 where
-    Stream: StreamConnect<Stream> + StreamReadWrite,
+    Stream: StreamReadWrite,
 {
     pub async fn idle(
         connexion: LektorConnexion<Stream>,
diff --git a/src/rust/amalib/src/connexion/traits.rs b/src/rust/amalib/src/connexion/traits.rs
index 324981f3518db8ca9a0252c7bcb422bccab02e52..72f08d0044ac32aa0d4886421407dd37caa6aa60 100644
--- a/src/rust/amalib/src/connexion/traits.rs
+++ b/src/rust/amalib/src/connexion/traits.rs
@@ -10,13 +10,9 @@ pub trait LektorStream {
 }
 
 #[async_trait]
-pub trait StreamConnect<Stream: StreamReadWrite> {
-    /// Connect to a lektord server.
-    async fn connect(addr: impl ToString) -> std::io::Result<Stream>;
-}
+pub trait StreamReadWrite: AsyncRead + AsyncWrite + Sized {
+    async fn connect(addr: impl ToString) -> std::io::Result<Self>;
 
-#[async_trait]
-pub trait StreamReadWrite: AsyncRead + AsyncWrite {
     async fn writable(&self) -> std::io::Result<()>;
     async fn readable(&self) -> std::io::Result<()>;
 
@@ -32,15 +28,13 @@ mod unix {
     use super::*;
     use tokio::net::UnixStream;
 
-    impl StreamConnect<UnixStream> for UnixStream {
+    impl StreamReadWrite for UnixStream {
         fn connect<'async_trait>(
             addr: impl ToString,
         ) -> Pin<Box<dyn Future<Output = std::io::Result<Self>> + Send + 'async_trait>> {
             Box::pin(UnixStream::connect(addr.to_string()))
         }
-    }
 
-    impl StreamReadWrite for UnixStream {
         fn writable<'life0, 'async_trait>(
             &'life0 self,
         ) -> Pin<Box<dyn Future<Output = std::io::Result<()>> + Send + 'async_trait>>
@@ -111,6 +105,13 @@ mod tcp {
     use tokio::net::TcpStream;
 
     impl StreamReadWrite for TcpStream {
+        fn connect<'async_trait>(
+            addr: impl ToString,
+        ) -> Pin<Box<dyn Future<Output = std::io::Result<TcpStream>> + Send + 'async_trait>>
+        {
+            Box::pin(TcpStream::connect(addr.to_string()))
+        }
+
         fn writable<'life0, 'async_trait>(
             &'life0 self,
         ) -> Pin<Box<dyn Future<Output = std::io::Result<()>> + Send + 'async_trait>>
@@ -166,13 +167,4 @@ mod tcp {
             Box::pin(super::super::send(&mut self.stream, query))
         }
     }
-
-    impl StreamConnect<TcpStream> for TcpStream {
-        fn connect<'async_trait>(
-            addr: impl ToString,
-        ) -> Pin<Box<dyn Future<Output = std::io::Result<TcpStream>> + Send + 'async_trait>>
-        {
-            Box::pin(TcpStream::connect(addr.to_string()))
-        }
-    }
 }