diff --git a/Cargo.toml b/Cargo.toml
index 2bb37a7..e9c308b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,23 +12,22 @@ repository = "https://github.com/wiktor-k/ssh-agent.rs"
edition = "2021"
[dependencies]
-byteorder = "1.2.7"
-serde = {version = "1.0.87", features = ["derive"]}
+byteorder = "1.4"
+serde = {version = "1", features = ["derive"]}
-bytes = { version = "0.4.11", optional = true }
-futures = { version = "0.1.25", optional = true }
-log = { version = "0.4.6", optional = true }
-tokio = { version = "0.1.15", optional = true }
-tokio-uds = { version = "0.2.5", optional = true }
+bytes = { version = "1.1", optional = true }
+#futures = { version = "0.1.25", optional = true }
+futures = { version = "0.3.30", optional = true }
+log = { version = "0.4.16", optional = true }
+tokio = { version = "1", optional = true, features = ["rt", "net", "rt-multi-thread"] }
+tokio-util = { version = "0.7", optional = true, features = ["codec"] }
+tokio-stream = { version = "0.1.14", optional = true, features = ["net"] }
+#tokio-uds = { version = "0.2.5", optional = true }
[features]
default = ["agent"]
-agent = ["futures", "log", "tokio", "tokio-uds", "bytes"]
+agent = ["log", "tokio", "tokio-util", "bytes", "futures", "tokio-stream"]
[[example]]
name = "key_storage"
required-features = ["agent"]
-
-[dev-dependencies]
-env_logger = "0.6.0"
-openssl = "0.10.16"
diff --git a/src/agent.rs b/src/agent.rs
index 57d3de7..e902802 100644
--- a/src/agent.rs
+++ b/src/agent.rs
@@ -1,18 +1,24 @@
use byteorder::{BigEndian, ReadBytesExt};
-use bytes::{BufMut, BytesMut};
-use futures::future::FutureResult;
+use bytes::BytesMut;
use log::{error, info};
-use tokio::codec::{Decoder, Encoder, Framed};
use tokio::net::TcpListener;
-use tokio::prelude::*;
-use tokio_uds::UnixListener;
+use tokio::net::UnixListener;
+use tokio_util::codec::{Decoder, Encoder, Framed};
use std::error::Error;
use std::fmt::Debug;
+use std::future::Future;
use std::mem::size_of;
use std::net::SocketAddr;
use std::path::Path;
-use std::sync::Arc;
+use std::sync::{Arc, Mutex};
+
+use bytes::Buf;
+use bytes::BufMut;
+use futures::SinkExt;
+use futures::StreamExt;
+use futures::TryFutureExt;
+use futures::TryStreamExt;
use super::error::AgentError;
use super::proto::message::Message;
@@ -24,7 +30,7 @@ impl Decoder for MessageCodec {
type Item = Message;
type Error = AgentError;
- fn decode(&mut self, src: &mut BytesMut) -> Result