diff --git a/lib/gat/admin/admin.go b/lib/gat/admin/admin.go
index 3c72400a0ff284a9ace67a3156cb3d984e33485c..0dc63ca41385e12c9fed6f793bcd4bee34265b1a 100644
--- a/lib/gat/admin/admin.go
+++ b/lib/gat/admin/admin.go
@@ -98,7 +98,11 @@ func New(g gat.Gat) *Database {
 			Header: gatutil.TableHeader{
 				Columns: []gatutil.TableHeaderColumn{
 					{
-						Name: "Table name",
+						Name: "Database",
+						Type: gatutil.Text{},
+					},
+					{
+						Name: "User",
 						Type: gatutil.Text{},
 					},
 					{
@@ -119,17 +123,21 @@ func New(g gat.Gat) *Database {
 					},
 				},
 			},
-			Rows: []gatutil.TableRow{
-				{
+		}
+		for dbname, db := range g.GetDatabases() {
+			for _, pool := range db.GetPools() {
+				uname := pool.GetUser().Name
+				table.Rows = append(table.Rows, gatutil.TableRow{
 					Columns: []any{
-						"Test",
-						float64(1.0),
-						float64(2.0),
-						float64(3.0),
-						int64(123),
+						dbname,
+						uname,
+						float64(0),
+						float64(0),
+						float64(0),
+						int64(0),
 					},
-				},
-			},
+				})
+			}
 		}
 		return table.Send(c)
 	})
diff --git a/lib/gat/pool/transaction/shard/conn.go b/lib/gat/pool/transaction/shard/conn.go
index c7d25f4c2c56b822daf65bc9ed9726ab83423d5d..5262affe039efe235ab57c3708cb7a0bee3d1d21 100644
--- a/lib/gat/pool/transaction/shard/conn.go
+++ b/lib/gat/pool/transaction/shard/conn.go
@@ -10,98 +10,98 @@ import (
 	"time"
 )
 
-type conn struct {
+type Conn struct {
 	conn      gat.Connection
 	conf      *config.Server
 	replicaId int
 	s         *Shard
 }
 
-func (s *conn) GetServerInfo() []*protocol.ParameterStatus {
+func (s *Conn) GetServerInfo() []*protocol.ParameterStatus {
 	return s.conn.GetServerInfo()
 }
 
-func (s *conn) GetDatabase() string {
+func (s *Conn) GetDatabase() string {
 	return s.conn.GetDatabase()
 }
 
-func (s *conn) GetState() gat.ConnectionState {
+func (s *Conn) GetState() gat.ConnectionState {
 	return s.conn.GetState()
 }
 
-func (s *conn) GetHost() string {
+func (s *Conn) GetHost() string {
 	return s.conn.GetHost()
 }
 
-func (s *conn) GetPort() int {
+func (s *Conn) GetPort() int {
 	return s.conn.GetPort()
 }
 
-func (s *conn) GetAddress() net.Addr {
+func (s *Conn) GetAddress() net.Addr {
 	return s.conn.GetAddress()
 }
 
-func (s *conn) GetLocalAddress() net.Addr {
+func (s *Conn) GetLocalAddress() net.Addr {
 	return s.conn.GetLocalAddress()
 }
 
-func (s *conn) GetConnectTime() time.Time {
+func (s *Conn) GetConnectTime() time.Time {
 	return s.conn.GetConnectTime()
 }
 
-func (s *conn) GetRequestTime() time.Time {
+func (s *Conn) GetRequestTime() time.Time {
 	return s.conn.GetRequestTime()
 }
 
-func (s *conn) GetClient() gat.Client {
+func (s *Conn) GetClient() gat.Client {
 	return s.conn.GetClient()
 }
 
-func (s *conn) SetClient(client gat.Client) {
+func (s *Conn) SetClient(client gat.Client) {
 	s.conn.SetClient(client)
 }
 
-func (s *conn) GetRemotePid() int {
+func (s *Conn) GetRemotePid() int {
 	return s.conn.GetRemotePid()
 }
 
-func (s *conn) GetTLS() string {
+func (s *Conn) GetTLS() string {
 	return s.conn.GetTLS()
 }
 
-func (s *conn) IsCloseNeeded() bool {
+func (s *Conn) IsCloseNeeded() bool {
 	return s.conn.IsCloseNeeded()
 }
 
-func (s *conn) Close() error {
+func (s *Conn) Close() error {
 	return s.conn.Close()
 }
 
-func (s *conn) Describe(ctx context.Context, client gat.Client, payload *protocol.Describe) error {
+func (s *Conn) Describe(ctx context.Context, client gat.Client, payload *protocol.Describe) error {
 	return s.conn.Describe(ctx, client, payload)
 }
 
-func (s *conn) Execute(ctx context.Context, client gat.Client, payload *protocol.Execute) error {
+func (s *Conn) Execute(ctx context.Context, client gat.Client, payload *protocol.Execute) error {
 	return s.conn.Execute(ctx, client, payload)
 }
 
-func (s *conn) CallFunction(ctx context.Context, client gat.Client, payload *protocol.FunctionCall) error {
+func (s *Conn) CallFunction(ctx context.Context, client gat.Client, payload *protocol.FunctionCall) error {
 	return s.conn.CallFunction(ctx, client, payload)
 }
 
-func (s *conn) SimpleQuery(ctx context.Context, client gat.Client, payload string) error {
+func (s *Conn) SimpleQuery(ctx context.Context, client gat.Client, payload string) error {
 	return s.conn.SimpleQuery(ctx, client, payload)
 }
 
-func (s *conn) Transaction(ctx context.Context, client gat.Client, payload string) error {
+func (s *Conn) Transaction(ctx context.Context, client gat.Client, payload string) error {
 	return s.conn.Transaction(ctx, client, payload)
 }
 
-func (s *conn) Cancel() error {
+func (s *Conn) Cancel() error {
 	return s.conn.Cancel()
 }
 
-func (s *conn) connect() {
+func (s *Conn) connect() {
 	if s.s == nil || s.conf == nil {
 		return
 	}
@@ -116,7 +116,7 @@ func (s *conn) connect() {
 	return
 }
 
-func (s *conn) acquire() *conn {
+func (s *Conn) acquire() *Conn {
 	if s.conn == nil || s.conn.IsCloseNeeded() {
 		s.connect()
 	}
diff --git a/lib/gat/pool/transaction/shard/shard.go b/lib/gat/pool/transaction/shard/shard.go
index 5c887911bae39eed6a2d0491f8e89088ef499f3d..aedb5157e69200b6a780be7a5fb34a275ecdcdee 100644
--- a/lib/gat/pool/transaction/shard/shard.go
+++ b/lib/gat/pool/transaction/shard/shard.go
@@ -11,8 +11,8 @@ import (
 )
 
 type Shard struct {
-	primary  Pool[*conn]
-	replicas []Pool[*conn]
+	primary  Pool[*Conn]
+	replicas []Pool[*Conn]
 
 	pool *config.Pool
 	user *config.User
@@ -43,8 +43,8 @@ func FromConfig(dialer gat.Dialer, options []protocol.FieldsStartupMessageParame
 	return out
 }
 
-func (s *Shard) newConn(conf *config.Server, replicaId int) *conn {
-	return &conn{
+func (s *Shard) newConn(conf *config.Server, replicaId int) *Conn {
+	return &Conn{
 		conf:      conf,
 		replicaId: replicaId,
 		s:         s,
@@ -56,7 +56,7 @@ func (s *Shard) init() {
 	defer s.mu.Unlock()
 	poolSize := s.user.PoolSize
 	for _, serv := range s.conf.Servers {
-		pool := NewChannelPool[*conn](poolSize)
+		pool := NewChannelPool[*Conn](poolSize)
 		for i := 0; i < poolSize; i++ {
 			pool.Put(s.newConn(serv, len(s.replicas)))
 		}
@@ -69,7 +69,7 @@ func (s *Shard) init() {
 	}
 }
 
-func (s *Shard) tryAcquireAvailableReplica() *conn {
+func (s *Shard) tryAcquireAvailableReplica() *Conn {
 	// try to get any available conn
 	for _, replica := range s.replicas {
 		c, ok := replica.TryGet()
@@ -81,7 +81,7 @@ func (s *Shard) tryAcquireAvailableReplica() *conn {
 	return nil
 }
 
-func (s *Shard) Choose(role config.ServerRole) *conn {
+func (s *Shard) Choose(role config.ServerRole) *Conn {
 	s.mu.RLock()
 	defer s.mu.RUnlock()
 	start := time.Now()
@@ -121,7 +121,7 @@ func (s *Shard) Choose(role config.ServerRole) *conn {
 	}
 }
 
-func (s *Shard) Return(conn *conn) {
+func (s *Shard) Return(conn *Conn) {
 	s.mu.RLock()
 	defer s.mu.RUnlock()
 	switch conn.conf.Role {
diff --git a/scripts/ddos/ddos.go b/scripts/ddos/ddos.go
index ba0f6e6beaee7f40a53b90f541aeb51947445869..6facf4d457a8e8463bbcbbabe95df5642662eed3 100644
--- a/scripts/ddos/ddos.go
+++ b/scripts/ddos/ddos.go
@@ -27,7 +27,7 @@ const PostgresHost = "postgres://dev_rw:pGf63Aq0M5ck@pggat-dev.gfx.town:6432/pre
 const ThreadCount = 1000
 
 // TestTime how long to run the test. Set to 0 to run forever
-const TestTime = 30 * time.Second
+const TestTime = 0 * time.Second
 
 type col struct {
 	V int `json:"v"`
diff --git a/test/docker-compose.yml b/test/docker-compose.yml
index 2d6583db6e79a4ce57c523d12dfca3ea6c2d98ba..0567735f7cddf6916158d76e10ba0a5c8801d785 100644
--- a/test/docker-compose.yml
+++ b/test/docker-compose.yml
@@ -30,7 +30,7 @@ services:
     image: prest/prest
     restart: always
     environment:
-      PREST_PG_URL: postgres://postgres:example@db:5432/prest
+      PREST_PG_URL: postgres://postgres:example@pggat:6432/prest
       PREST_DEBUG: true
       PREST_SSL_MODE: disable
     ports: