diff --git a/lib/gat/acceptor.go b/lib/gat/acceptor.go
index 6a14f7960bcb97e28405fccf34b5418a955b4222..d58aaa96b36f94db84e44461dff66f2c5740fd8d 100644
--- a/lib/gat/acceptor.go
+++ b/lib/gat/acceptor.go
@@ -92,18 +92,35 @@ func serve(client fed.Conn, acceptParams frontends.AcceptParams, pools Pools) er
 
 func Serve(acceptor Acceptor, pools Pools) error {
 	for {
-		conn, acceptParams, err := acceptor.Accept()
+		netConn, err := acceptor.Listener.Accept()
 		if err != nil {
 			if errors.Is(err, net.ErrClosed) {
 				return nil
 			}
-			log.Print("error accepting client: ", err)
+			log.Print("error accepting connection: ", err)
 			continue
 		}
+		conn := fed.WrapNetConn(netConn)
+
 		go func() {
-			err := serve(conn, acceptParams, pools)
+			defer func() {
+				_ = conn.Close()
+			}()
+
+			ctx := frontends.AcceptContext{
+				Conn:    conn,
+				Options: acceptor.Options,
+			}
+			acceptParams, acceptErr := frontends.Accept(&ctx)
+			if acceptErr != nil {
+				log.Print("error accepting client: ", acceptErr)
+				return
+			}
+
+			err = serve(conn, acceptParams, pools)
 			if err != nil && !errors.Is(err, io.EOF) {
 				log.Print("error serving client: ", err)
+				return
 			}
 		}()
 	}