diff --git a/tokio-uds/Cargo.toml b/tokio-uds/Cargo.toml
index 72e222f8c..2935e7e45 100644
--- a/tokio-uds/Cargo.toml
+++ b/tokio-uds/Cargo.toml
@@ -24,6 +24,7 @@ libc = "0.2.42"
log = "0.4.2"
mio = "0.6.14"
mio-uds = "0.6.5"
+tokio-codec = { version = "0.1.0", path = "../tokio-codec" }
tokio-reactor = { version = "0.1.1", path = "../tokio-reactor" }
tokio-io = { version = "0.1.6", path = "../tokio-io" }
diff --git a/tokio-uds/src/frame.rs b/tokio-uds/src/frame.rs
new file mode 100644
index 000000000..49c8948c6
--- /dev/null
+++ b/tokio-uds/src/frame.rs
@@ -0,0 +1,160 @@
+use std::io;
+use std::os::unix::net::SocketAddr;
+use std::path::Path;
+
+use futures::{Async, Poll, Stream, Sink, StartSend, AsyncSink};
+
+use super::UnixDatagram;
+
+use tokio_codec::{Decoder, Encoder};
+use bytes::{BytesMut, BufMut};
+
+/// A unified `Stream` and `Sink` interface to an underlying `UnixDatagram`, using
+/// the `Encoder` and `Decoder` traits to encode and decode frames.
+///
+/// Unix datagram sockets work with datagrams, but higher-level code may wants to
+/// batch these into meaningful chunks, called "frames". This method layers
+/// framing on top of this socket by using the `Encoder` and `Decoder` traits to
+/// handle encoding and decoding of messages frames. Note that the incoming and
+/// outgoing frame types may be distinct.
+///
+/// This function returns a *single* object that is both `Stream` and `Sink`;
+/// grouping this into a single object is often useful for layering things which
+/// require both read and write access to the underlying object.
+///
+/// If you want to work more directly with the streams and sink, consider
+/// calling `split` on the `UnixDatagramFramed` returned by this method, which will break
+/// them into separate objects, allowing them to interact more easily.
+#[must_use = "sinks do nothing unless polled"]
+#[derive(Debug)]
+pub struct UnixDatagramFramed {
+ socket: UnixDatagram,
+ codec: C,
+ rd: BytesMut,
+ wr: BytesMut,
+ out_addr: Option,
+ flushed: bool,
+}
+
+impl Stream for UnixDatagramFramed {
+ type Item = (C::Item, SocketAddr);
+ type Error = C::Error;
+
+ fn poll(&mut self) -> Poll