diff --git a/lib/bouncer/frontends/v0/accept.go b/lib/bouncer/frontends/v0/accept.go
index c33638921f8c3e4d636cfa8389b71bb884f82214..5c5a3031337332c2f2b7ebfa775dbdd6475d55f9 100644
--- a/lib/bouncer/frontends/v0/accept.go
+++ b/lib/bouncer/frontends/v0/accept.go
@@ -90,7 +90,7 @@ func startup0(
 						}
 
 						ikey := strutil.MakeCIString(key)
-						if ctx.Conn.InitialParameters == nil {
+						if ctx.Conn.InitialParameters() == nil {
 							values := make(map[strutil.CIString]string)
 							ctx.Conn.SetInitialParameters(values)
 						}
@@ -118,7 +118,7 @@ func startup0(
 					unsupportedOptions = append(unsupportedOptions, parameter.Key)
 				} else {
 					ikey := strutil.MakeCIString(parameter.Key)
-					if ctx.Conn.InitialParameters == nil {
+					if ctx.Conn.InitialParameters() == nil {
 						values := make(map[strutil.CIString]string)
 						ctx.Conn.SetInitialParameters(values)
 					}
diff --git a/lib/fed/conn.go b/lib/fed/conn.go
index fba3920fe684fb23ed5a5eaad69526d6bbf3602c..9733d3565b12c9374476f19489060371d6f5fdce 100644
--- a/lib/fed/conn.go
+++ b/lib/fed/conn.go
@@ -49,7 +49,8 @@ func (c *conn) SetInitialParameters(i map[strutil.CIString]string) { c.initialPa
 
 func NewConn(rw net.Conn) Conn {
 	c := &conn{
-		NetConn: rw,
+		NetConn:           rw,
+		initialParameters: map[strutil.CIString]string{},
 	}
 	c.encoder.Reset(rw)
 	c.decoder.Reset(rw)
diff --git a/lib/gat/glisten.go b/lib/gat/glisten.go
index 54e6e0692f60cf58934661a024d743304eb74387..fad56a64f9e82577642d4be972c1de2c02b2115e 100644
--- a/lib/gat/glisten.go
+++ b/lib/gat/glisten.go
@@ -11,6 +11,7 @@ import (
 	"time"
 
 	"github.com/caddyserver/caddy/v2"
+	"github.com/panjf2000/gnet/v2"
 	"go.uber.org/zap"
 
 	"gfx.cafe/gfx/pggat/lib/gfed"
@@ -74,7 +75,8 @@ func (T *GListener) Provision(ctx caddy.Context) error {
 		T.ssl = val.(SSLServer)
 	}
 
-	return nil
+	T.server = &gfed.Server{}
+	return T.server.Provision(ctx)
 }
 
 func (T *GListener) Start() error {
@@ -85,7 +87,9 @@ func (T *GListener) Start() error {
 	}
 	ctx, cn := context.WithTimeout(context.Background(), 5*time.Second)
 	defer cn()
-	err := T.server.StartServer(ctx, T.networkAddress.String())
+	err := T.server.StartServer(ctx, T.networkAddress.Network+"://"+T.networkAddress.String(),
+		gnet.WithMulticore(true),
+	)
 	if err != nil {
 		return err
 	}
diff --git a/lib/gat/server.go b/lib/gat/server.go
index 21bd9235ab440e3bd8432bd0c35fb1ddf9b20686..af1156432d5bccebec26f647ed28e3fd62c0a394 100644
--- a/lib/gat/server.go
+++ b/lib/gat/server.go
@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"io"
 	"net"
+	"strings"
 
 	"github.com/caddyserver/caddy/v2"
 	"go.uber.org/zap"
@@ -18,9 +19,8 @@ import (
 )
 
 type ServerConfig struct {
-	Listen  []ListenerConfig `json:"listen,omitempty"`
-	GListen []ListenerConfig `json:"glisten,omitempty"`
-	Routes  []RouteConfig    `json:"routes,omitempty"`
+	Listen []ListenerConfig `json:"listen,omitempty"`
+	Routes []RouteConfig    `json:"routes,omitempty"`
 }
 
 type Server struct {
@@ -43,17 +43,23 @@ func (T *Server) Provision(ctx caddy.Context) error {
 		listener := &Listener{
 			ListenerConfig: config,
 		}
+		if strings.HasSuffix(config.Address, "66") {
+			continue
+		}
 		if err := listener.Provision(ctx); err != nil {
 			return err
 		}
 		T.listen = append(T.listen, listener)
 	}
 
-	T.glisten = make([]*GListener, 0, len(T.GListen))
-	for _, config := range T.GListen {
+	T.glisten = make([]*GListener, 0, len(T.Listen))
+	for _, config := range T.Listen {
 		glistener := &GListener{
 			ListenerConfig: config,
 		}
+		if !strings.HasSuffix(config.Address, "66") {
+			continue
+		}
 		if err := glistener.Provision(ctx); err != nil {
 			return err
 		}
@@ -98,7 +104,7 @@ func (T *Server) Start() error {
 	for _, glistener := range T.glisten {
 		// TODO: sort of hacky. should clean up.
 		glistener.server.Acceptor = func(c *gfed.Codec) {
-			T.gaccept(glistener, c)
+			go T.gaccept(glistener, c)
 		}
 		if err := glistener.Start(); err != nil {
 			return err
diff --git a/lib/gfed/codec.go b/lib/gfed/codec.go
index 260ad82fedb835b37d6bc6857b96afb78ea658e1..4c0f57dfd049d652ec35c1b2617a7e8e07355ce2 100644
--- a/lib/gfed/codec.go
+++ b/lib/gfed/codec.go
@@ -3,6 +3,7 @@ package gfed
 import (
 	"bufio"
 	"crypto/tls"
+	"fmt"
 	"io"
 	"net"
 
@@ -61,7 +62,8 @@ func NewCodec() *Codec {
 	//TODO: pool buffers maybe? idk. weird use case.
 	rd := bufio.NewReader(out)
 	c := &Codec{
-		in: in,
+		in:                in,
+		initialParameters: map[strutil.CIString]string{},
 	}
 	c.decoder.Reset(rd)
 	return c
@@ -83,9 +85,10 @@ func (T *Codec) readPacket(typed bool) (fed.Packet, error) {
 	if err := T.decoder.Next(typed); err != nil {
 		return nil, err
 	}
-	return fed.PendingPacket{
+	pending := fed.PendingPacket{
 		Decoder: &T.decoder,
-	}, nil
+	}
+	return pending, nil
 }
 
 func (T *Codec) ReadPacket(typed bool) (fed.Packet, error) {
@@ -220,7 +223,7 @@ func (T *Codec) ReadByte() (byte, error) {
 }
 
 func (T *Codec) EnableSSL(config *tls.Config, isClient bool) error {
-	panic("ssl not supported")
+	return fmt.Errorf("ssl not supported")
 }
 
 func (T *Codec) Close() error {
diff --git a/lib/gfed/gfed.go b/lib/gfed/gfed.go
index 8b2a609e70900af66664def9279fcf0d7e043399..6ceaf8e4adf6eeb1a18e41dca83edcacd45bb744 100644
--- a/lib/gfed/gfed.go
+++ b/lib/gfed/gfed.go
@@ -15,8 +15,9 @@ type Server struct {
 
 	log *slog.Logger
 
-	ready chan struct{}
-	conns chan *Codec
+	ready  chan struct{}
+	conns  chan *Codec
+	closed chan error
 
 	gnet.BuiltinEventEngine
 	eng       gnet.Engine
@@ -24,16 +25,15 @@ type Server struct {
 }
 
 func (s *Server) StartServer(ctx context.Context, addr string, opts ...gnet.Option) error {
-	errch := make(chan error)
 	go func() {
 		err := gnet.Run(s, addr, opts...)
 		if err != nil {
-			errch <- err
+			s.closed <- err
 		}
-		close(errch)
+		close(s.closed)
 	}()
 	select {
-	case err := <-errch:
+	case err := <-s.closed:
 		if err != nil {
 			return err
 		}
@@ -48,22 +48,26 @@ func (s *Server) StartServer(ctx context.Context, addr string, opts ...gnet.Opti
 func (T *Server) Provision(ctx caddy.Context) error {
 	T.log = ctx.Slogger()
 	T.ready = make(chan struct{})
+	T.closed = make(chan error)
 	return nil
 }
 
 func (s *Server) OnOpen(c gnet.Conn) ([]byte, gnet.Action) {
-	dec := new(Codec)
+	slog.Info("new conn", "conn", c.RemoteAddr().String())
+	dec := NewCodec()
 	c.SetContext(dec)
 	dec.localAddr = c.LocalAddr()
 	dec.gnetConn = c
+	dec.encoder.Reset(c)
 	s.connected.Add(1)
 	s.Acceptor(dec)
 	return nil, gnet.None
 }
 
 func (s *Server) OnTraffic(c gnet.Conn) gnet.Action {
+	//slog.Info("got traffic", "conn", c.RemoteAddr().String())
 	uc := c.Context().(*Codec)
-	bts, err := c.Next(c.InboundBuffered())
+	bts, err := c.Next(-1)
 	if err != nil {
 		s.log.Error("short read", "conn", c.RemoteAddr(), "err", err)
 		return gnet.Close
@@ -75,6 +79,7 @@ func (s *Server) OnTraffic(c gnet.Conn) gnet.Action {
 	return gnet.None
 }
 func (s *Server) OnBoot(eng gnet.Engine) gnet.Action {
+	close(s.ready)
 	return gnet.None
 }
 func (s *Server) OnShutdown(eng gnet.Engine) {