diff --git a/lib/gat/gatling/client/client.go b/lib/gat/gatling/client/client.go
index a7b85b8810992e4248cd3f9d9c708ea65d69d449..95e5d5dad8e683e101b96f3c9b6d2de1f805efd2 100644
--- a/lib/gat/gatling/client/client.go
+++ b/lib/gat/gatling/client/client.go
@@ -464,6 +464,17 @@ func (c *Client) recvLoop(cancel context.CancelFunc) {
 				break
 			}
 		case *protocol.Close:
+			switch pkt.Fields.Which {
+			case 'S':
+				delete(c.statements, pkt.Fields.Name)
+			case 'P':
+				delete(c.portals, pkt.Fields.Name)
+			}
+			err = c.Send(new(protocol.CloseComplete))
+			if err != nil {
+				break
+			}
+		case *protocol.Terminate:
 			break
 		default:
 			c.recv <- recv
@@ -505,8 +516,6 @@ func (c *Client) tick(ctx context.Context) (bool, error) {
 		return true, c.handle_query(ctx, cast)
 	case *protocol.FunctionCall:
 		return true, c.handle_function(ctx, cast)
-	case *protocol.Terminate:
-		return false, nil
 	default:
 		log.Printf("unhandled packet %#v", rsp)
 	}
diff --git a/lib/gat/gatling/server/server.go b/lib/gat/gatling/server/server.go
index 2883a14127ec02cc9fc206d9794c6f0b86997c20..060bf5fdf957377e53b644cd4c5df812eb1567dd 100644
--- a/lib/gat/gatling/server/server.go
+++ b/lib/gat/gatling/server/server.go
@@ -507,9 +507,10 @@ func (s *Server) destructPreparedStatement(name string) {
 		return
 	}
 	delete(s.boundPreparedStatments, name)
-	query := new(protocol.Query)
-	query.Fields.Query = fmt.Sprintf("DEALLOCATE \"%s\"", name)
-	_ = s.writePacket(query)
+	closeRequest := new(protocol.Close)
+	closeRequest.Fields.Which = 'S'
+	closeRequest.Fields.Name = name
+	_ = s.writePacket(closeRequest)
 	_ = s.flush()
 	// await server ready
 	for {
@@ -749,7 +750,7 @@ func (s *Server) Close() error {
 	default:
 		s.readyForQuery = false
 		close(s.closed)
-		_ = s.writePacket(&protocol.Close{})
+		_ = s.writePacket(&protocol.Terminate{})
 		return s.conn.Close()
 	}
 }