diff --git a/lib/gat/pooler.go b/lib/gat/pooler.go
index 1088ab7349de960a032849ca7966ff1302fcb7c1..1788bbc9d72ae7f06b7e32c0dd7f830452601bdc 100644
--- a/lib/gat/pooler.go
+++ b/lib/gat/pooler.go
@@ -114,7 +114,7 @@ func (T *Pooler) ListenAndServe(listener net.Listener) error {
 		if err != nil {
 			return err
 		}
-		go T.Serve(zap.WrapIOReadWriter(conn))
+		go T.Serve(zap.WrapNetConn(conn))
 	}
 }
 
diff --git a/lib/gat/recipe.go b/lib/gat/recipe.go
index 9d42198e56369e479285622de12ae623add85b06..650bd6034ad4f6a519333ceaa4d8f4c2c86eff88 100644
--- a/lib/gat/recipe.go
+++ b/lib/gat/recipe.go
@@ -36,7 +36,7 @@ func (T TCPRecipe) Dial() (zap.ReadWriter, error) {
 	if err != nil {
 		return nil, err
 	}
-	rw := zap.WrapIOReadWriter(conn)
+	rw := zap.WrapNetConn(conn)
 	return rw, nil
 }
 
diff --git a/lib/zap/conn.go b/lib/zap/conn.go
new file mode 100644
index 0000000000000000000000000000000000000000..4804e5ddf82f8a5549299e26c26cb7b182ec4329
--- /dev/null
+++ b/lib/zap/conn.go
@@ -0,0 +1,62 @@
+package zap
+
+import (
+	"io"
+	"net"
+)
+
+type Conn struct {
+	conn net.Conn
+	buf  [1]byte
+}
+
+func WrapNetConn(conn net.Conn) *Conn {
+	return &Conn{
+		conn: conn,
+	}
+}
+
+func (T *Conn) ReadByte() (byte, error) {
+	_, err := io.ReadFull(T.conn, T.buf[:])
+	if err != nil {
+		return 0, err
+	}
+	return T.buf[0], nil
+}
+
+func (T *Conn) Read(packet *Packet) error {
+	_, err := packet.ReadFrom(T.conn)
+	return err
+}
+
+func (T *Conn) ReadUntyped(packet *UntypedPacket) error {
+	_, err := packet.ReadFrom(T.conn)
+	return err
+}
+
+func (T *Conn) WriteByte(b byte) error {
+	T.buf[0] = b
+	_, err := T.conn.Write(T.buf[:])
+	return err
+}
+
+func (T *Conn) Write(packet *Packet) error {
+	_, err := packet.WriteTo(T.conn)
+	return err
+}
+
+func (T *Conn) WriteUntyped(packet *UntypedPacket) error {
+	_, err := packet.WriteTo(T.conn)
+	return err
+}
+
+func (T *Conn) WriteV(packets *Packets) error {
+	_, err := packets.WriteTo(T.conn)
+	return err
+}
+
+func (T *Conn) Close() error {
+	return T.conn.Close()
+}
+
+var _ ReadWriter = (*Conn)(nil)
diff --git a/lib/zap/reader.go b/lib/zap/reader.go
index 6c0f132e291894f736991924208ea6538d28b93a..a8f5bee817892b5b55f1d4cf729e4c5fc3a153e5 100644
--- a/lib/zap/reader.go
+++ b/lib/zap/reader.go
@@ -1,9 +1,5 @@
 package zap
 
-import (
-	"io"
-)
-
 type Reader interface {
 	ReadByte() (byte, error)
 	Read(*Packet) error
@@ -11,40 +7,3 @@ type Reader interface {
 
 	Close() error
 }
-
-func WrapIOReader(readCloser io.ReadCloser) Reader {
-	return ioReader{
-		reader: readCloser,
-		closer: readCloser,
-	}
-}
-
-type ioReader struct {
-	reader io.Reader
-	closer io.Closer
-}
-
-func (T ioReader) ReadByte() (byte, error) {
-	var res = []byte{0}
-	_, err := io.ReadFull(T.reader, res)
-	if err != nil {
-		return 0, err
-	}
-	return res[0], err
-}
-
-func (T ioReader) Read(packet *Packet) error {
-	_, err := packet.ReadFrom(T.reader)
-	return err
-}
-
-func (T ioReader) ReadUntyped(packet *UntypedPacket) error {
-	_, err := packet.ReadFrom(T.reader)
-	return err
-}
-
-func (T ioReader) Close() error {
-	return T.closer.Close()
-}
-
-var _ Reader = ioReader{}
diff --git a/lib/zap/readwriter.go b/lib/zap/readwriter.go
index 0ab0babf51ff3537eab9aabbddae754b1ccbed70..1f686ed460f1727ed0e2cc9dc34775f7397f4056 100644
--- a/lib/zap/readwriter.go
+++ b/lib/zap/readwriter.go
@@ -3,22 +3,7 @@ package zap
 import "io"
 
 type ReadWriter interface {
+	io.ByteReader
 	Reader
 	Writer
 }
-
-type CombinedReadWriter struct {
-	Reader
-	Writer
-}
-
-func (T CombinedReadWriter) Close() error {
-	return T.Reader.Close()
-}
-
-func WrapIOReadWriter(readWriteCloser io.ReadWriteCloser) ReadWriter {
-	return CombinedReadWriter{
-		Reader: WrapIOReader(readWriteCloser),
-		Writer: WrapIOWriter(readWriteCloser),
-	}
-}
diff --git a/lib/zap/writer.go b/lib/zap/writer.go
index 667954fcf0cc7ab8c89e5bd4808d0c557b6122eb..5cf89989f7701d8e741e823e40a5822bf447e5e2 100644
--- a/lib/zap/writer.go
+++ b/lib/zap/writer.go
@@ -1,9 +1,5 @@
 package zap
 
-import (
-	"io"
-)
-
 type Writer interface {
 	WriteByte(byte) error
 	Write(*Packet) error
@@ -12,41 +8,3 @@ type Writer interface {
 
 	Close() error
 }
-
-func WrapIOWriter(writeCloser io.WriteCloser) Writer {
-	return ioWriter{
-		writer: writeCloser,
-		closer: writeCloser,
-	}
-}
-
-type ioWriter struct {
-	writer io.Writer
-	closer io.Closer
-}
-
-func (T ioWriter) WriteByte(b byte) error {
-	_, err := T.writer.Write([]byte{b})
-	return err
-}
-
-func (T ioWriter) Write(packet *Packet) error {
-	_, err := packet.WriteTo(T.writer)
-	return err
-}
-
-func (T ioWriter) WriteUntyped(packet *UntypedPacket) error {
-	_, err := packet.WriteTo(T.writer)
-	return err
-}
-
-func (T ioWriter) WriteV(packets *Packets) error {
-	_, err := packets.WriteTo(T.writer)
-	return err
-}
-
-func (T ioWriter) Close() error {
-	return T.closer.Close()
-}
-
-var _ Writer = ioWriter{}