diff --git a/codegen/protocol/packets.tmpl b/codegen/protocol/packets.tmpl
index 9a27869763e7979f29bb5bd4d409c58e113b89c5..804e42c676e61e629a848f7e433a9396b96ac7d9 100644
--- a/codegen/protocol/packets.tmpl
+++ b/codegen/protocol/packets.tmpl
@@ -164,4 +164,29 @@ import "io"
         fields Fields{{$name}}
     }
 
+    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)
+        if err != nil {
+            length = 0
+            return
+        }
+        {{if $packet.Identifier -}}
+            _, err = WriteByte(writer, byte('{{$packet.Identifier}}'))
+            if err != nil {
+                length = 1
+                return
+            }
+        {{end -}}
+        _, err = WriteInt32(writer, int32(length))
+        if err != nil {
+            length = 5
+            return
+        }
+        length += 5
+        _, err = writer.Write(buf.Bytes())
+        return
+    }
+
 {{end -}}
\ No newline at end of file
diff --git a/lib/gat/protocol/backend.go b/lib/gat/protocol/backend.go
index 8e193dec60c6808a6623c8a2179d77bb1e36f7fc..97576ef21109a73cb7af0ead2dad2df9dded7d92 100644
--- a/lib/gat/protocol/backend.go
+++ b/lib/gat/protocol/backend.go
@@ -1,6 +1,9 @@
 package protocol
 
-import "io"
+import (
+	"bytes"
+	"io"
+)
 
 // codegen: modify for debug only
 
@@ -37,6 +40,29 @@ type Authentication struct {
 	fields FieldsAuthentication
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('R'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsBackendKeyData struct {
 	ProcessID int32
 	SecretKey int32
@@ -74,6 +100,29 @@ type BackendKeyData struct {
 	fields FieldsBackendKeyData
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('K'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsBindComplete struct {
 }
 
@@ -91,6 +140,29 @@ type BindComplete struct {
 	fields FieldsBindComplete
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('2'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCloseComplete struct {
 }
 
@@ -108,6 +180,29 @@ type CloseComplete struct {
 	fields FieldsCloseComplete
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('3'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCommandComplete struct {
 	Data string
 }
@@ -135,6 +230,29 @@ type CommandComplete struct {
 	fields FieldsCommandComplete
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('C'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCopyBothResponse struct {
 	Format        int8
 	ColumnFormats []int16
@@ -187,6 +305,29 @@ type CopyBothResponse struct {
 	fields FieldsCopyBothResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('W'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCopyInResponse struct {
 	Format        int8
 	ColumnFormats []int16
@@ -239,6 +380,29 @@ type CopyInResponse struct {
 	fields FieldsCopyInResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('G'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCopyOutResponse struct {
 	Format        int8
 	ColumnFormats []int16
@@ -291,6 +455,29 @@ type CopyOutResponse struct {
 	fields FieldsCopyOutResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('H'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsDataRowColumns struct {
 	Bytes []int8
 }
@@ -371,6 +558,29 @@ type DataRow struct {
 	fields FieldsDataRow
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('D'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsEmptyQueryResponse struct {
 }
 
@@ -388,6 +598,29 @@ type EmptyQueryResponse struct {
 	fields FieldsEmptyQueryResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('I'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsErrorResponse struct {
 	Code  byte
 	Value string
@@ -425,6 +658,29 @@ type ErrorResponse struct {
 	fields FieldsErrorResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('E'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsFunctionCallResponse struct {
 	Result []byte
 }
@@ -467,6 +723,29 @@ type FunctionCallResponse struct {
 	fields FieldsFunctionCallResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('V'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsNegotiateProtocolVersion struct {
 	MinorVersion  int32
 	NotRecognized []string
@@ -519,6 +798,29 @@ type NegotiateProtocolVersion struct {
 	fields FieldsNegotiateProtocolVersion
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('v'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsNoData struct {
 }
 
@@ -536,6 +838,29 @@ type NoData struct {
 	fields FieldsNoData
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('n'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsNoticeResponse struct {
 	Type  byte
 	Value string
@@ -577,6 +902,29 @@ type NoticeResponse struct {
 	fields FieldsNoticeResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('N'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsNotificationResponse struct {
 	ProcessID int32
 	Channel   string
@@ -624,6 +972,29 @@ type NotificationResponse struct {
 	fields FieldsNotificationResponse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('A'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsParameterDescription struct {
 	Parameters []int32
 }
@@ -666,6 +1037,29 @@ type ParameterDescription struct {
 	fields FieldsParameterDescription
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('t'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsParameterStatus struct {
 	Parameter string
 	Value     string
@@ -703,6 +1097,29 @@ type ParameterStatus struct {
 	fields FieldsParameterStatus
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('S'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsParseComplete struct {
 }
 
@@ -720,6 +1137,29 @@ type ParseComplete struct {
 	fields FieldsParseComplete
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('1'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsPortalSuspended struct {
 }
 
@@ -737,6 +1177,29 @@ type PortalSuspended struct {
 	fields FieldsPortalSuspended
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('s'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsReadForQuery struct {
 }
 
@@ -754,6 +1217,29 @@ type ReadForQuery struct {
 	fields FieldsReadForQuery
 }
 
+func (T *ReadForQuery) Write(writer io.Writer) (length int, err error) {
+	// TODO replace with pool
+	var buf bytes.Buffer
+	length, err = T.fields.Write(&buf)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('Z'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsRowDescriptionFields struct {
 	Name            string
 	TableId         int32
@@ -878,3 +1364,26 @@ func (T *FieldsRowDescription) Write(writer io.Writer) (length int, err error) {
 type RowDescription struct {
 	fields FieldsRowDescription
 }
+
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('T'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
diff --git a/lib/gat/protocol/frontend.go b/lib/gat/protocol/frontend.go
index d68e68cdcc3c47eb68fa1b84cc65b85f47447d8f..e152b4f2041396f728f4b5ae16154f62072d2d3b 100644
--- a/lib/gat/protocol/frontend.go
+++ b/lib/gat/protocol/frontend.go
@@ -154,6 +154,29 @@ type Bind struct {
 	fields FieldsBind
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('B'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCancelRequest struct {
 	RequestCode int32
 	ProcessID   int32
@@ -201,6 +224,29 @@ type CancelRequest struct {
 	fields FieldsCancelRequest
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('F'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsClose struct {
 	Which byte
 	Name  string
@@ -238,6 +284,29 @@ type Close struct {
 	fields FieldsClose
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('C'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCopyFail struct {
 	Cause string
 }
@@ -265,6 +334,29 @@ type CopyFail struct {
 	fields FieldsCopyFail
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('f'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsDescribe struct {
 	Which byte
 	Name  string
@@ -302,6 +394,29 @@ type Describe struct {
 	fields FieldsDescribe
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('D'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsExecute struct {
 	Name    string
 	MaxRows int32
@@ -339,6 +454,29 @@ type Execute struct {
 	fields FieldsExecute
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('E'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsFlush struct {
 }
 
@@ -356,6 +494,29 @@ type Flush struct {
 	fields FieldsFlush
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('H'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsFunctionCallArguments struct {
 	Value []byte
 }
@@ -481,6 +642,29 @@ type FunctionCall struct {
 	fields FieldsFunctionCall
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('F'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsGSSENCRequest struct {
 	EncryptionRequestCode int32
 }
@@ -508,6 +692,24 @@ type GSSENCRequest struct {
 	fields FieldsGSSENCRequest
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsGSSResponse struct {
 	Data []byte
 }
@@ -541,6 +743,29 @@ type GSSResponse struct {
 	fields FieldsGSSResponse
 }
 
+func (T *GSSResponse) Write(writer io.Writer) (length int, err error) {
+	// TODO replace with pool
+	var buf bytes.Buffer
+	length, err = T.fields.Write(&buf)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('p'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsParse struct {
 	PreparedStatement  string
 	Query              string
@@ -603,6 +828,29 @@ type Parse struct {
 	fields FieldsParse
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('P'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsPasswordMessage struct {
 	Password string
 }
@@ -630,6 +878,29 @@ type PasswordMessage struct {
 	fields FieldsPasswordMessage
 }
 
+func (T *PasswordMessage) Write(writer io.Writer) (length int, err error) {
+	// TODO replace with pool
+	var buf bytes.Buffer
+	length, err = T.fields.Write(&buf)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('p'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsQuery struct {
 	Query string
 }
@@ -657,6 +928,29 @@ type Query struct {
 	fields FieldsQuery
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('Q'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsSASLInitialResponse struct {
 	Mechanism       string
 	InitialResponse []byte
@@ -709,6 +1003,29 @@ type SASLInitialResponse struct {
 	fields FieldsSASLInitialResponse
 }
 
+func (T *SASLInitialResponse) Write(writer io.Writer) (length int, err error) {
+	// TODO replace with pool
+	var buf bytes.Buffer
+	length, err = T.fields.Write(&buf)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('p'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsSASLResponse struct {
 	Data []byte
 }
@@ -742,6 +1059,29 @@ type SASLResponse struct {
 	fields FieldsSASLResponse
 }
 
+func (T *SASLResponse) Write(writer io.Writer) (length int, err error) {
+	// TODO replace with pool
+	var buf bytes.Buffer
+	length, err = T.fields.Write(&buf)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('p'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsSSLRequest struct {
 	SSLRequestCode int32
 }
@@ -769,6 +1109,24 @@ type SSLRequest struct {
 	fields FieldsSSLRequest
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsStartupMessage struct {
 	ProtocolVersionNumber int32
 	ParameterName         string
@@ -816,6 +1174,24 @@ type StartupMessage struct {
 	fields FieldsStartupMessage
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsSync struct {
 }
 
@@ -833,6 +1209,29 @@ type Sync struct {
 	fields FieldsSync
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('S'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsTerminate struct {
 }
 
@@ -849,3 +1248,26 @@ func (T *FieldsTerminate) Write(writer io.Writer) (length int, err error) {
 type Terminate struct {
 	fields FieldsTerminate
 }
+
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('X'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
diff --git a/lib/gat/protocol/shared.go b/lib/gat/protocol/shared.go
index 147a7e71d0156db7286f5bcb6447c9c7204263dc..8793b61fab4aca53f72dcb757fcdf331b9f9e22a 100644
--- a/lib/gat/protocol/shared.go
+++ b/lib/gat/protocol/shared.go
@@ -37,6 +37,29 @@ type CopyData struct {
 	fields FieldsCopyData
 }
 
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('d'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}
+
 type FieldsCopyDone struct {
 }
 
@@ -53,3 +76,26 @@ func (T *FieldsCopyDone) Write(writer io.Writer) (length int, err error) {
 type CopyDone struct {
 	fields FieldsCopyDone
 }
+
+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)
+	if err != nil {
+		length = 0
+		return
+	}
+	_, err = WriteByte(writer, byte('c'))
+	if err != nil {
+		length = 1
+		return
+	}
+	_, err = WriteInt32(writer, int32(length))
+	if err != nil {
+		length = 5
+		return
+	}
+	length += 5
+	_, err = writer.Write(buf.Bytes())
+	return
+}