diff --git a/codegen/protocol/packets.tmpl b/codegen/protocol/packets.tmpl
index 5474639f57eb4cdfe9172c383d643a04893e2e09..bc71d8e7b301d7cfc1cb6fddb0c4806a9eececad 100644
--- a/codegen/protocol/packets.tmpl
+++ b/codegen/protocol/packets.tmpl
@@ -3,6 +3,7 @@ package protocol
 import (
 	"bytes"
 	"io"
+	"gfx.cafe/util/go/bufpool"
 )
 
 // codegen: modify for debug only
@@ -202,9 +203,9 @@ var _ io.Reader
     }
 
     func (T *{{$name}}) Write(writer io.Writer) (length int, err error) {
-        // TODO replace with pool
-        var buf bytes.Buffer
-        length, err = T.Fields.Write(&buf)
+        buf := bufpool.Get(0)
+        defer bufpool.Put(buf)
+        length, err = T.Fields.Write(buf)
         if err != nil {
             length = 0
             return
diff --git a/go.mod b/go.mod
index 979aff3f518c7c096051e2ae6cb90ee01500e04f..7e96ddf8611db4900c970c11705389900cedd2aa 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@ module gfx.cafe/gfx/pggat
 go 1.19
 
 require (
+	gfx.cafe/util/go/bufpool v0.0.0-20220906091724-3a24b7f40ccf
 	git.tuxpa.in/a/zlog v1.32.0
 	github.com/BurntSushi/toml v1.2.0
 	github.com/auxten/postgresql-parser v1.0.1
diff --git a/go.sum b/go.sum
index 0838b82a9a5d2b0b835046bb5d5855703b7966e7..f5afeaa3ba04be4b69fae5329a1531108175ce9b 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,7 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+gfx.cafe/util/go/bufpool v0.0.0-20220906091724-3a24b7f40ccf h1:ya4IK1D+Kq0DrFdrrZ7tjmp3BgoO4v5sCAeUytR6j1U=
+gfx.cafe/util/go/bufpool v0.0.0-20220906091724-3a24b7f40ccf/go.mod h1:+DiyiCOBGS9O9Ce4ewHQO3Y59h66WSWAbgZZ2O2AYYw=
 git.tuxpa.in/a/zlog v1.32.0 h1:KKXbRF1x8kJDSzUoGz/pivo+4TVY6xT5sVtdFZ6traY=
 git.tuxpa.in/a/zlog v1.32.0/go.mod h1:vUa2Qhu6DLPLqmfRy99FiPqaY2eb6/KQjtMekW3UNnA=
 github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
diff --git a/lib/gat/client.go b/lib/gat/client.go
index 65862339917cf5e0ad1d4610b01dae8e9dd3a5ff..60ed907015f5d202310ec0a8ffeadd1f3a3f5e98 100644
--- a/lib/gat/client.go
+++ b/lib/gat/client.go
@@ -256,7 +256,7 @@ func (c *Client) Accept(ctx context.Context) error {
 	}
 	c.log.Debug().Msg("Password authentication successful")
 	authOk := new(protocol.Authentication)
-	authOk.Fields.Data = []byte{0, 0, 0, 0}
+	authOk.Fields.Code = 0
 	_, err = authOk.Write(c.wr)
 	if err != nil {
 		return err
diff --git a/lib/gat/messages.go b/lib/gat/messages.go
index 37d6a0931cda18cb340ce5d22e1c6e52011580ae..860d3d5106561f7f11e03aba342667878cca6693 100644
--- a/lib/gat/messages.go
+++ b/lib/gat/messages.go
@@ -21,7 +21,8 @@ func CreateMd5Challenge() (*protocol.Authentication, [4]byte, error) {
 	}
 
 	pkt := new(protocol.Authentication)
-	pkt.Fields.Data = append([]byte{0, 0, 0, 5}, salt[:]...)
+	pkt.Fields.Code = 5
+	pkt.Fields.Salt = salt[:]
 
 	return pkt, salt, nil
 }
diff --git a/lib/gat/protocol/backend.go b/lib/gat/protocol/backend.go
index 28e160994edbe44356af6b0fc8ae4cbe3a568710..ca40843ccb3e94978b562c3efe33160082fc931e 100644
--- a/lib/gat/protocol/backend.go
+++ b/lib/gat/protocol/backend.go
@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"bytes"
+	"gfx.cafe/util/go/bufpool"
 	"io"
 )
 
@@ -139,9 +140,9 @@ func (T *Authentication) Read(reader io.Reader) (err error) {
 }
 
 func (T *Authentication) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -212,9 +213,9 @@ func (T *BackendKeyData) Read(reader io.Reader) (err error) {
 }
 
 func (T *BackendKeyData) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -265,9 +266,9 @@ func (T *BindComplete) Read(reader io.Reader) (err error) {
 }
 
 func (T *BindComplete) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -318,9 +319,9 @@ func (T *CloseComplete) Read(reader io.Reader) (err error) {
 }
 
 func (T *CloseComplete) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -381,9 +382,9 @@ func (T *CommandComplete) Read(reader io.Reader) (err error) {
 }
 
 func (T *CommandComplete) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -472,9 +473,9 @@ func (T *CopyBothResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *CopyBothResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -563,9 +564,9 @@ func (T *CopyInResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *CopyInResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -654,9 +655,9 @@ func (T *CopyOutResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *CopyOutResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -776,9 +777,9 @@ func (T *DataRow) Read(reader io.Reader) (err error) {
 }
 
 func (T *DataRow) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -829,9 +830,9 @@ func (T *EmptyQueryResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *EmptyQueryResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -937,9 +938,9 @@ func (T *ErrorResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *ErrorResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1018,9 +1019,9 @@ func (T *FunctionCallResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *FunctionCallResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1109,9 +1110,9 @@ func (T *NegotiateProtocolVersion) Read(reader io.Reader) (err error) {
 }
 
 func (T *NegotiateProtocolVersion) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1162,9 +1163,9 @@ func (T *NoData) Read(reader io.Reader) (err error) {
 }
 
 func (T *NoData) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1270,9 +1271,9 @@ func (T *NoticeResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *NoticeResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1353,9 +1354,9 @@ func (T *NotificationResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *NotificationResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1434,9 +1435,9 @@ func (T *ParameterDescription) Read(reader io.Reader) (err error) {
 }
 
 func (T *ParameterDescription) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1507,9 +1508,9 @@ func (T *ParameterStatus) Read(reader io.Reader) (err error) {
 }
 
 func (T *ParameterStatus) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1560,9 +1561,9 @@ func (T *ParseComplete) Read(reader io.Reader) (err error) {
 }
 
 func (T *ParseComplete) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1613,9 +1614,9 @@ func (T *PortalSuspended) Read(reader io.Reader) (err error) {
 }
 
 func (T *PortalSuspended) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1676,9 +1677,9 @@ func (T *ReadyForQuery) Read(reader io.Reader) (err error) {
 }
 
 func (T *ReadyForQuery) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1840,9 +1841,9 @@ func (T *RowDescription) Read(reader io.Reader) (err error) {
 }
 
 func (T *RowDescription) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
diff --git a/lib/gat/protocol/frontend.go b/lib/gat/protocol/frontend.go
index b5344bdc68e1947a6797d8dfe8f411e07e614639..cfd28bf20ef9622c5c4bbe3d878cb95e488dba1b 100644
--- a/lib/gat/protocol/frontend.go
+++ b/lib/gat/protocol/frontend.go
@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"bytes"
+	"gfx.cafe/util/go/bufpool"
 	"io"
 )
 
@@ -55,9 +56,9 @@ func (T *AuthenticationResponse) Read(reader io.Reader) (err error) {
 }
 
 func (T *AuthenticationResponse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -253,9 +254,9 @@ func (T *Bind) Read(reader io.Reader) (err error) {
 }
 
 func (T *Bind) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -335,9 +336,9 @@ func (T *CancelRequest) Read(reader io.Reader) (err error) {
 }
 
 func (T *CancelRequest) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -403,9 +404,9 @@ func (T *Close) Read(reader io.Reader) (err error) {
 }
 
 func (T *Close) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -466,9 +467,9 @@ func (T *CopyFail) Read(reader io.Reader) (err error) {
 }
 
 func (T *CopyFail) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -539,9 +540,9 @@ func (T *Describe) Read(reader io.Reader) (err error) {
 }
 
 func (T *Describe) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -612,9 +613,9 @@ func (T *Execute) Read(reader io.Reader) (err error) {
 }
 
 func (T *Execute) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -665,9 +666,9 @@ func (T *Flush) Read(reader io.Reader) (err error) {
 }
 
 func (T *Flush) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -835,9 +836,9 @@ func (T *FunctionCall) Read(reader io.Reader) (err error) {
 }
 
 func (T *FunctionCall) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -897,9 +898,9 @@ func (T *GSSENCRequest) Read(reader io.Reader) (err error) {
 }
 
 func (T *GSSENCRequest) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -993,9 +994,9 @@ func (T *Parse) Read(reader io.Reader) (err error) {
 }
 
 func (T *Parse) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1056,9 +1057,9 @@ func (T *Query) Read(reader io.Reader) (err error) {
 }
 
 func (T *Query) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1118,9 +1119,9 @@ func (T *SSLRequest) Read(reader io.Reader) (err error) {
 }
 
 func (T *SSLRequest) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1262,9 +1263,9 @@ func (T *StartupMessage) Read(reader io.Reader) (err error) {
 }
 
 func (T *StartupMessage) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1310,9 +1311,9 @@ func (T *Sync) Read(reader io.Reader) (err error) {
 }
 
 func (T *Sync) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -1363,9 +1364,9 @@ func (T *Terminate) Read(reader io.Reader) (err error) {
 }
 
 func (T *Terminate) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
diff --git a/lib/gat/protocol/shared.go b/lib/gat/protocol/shared.go
index 567fe6b5ad16dc5b325e4de46fe6d36e90463e2a..3b7823ff89ee5cda54b7a7c76206ff1578dd415e 100644
--- a/lib/gat/protocol/shared.go
+++ b/lib/gat/protocol/shared.go
@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"bytes"
+	"gfx.cafe/util/go/bufpool"
 	"io"
 )
 
@@ -55,9 +56,9 @@ func (T *CopyData) Read(reader io.Reader) (err error) {
 }
 
 func (T *CopyData) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
@@ -108,9 +109,9 @@ func (T *CopyDone) Read(reader io.Reader) (err error) {
 }
 
 func (T *CopyDone) Write(writer io.Writer) (length int, err error) {
-	// TODO replace with pool
-	var buf bytes.Buffer
-	length, err = T.Fields.Write(&buf)
+	buf := bufpool.Get(0)
+	defer bufpool.Put(buf)
+	length, err = T.Fields.Write(buf)
 	if err != nil {
 		length = 0
 		return
diff --git a/lib/gat/server.go b/lib/gat/server.go
index bfeb9fae7e8eb1ed988606729dc30cebb8429df7..49c97227424d1189da78a2b5c48619dfcd588054 100644
--- a/lib/gat/server.go
+++ b/lib/gat/server.go
@@ -62,7 +62,7 @@ func DialServer(ctx context.Context, addr string, user *config.User, db string,
 	s.remote = s.conn.RemoteAddr()
 	s.r = bufio.NewReader(s.conn)
 	s.wr = s.conn
-	s.server_info = []byte{}
+	s.server_info = []*protocol.ParameterStatus{}
 	s.user = *user
 	s.db = db
 
@@ -76,7 +76,6 @@ func DialServer(ctx context.Context, addr string, user *config.User, db string,
 
 func (s *Server) startup(ctx context.Context) error {
 	s.log.Debug().Msg("sending startup")
-	//TODO: grow / bufpool
 	start := new(protocol.StartupMessage)
 	start.Fields.ProtocolVersionNumber = 196608
 	start.Fields.Parameters = []protocol.FieldsStartupMessageParameters{