diff --git a/lib/fed/decoder.go b/lib/fed/decoder.go
index 6aa011b05a8ed25dec2ed7af60f1c3560f5d646d..b61aeb8d263ef1295558ce2da964db5cc25ddce0 100644
--- a/lib/fed/decoder.go
+++ b/lib/fed/decoder.go
@@ -28,6 +28,21 @@ func NewDecoder(r io.Reader) *Decoder {
 	return d
 }
 
+func (T *Decoder) Read(b []byte) (n int, err error) {
+	rem := T.len - T.pos
+	if rem == 0 {
+		err = io.EOF
+		return
+	}
+	if len(b) > rem {
+		n, err = T.Reader.Read(b[:rem])
+	} else {
+		n, err = T.Reader.Read(b)
+	}
+	T.pos += n
+	return
+}
+
 func (T *Decoder) ReadByte() (byte, error) {
 	if T.pos != T.len {
 		_, err := T.Reader.Discard(T.len - T.pos)
diff --git a/lib/fed/packet.go b/lib/fed/packet.go
index f521436fa842df6d07a214728d1d3c0e180ebe5b..6da6f2bf682c0ad77fe192ae2fc078275d728519 100644
--- a/lib/fed/packet.go
+++ b/lib/fed/packet.go
@@ -1,7 +1,5 @@
 package fed
 
-import "io"
-
 type Packet interface {
 	Type() Type
 	Length() int
@@ -28,17 +26,12 @@ func (T PendingPacket) Length() int {
 }
 
 func (T PendingPacket) WriteTo(encoder *Encoder) error {
-	count := T.Decoder.len - T.Decoder.pos
-	limited := io.LimitedReader{
-		R: &T.Decoder.Reader,
-		N: int64(count),
-	}
-	for limited.N > 0 {
-		if _, err := encoder.Writer.ReadFrom(&limited); err != nil {
+	count := T.Decoder.Length() - T.Decoder.Position()
+	for T.Decoder.Position() < T.Decoder.Length() {
+		if _, err := encoder.Writer.ReadFrom(T.Decoder); err != nil {
 			return err
 		}
 	}
-	T.Decoder.pos += count
 	encoder.pos += count
 	return nil
 }
diff --git a/pgbouncer.ini b/pgbouncer.ini
index 428dbd8b0a5b045ffedfa82d061e6dfccc05ecf3..73dbd84942fafe96e5d09957cb032810930329e1 100644
--- a/pgbouncer.ini
+++ b/pgbouncer.ini
@@ -7,4 +7,4 @@ auth_user = postgres
 server_idle_timeout = 10
 
 [databases]
-* = host=/tmp/ datestyle=Postgres,MDY timezone=PST8PDT
+* = host=localhost datestyle=Postgres,MDY timezone=PST8PDT