diff --git a/Makefile b/Makefile
index 8ac08fb9493f703554cc05613d006cc3d1f44432..57f50a0c598a35d28a4acaa6fc4cf6b3f761cd15 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
 .PHONY: all
 all:
 	go generate ./...
+	go install ./...
 
 
 # vim:ft=make
diff --git a/folders/messages.go b/folders/messages.go
index 87c9f025457b62c57bd1ae18da2c9bf3b4c7e035..3be061c4dc24d512ba742ff7f12fe4bb7436f42a 100644
--- a/folders/messages.go
+++ b/folders/messages.go
@@ -63,7 +63,7 @@ func ReadMessage(login, folder string, msgid int64) (*storage.Message, error) {
 }
 
 // ListMessages lists messages.
-func ListMessages(folder string) ([]storage.ListMessagesRow, error) {
+func ListMessages(folder string) ([]storage.Message, error) {
 	ctx := context.TODO()
 	// TODO: options aren't implemented - need to set them?
 	rows, err := this.Q.ListMessages(ctx, folder)
diff --git a/repl/messages.go b/repl/messages.go
index f8068b165677e68a585d8c913281e5bc3c5a241c..019f176d98eb5a4da7514bd4381a92b26444e24e 100644
--- a/repl/messages.go
+++ b/repl/messages.go
@@ -19,6 +19,10 @@ import (
 // messages in the current folder.
 func ActionDirectory(cmd *dclish.Command) error {
 	// TODO: flag parsing.
+	showExpiration := false
+	if cmd.Flags["/EXPIRATION"].Value == "true" {
+		showExpiration = true
+	}
 	if len(cmd.Args) == 1 {
 		folder, err := folders.ValidFolder(cmd.Args[0])
 		if err != nil {
@@ -36,8 +40,7 @@ func ActionDirectory(cmd *dclish.Command) error {
 	}
 	fmt.Printf("%4s %-43s %-12s %-10s\n", "#", "Subject", "From", "Date")
 	for _, msg := range msgs {
-		fmt.Printf("%4d %-43s %-12s %-10s\n", msg.ID, msg.Subject, msg.Author,
-			msg.CreateAt.Format("2006-05-04 15:02:01"))
+		fmt.Printf("%s\n", msg.OneLine(showExpiration))
 	}
 
 	return nil
diff --git a/storage/display.go b/storage/display.go
index cf41bf664907ca1dd352b8be1f42454f23d29fc0..75155344ae056ec99677f9ff5bf43fc312de4fc7 100644
--- a/storage/display.go
+++ b/storage/display.go
@@ -22,8 +22,8 @@ func (m *Message) String() string {
 	return buf.String()
 }
 
-// String renders a message row.
-func (m *ListMessagesRow) String(expire bool) string {
+// OneLine renders a message in a line.
+func (m *Message) OneLine(expire bool) string {
 	var t time.Time
 	if expire {
 		t = m.Expiration
diff --git a/storage/folders.sql.go b/storage/folders.sql.go
index cad1cd795e650d8e6d5e383c6d0d6d7a324dbc8a..7b5bc42eaf4e208236a7760e86a1c4b22d077e60 100644
--- a/storage/folders.sql.go
+++ b/storage/folders.sql.go
@@ -61,15 +61,6 @@ func (q *Queries) CreateFolder(ctx context.Context, arg CreateFolderParams) erro
 	return err
 }
 
-const deleteFolder = `-- name: DeleteFolder :exec
-DELETE FROM folders WHERE name=?
-`
-
-func (q *Queries) DeleteFolder(ctx context.Context, name string) error {
-	_, err := q.db.ExecContext(ctx, deleteFolder, name)
-	return err
-}
-
 const findFolderExact = `-- name: FindFolderExact :one
 SELECT name FROM folders where name = ?
 `
diff --git a/storage/messages.sql.go b/storage/messages.sql.go
index 5e37783894dc9ae6c1b85b050b7eded2ae459aa1..cf675fa48f064e5da4419f484ea7885862124eac 100644
--- a/storage/messages.sql.go
+++ b/storage/messages.sql.go
@@ -54,70 +54,6 @@ func (q *Queries) GetFirstMessageID(ctx context.Context, folder string) (int64,
 	return id, err
 }
 
-const listMessages = `-- name: ListMessages :many
-SELECT id, folder, author, subject, message, expiration, create_at, update_at
-FROM messages
-WHERE folder = ?
-`
-
-type ListMessagesRow struct {
-	ID         int64
-	Folder     string
-	Author     string
-	Subject    string
-	Message    string
-	Expiration time.Time
-	CreateAt   time.Time
-	UpdateAt   time.Time
-}
-
-func (q *Queries) ListMessages(ctx context.Context, folder string) ([]ListMessagesRow, error) {
-	rows, err := q.db.QueryContext(ctx, listMessages, folder)
-	if err != nil {
-		return nil, err
-	}
-	defer rows.Close()
-	var items []ListMessagesRow
-	for rows.Next() {
-		var i ListMessagesRow
-		if err := rows.Scan(
-			&i.ID,
-			&i.Folder,
-			&i.Author,
-			&i.Subject,
-			&i.Message,
-			&i.Expiration,
-			&i.CreateAt,
-			&i.UpdateAt,
-		); err != nil {
-			return nil, err
-		}
-		items = append(items, i)
-	}
-	if err := rows.Close(); err != nil {
-		return nil, err
-	}
-	if err := rows.Err(); err != nil {
-		return nil, err
-	}
-	return items, nil
-}
-
-const markMessage = `-- name: MarkMessage :exec
-INSERT INTO mark (login, folder, msgid) VALUES (?, ?, ?)
-`
-
-type MarkMessageParams struct {
-	Login  string
-	Folder string
-	Msgid  int64
-}
-
-func (q *Queries) MarkMessage(ctx context.Context, arg MarkMessageParams) error {
-	_, err := q.db.ExecContext(ctx, markMessage, arg.Login, arg.Folder, arg.Msgid)
-	return err
-}
-
 const readMessage = `-- name: ReadMessage :one
 SELECT id, folder, author, subject, message, permanent, shutdown, expiration, create_at, update_at FROM messages WHERE folder = ? AND id = ?
 `
diff --git a/storage/migrations/1_create_table.up.sql b/storage/migrations/1_create_table.up.sql
index 4899e330808792e09cc999ecce73de52e56ea2bf..863515cede390c0d4325644d4c0f9189af93c5d9 100644
--- a/storage/migrations/1_create_table.up.sql
+++ b/storage/migrations/1_create_table.up.sql
@@ -135,7 +135,7 @@ CREATE TABLE seen (
     ON UPDATE CASCADE
 ) WITHOUT ROWID;
 
-CREATE TABLE mark (
+CREATE TABLE marks (
   login       VARCHAR(25) REFERENCES users(login)
               ON DELETE CASCADE ON UPDATE CASCADE NOT NULL,
   folder      VARCHAR(25) REFERENCES folders(name)
@@ -158,7 +158,7 @@ CREATE TABLE folder_access (
 ) WITHOUT ROWID;
 
 --- User folder configs.
-CREATE TABLE config (
+CREATE TABLE folder_configs (
   login       VARCHAR(25) REFERENCES users(login)
               ON DELETE CASCADE ON UPDATE CASCADE NOT NULL,
   folder      VARCHAR(25) REFERENCES folders(name)
diff --git a/storage/models.go b/storage/models.go
index ac7da0b7f55da831fd3336c58ae3b620a733227b..ea5558cbbd29ae33e95a32d67b078de035ec0138 100644
--- a/storage/models.go
+++ b/storage/models.go
@@ -8,13 +8,6 @@ import (
 	"time"
 )
 
-type Config struct {
-	Login  string
-	Folder string
-	Always int64
-	Alert  int64
-}
-
 type Folder struct {
 	Name        string
 	Always      int64
@@ -35,6 +28,13 @@ type FolderAccess struct {
 	Folder string
 }
 
+type FolderConfig struct {
+	Login  string
+	Folder string
+	Always int64
+	Alert  int64
+}
+
 type Mark struct {
 	Login  string
 	Folder string
diff --git a/storage/queries/folders.sql b/storage/queries/folders.sql
index 7882910b0c6a19c2570d78ea4bb9b254faf3776b..16183321535b352140fc38df3963d1a9abecab54 100644
--- a/storage/queries/folders.sql
+++ b/storage/queries/folders.sql
@@ -36,8 +36,5 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS o ON f.name = c.folder
 -- name: IsFolderOwner :one
 SELECT 1 FROM owners WHERE folder = ? AND login = ?;
 
--- name: DeleteFolder :exec
-DELETE FROM folders WHERE name=?;
-
 -- name: GetFolderExpire :one
 SELECT expire FROM folders WHERE name = ?;
diff --git a/storage/queries/messages.sql b/storage/queries/messages.sql
index 9f6ea221d4611cb9e046a419ea5c103f64ba8ad7..345619b3088c4c761ae6f83f6a0b905b8bc28101 100644
--- a/storage/queries/messages.sql
+++ b/storage/queries/messages.sql
@@ -8,14 +8,6 @@ INSERT INTO messages (
 -- name: SetMessageSeen :exec
 INSERT INTO seen (login, folder, msgid) VALUES (?, ?, ?);
 
--- name: MarkMessage :exec
-INSERT INTO mark (login, folder, msgid) VALUES (?, ?, ?);
-
--- name: ListMessages :many
-SELECT id, folder, author, subject, message, expiration, create_at, update_at
-FROM messages
-WHERE folder = ?;
-
 -- name: GetFirstMessageID :one
 SELECT id FROM messages WHERE folder = ? and id = MIN(id) GROUP BY folder;
 
diff --git a/storage/queries/standard.sql b/storage/queries/standard.sql
new file mode 100644
index 0000000000000000000000000000000000000000..cdfe2e4afff983b469b3b4e9035a87eff74bcece
--- /dev/null
+++ b/storage/queries/standard.sql
@@ -0,0 +1,95 @@
+-- name: ListUsers :many
+SELECT * FROM users;
+
+-- name: DeleteUser :exec
+DELETE FROM users WHERE login = ?;
+
+-- name: AddFolder :exec
+INSERT INTO folders (name) VALUES (?);
+
+-- name: ListFolders :many
+SELECT * FROM folders;
+
+-- name: GetFolder :one
+SELECT * FROM folders WHERE name = ?;
+
+-- name: DeleteFolder :exec
+DELETE FROM folders WHERE name = ?;
+
+-- name: AddOwner :exec
+INSERT INTO owners (folder, login) VALUES (?, ?);
+
+-- name: ListOwners :many
+SELECT * FROM owners;
+
+-- name: GetOwner :one
+SELECT * FROM owners WHERE folder = ? AND login = ?;
+
+-- name: DeleteOwner :exec
+DELETE FROM owners WHERE folder = ? AND login = ?;
+
+-- name: AddMessage :exec
+INSERT INTO messages (id, folder) VALUES (?, ?);
+
+-- name: ListMessages :many
+SELECT * FROM messages WHERE folder = ?;
+
+-- name: GetMessage :one
+SELECT * FROM messages WHERE id = ? AND folder = ?;
+
+-- name: DeleteMessage :exec
+DELETE FROM messages WHERE id = ? AND folder = ?;
+
+-- name: AddSeen :exec
+INSERT INTO seen (folder, login, msgid) VALUES (?, ?, ?);
+
+-- name: ListSeen :many
+SELECT * FROM seen;
+
+-- name: GetSeen :one
+SELECT * FROM seen WHERE folder = ? AND login = ? AND msgid = ?;
+
+-- name: DeleteSeen :exec
+DELETE FROM seen WHERE folder = ? AND login = ? AND msgid = ?;
+
+-- name: AddMark :exec
+INSERT INTO marks (folder, login, msgid) VALUES (?, ?, ?);
+
+-- name: ListMark :many
+SELECT * FROM marks;
+
+-- name: GetMark :one
+SELECT * FROM marks WHERE folder = ? AND login = ? AND msgid = ?;
+
+-- name: DeleteMark :exec
+DELETE FROM marks WHERE folder = ? AND login = ? AND msgid = ?;
+
+-- name: AddFolderAccess :exec
+INSERT INTO folder_access (login, folder) VALUES (?, ?);
+
+-- name: ListFolderAccess :many
+SELECT * FROM folder_access;
+
+-- name: GetFolderAccess :one
+SELECT * FROM folder_access WHERE login = ? AND folder = ?;
+
+-- name: DeleteFolderAccess :exec
+DELETE FROM folder_access WHERE login = ? AND folder = ?;
+
+-- name: AddFolderConfig :exec
+INSERT INTO folder_configs (login, folder) VALUES (?, ?);
+
+-- name: ListFolderConfig :many
+SELECT * FROM folder_configs;
+
+-- name: GetFolderConfig :one
+SELECT * FROM folder_configs WHERE login = ? AND folder = ?;
+
+-- name: DeleteFolderConfig :exec
+DELETE FROM folder_configs WHERE login = ? AND folder = ?;
+
+-- name: AddSystem :exec
+INSERT INTO system (name) VALUES (?);
+
+-- name: GetSystem :one
+SELECT * FROM system WHERE name = ?;
diff --git a/storage/standard.sql.go b/storage/standard.sql.go
new file mode 100644
index 0000000000000000000000000000000000000000..5e464f92a2830b038f19f512acbd54a7f5e3c885
--- /dev/null
+++ b/storage/standard.sql.go
@@ -0,0 +1,632 @@
+// Code generated by sqlc. DO NOT EDIT.
+// versions:
+//   sqlc v1.29.0
+// source: standard.sql
+
+package storage
+
+import (
+	"context"
+)
+
+const addFolder = `-- name: AddFolder :exec
+INSERT INTO folders (name) VALUES (?)
+`
+
+func (q *Queries) AddFolder(ctx context.Context, name string) error {
+	_, err := q.db.ExecContext(ctx, addFolder, name)
+	return err
+}
+
+const addFolderAccess = `-- name: AddFolderAccess :exec
+INSERT INTO folder_access (login, folder) VALUES (?, ?)
+`
+
+type AddFolderAccessParams struct {
+	Login  string
+	Folder string
+}
+
+func (q *Queries) AddFolderAccess(ctx context.Context, arg AddFolderAccessParams) error {
+	_, err := q.db.ExecContext(ctx, addFolderAccess, arg.Login, arg.Folder)
+	return err
+}
+
+const addFolderConfig = `-- name: AddFolderConfig :exec
+INSERT INTO folder_configs (login, folder) VALUES (?, ?)
+`
+
+type AddFolderConfigParams struct {
+	Login  string
+	Folder string
+}
+
+func (q *Queries) AddFolderConfig(ctx context.Context, arg AddFolderConfigParams) error {
+	_, err := q.db.ExecContext(ctx, addFolderConfig, arg.Login, arg.Folder)
+	return err
+}
+
+const addMark = `-- name: AddMark :exec
+INSERT INTO marks (folder, login, msgid) VALUES (?, ?, ?)
+`
+
+type AddMarkParams struct {
+	Folder string
+	Login  string
+	Msgid  int64
+}
+
+func (q *Queries) AddMark(ctx context.Context, arg AddMarkParams) error {
+	_, err := q.db.ExecContext(ctx, addMark, arg.Folder, arg.Login, arg.Msgid)
+	return err
+}
+
+const addMessage = `-- name: AddMessage :exec
+INSERT INTO messages (id, folder) VALUES (?, ?)
+`
+
+type AddMessageParams struct {
+	ID     int64
+	Folder string
+}
+
+func (q *Queries) AddMessage(ctx context.Context, arg AddMessageParams) error {
+	_, err := q.db.ExecContext(ctx, addMessage, arg.ID, arg.Folder)
+	return err
+}
+
+const addOwner = `-- name: AddOwner :exec
+INSERT INTO owners (folder, login) VALUES (?, ?)
+`
+
+type AddOwnerParams struct {
+	Folder string
+	Login  string
+}
+
+func (q *Queries) AddOwner(ctx context.Context, arg AddOwnerParams) error {
+	_, err := q.db.ExecContext(ctx, addOwner, arg.Folder, arg.Login)
+	return err
+}
+
+const addSeen = `-- name: AddSeen :exec
+INSERT INTO seen (folder, login, msgid) VALUES (?, ?, ?)
+`
+
+type AddSeenParams struct {
+	Folder string
+	Login  string
+	Msgid  int64
+}
+
+func (q *Queries) AddSeen(ctx context.Context, arg AddSeenParams) error {
+	_, err := q.db.ExecContext(ctx, addSeen, arg.Folder, arg.Login, arg.Msgid)
+	return err
+}
+
+const addSystem = `-- name: AddSystem :exec
+INSERT INTO system (name) VALUES (?)
+`
+
+func (q *Queries) AddSystem(ctx context.Context, name string) error {
+	_, err := q.db.ExecContext(ctx, addSystem, name)
+	return err
+}
+
+const deleteFolder = `-- name: DeleteFolder :exec
+DELETE FROM folders WHERE name = ?
+`
+
+func (q *Queries) DeleteFolder(ctx context.Context, name string) error {
+	_, err := q.db.ExecContext(ctx, deleteFolder, name)
+	return err
+}
+
+const deleteFolderAccess = `-- name: DeleteFolderAccess :exec
+DELETE FROM folder_access WHERE login = ? AND folder = ?
+`
+
+type DeleteFolderAccessParams struct {
+	Login  string
+	Folder string
+}
+
+func (q *Queries) DeleteFolderAccess(ctx context.Context, arg DeleteFolderAccessParams) error {
+	_, err := q.db.ExecContext(ctx, deleteFolderAccess, arg.Login, arg.Folder)
+	return err
+}
+
+const deleteFolderConfig = `-- name: DeleteFolderConfig :exec
+DELETE FROM folder_configs WHERE login = ? AND folder = ?
+`
+
+type DeleteFolderConfigParams struct {
+	Login  string
+	Folder string
+}
+
+func (q *Queries) DeleteFolderConfig(ctx context.Context, arg DeleteFolderConfigParams) error {
+	_, err := q.db.ExecContext(ctx, deleteFolderConfig, arg.Login, arg.Folder)
+	return err
+}
+
+const deleteMark = `-- name: DeleteMark :exec
+DELETE FROM marks WHERE folder = ? AND login = ? AND msgid = ?
+`
+
+type DeleteMarkParams struct {
+	Folder string
+	Login  string
+	Msgid  int64
+}
+
+func (q *Queries) DeleteMark(ctx context.Context, arg DeleteMarkParams) error {
+	_, err := q.db.ExecContext(ctx, deleteMark, arg.Folder, arg.Login, arg.Msgid)
+	return err
+}
+
+const deleteMessage = `-- name: DeleteMessage :exec
+DELETE FROM messages WHERE id = ? AND folder = ?
+`
+
+type DeleteMessageParams struct {
+	ID     int64
+	Folder string
+}
+
+func (q *Queries) DeleteMessage(ctx context.Context, arg DeleteMessageParams) error {
+	_, err := q.db.ExecContext(ctx, deleteMessage, arg.ID, arg.Folder)
+	return err
+}
+
+const deleteOwner = `-- name: DeleteOwner :exec
+DELETE FROM owners WHERE folder = ? AND login = ?
+`
+
+type DeleteOwnerParams struct {
+	Folder string
+	Login  string
+}
+
+func (q *Queries) DeleteOwner(ctx context.Context, arg DeleteOwnerParams) error {
+	_, err := q.db.ExecContext(ctx, deleteOwner, arg.Folder, arg.Login)
+	return err
+}
+
+const deleteSeen = `-- name: DeleteSeen :exec
+DELETE FROM seen WHERE folder = ? AND login = ? AND msgid = ?
+`
+
+type DeleteSeenParams struct {
+	Folder string
+	Login  string
+	Msgid  int64
+}
+
+func (q *Queries) DeleteSeen(ctx context.Context, arg DeleteSeenParams) error {
+	_, err := q.db.ExecContext(ctx, deleteSeen, arg.Folder, arg.Login, arg.Msgid)
+	return err
+}
+
+const deleteUser = `-- name: DeleteUser :exec
+DELETE FROM users WHERE login = ?
+`
+
+func (q *Queries) DeleteUser(ctx context.Context, login string) error {
+	_, err := q.db.ExecContext(ctx, deleteUser, login)
+	return err
+}
+
+const getFolder = `-- name: GetFolder :one
+SELECT name, "always", brief, description, notify, readnew, shownew, system, expire, visibility, create_at, update_at FROM folders WHERE name = ?
+`
+
+func (q *Queries) GetFolder(ctx context.Context, name string) (Folder, error) {
+	row := q.db.QueryRowContext(ctx, getFolder, name)
+	var i Folder
+	err := row.Scan(
+		&i.Name,
+		&i.Always,
+		&i.Brief,
+		&i.Description,
+		&i.Notify,
+		&i.Readnew,
+		&i.Shownew,
+		&i.System,
+		&i.Expire,
+		&i.Visibility,
+		&i.CreateAt,
+		&i.UpdateAt,
+	)
+	return i, err
+}
+
+const getFolderAccess = `-- name: GetFolderAccess :one
+SELECT login, folder FROM folder_access WHERE login = ? AND folder = ?
+`
+
+type GetFolderAccessParams struct {
+	Login  string
+	Folder string
+}
+
+func (q *Queries) GetFolderAccess(ctx context.Context, arg GetFolderAccessParams) (FolderAccess, error) {
+	row := q.db.QueryRowContext(ctx, getFolderAccess, arg.Login, arg.Folder)
+	var i FolderAccess
+	err := row.Scan(&i.Login, &i.Folder)
+	return i, err
+}
+
+const getFolderConfig = `-- name: GetFolderConfig :one
+SELECT login, folder, "always", alert FROM folder_configs WHERE login = ? AND folder = ?
+`
+
+type GetFolderConfigParams struct {
+	Login  string
+	Folder string
+}
+
+func (q *Queries) GetFolderConfig(ctx context.Context, arg GetFolderConfigParams) (FolderConfig, error) {
+	row := q.db.QueryRowContext(ctx, getFolderConfig, arg.Login, arg.Folder)
+	var i FolderConfig
+	err := row.Scan(
+		&i.Login,
+		&i.Folder,
+		&i.Always,
+		&i.Alert,
+	)
+	return i, err
+}
+
+const getMark = `-- name: GetMark :one
+SELECT login, folder, msgid FROM marks WHERE folder = ? AND login = ? AND msgid = ?
+`
+
+type GetMarkParams struct {
+	Folder string
+	Login  string
+	Msgid  int64
+}
+
+func (q *Queries) GetMark(ctx context.Context, arg GetMarkParams) (Mark, error) {
+	row := q.db.QueryRowContext(ctx, getMark, arg.Folder, arg.Login, arg.Msgid)
+	var i Mark
+	err := row.Scan(&i.Login, &i.Folder, &i.Msgid)
+	return i, err
+}
+
+const getMessage = `-- name: GetMessage :one
+SELECT id, folder, author, subject, message, permanent, shutdown, expiration, create_at, update_at FROM messages WHERE id = ? AND folder = ?
+`
+
+type GetMessageParams struct {
+	ID     int64
+	Folder string
+}
+
+func (q *Queries) GetMessage(ctx context.Context, arg GetMessageParams) (Message, error) {
+	row := q.db.QueryRowContext(ctx, getMessage, arg.ID, arg.Folder)
+	var i Message
+	err := row.Scan(
+		&i.ID,
+		&i.Folder,
+		&i.Author,
+		&i.Subject,
+		&i.Message,
+		&i.Permanent,
+		&i.Shutdown,
+		&i.Expiration,
+		&i.CreateAt,
+		&i.UpdateAt,
+	)
+	return i, err
+}
+
+const getOwner = `-- name: GetOwner :one
+SELECT folder, login, create_at, update_at FROM owners WHERE folder = ? AND login = ?
+`
+
+type GetOwnerParams struct {
+	Folder string
+	Login  string
+}
+
+func (q *Queries) GetOwner(ctx context.Context, arg GetOwnerParams) (Owner, error) {
+	row := q.db.QueryRowContext(ctx, getOwner, arg.Folder, arg.Login)
+	var i Owner
+	err := row.Scan(
+		&i.Folder,
+		&i.Login,
+		&i.CreateAt,
+		&i.UpdateAt,
+	)
+	return i, err
+}
+
+const getSeen = `-- name: GetSeen :one
+SELECT login, folder, msgid FROM seen WHERE folder = ? AND login = ? AND msgid = ?
+`
+
+type GetSeenParams struct {
+	Folder string
+	Login  string
+	Msgid  int64
+}
+
+func (q *Queries) GetSeen(ctx context.Context, arg GetSeenParams) (Seen, error) {
+	row := q.db.QueryRowContext(ctx, getSeen, arg.Folder, arg.Login, arg.Msgid)
+	var i Seen
+	err := row.Scan(&i.Login, &i.Folder, &i.Msgid)
+	return i, err
+}
+
+const getSystem = `-- name: GetSystem :one
+SELECT name, default_expire, expire_limit FROM system WHERE name = ?
+`
+
+func (q *Queries) GetSystem(ctx context.Context, name string) (System, error) {
+	row := q.db.QueryRowContext(ctx, getSystem, name)
+	var i System
+	err := row.Scan(&i.Name, &i.DefaultExpire, &i.ExpireLimit)
+	return i, err
+}
+
+const listFolderAccess = `-- name: ListFolderAccess :many
+SELECT login, folder FROM folder_access
+`
+
+func (q *Queries) ListFolderAccess(ctx context.Context) ([]FolderAccess, error) {
+	rows, err := q.db.QueryContext(ctx, listFolderAccess)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []FolderAccess
+	for rows.Next() {
+		var i FolderAccess
+		if err := rows.Scan(&i.Login, &i.Folder); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
+const listFolderConfig = `-- name: ListFolderConfig :many
+SELECT login, folder, "always", alert FROM folder_configs
+`
+
+func (q *Queries) ListFolderConfig(ctx context.Context) ([]FolderConfig, error) {
+	rows, err := q.db.QueryContext(ctx, listFolderConfig)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []FolderConfig
+	for rows.Next() {
+		var i FolderConfig
+		if err := rows.Scan(
+			&i.Login,
+			&i.Folder,
+			&i.Always,
+			&i.Alert,
+		); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
+const listFolders = `-- name: ListFolders :many
+SELECT name, "always", brief, description, notify, readnew, shownew, system, expire, visibility, create_at, update_at FROM folders
+`
+
+func (q *Queries) ListFolders(ctx context.Context) ([]Folder, error) {
+	rows, err := q.db.QueryContext(ctx, listFolders)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []Folder
+	for rows.Next() {
+		var i Folder
+		if err := rows.Scan(
+			&i.Name,
+			&i.Always,
+			&i.Brief,
+			&i.Description,
+			&i.Notify,
+			&i.Readnew,
+			&i.Shownew,
+			&i.System,
+			&i.Expire,
+			&i.Visibility,
+			&i.CreateAt,
+			&i.UpdateAt,
+		); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
+const listMark = `-- name: ListMark :many
+SELECT login, folder, msgid FROM marks
+`
+
+func (q *Queries) ListMark(ctx context.Context) ([]Mark, error) {
+	rows, err := q.db.QueryContext(ctx, listMark)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []Mark
+	for rows.Next() {
+		var i Mark
+		if err := rows.Scan(&i.Login, &i.Folder, &i.Msgid); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
+const listMessages = `-- name: ListMessages :many
+SELECT id, folder, author, subject, message, permanent, shutdown, expiration, create_at, update_at FROM messages WHERE folder = ?
+`
+
+func (q *Queries) ListMessages(ctx context.Context, folder string) ([]Message, error) {
+	rows, err := q.db.QueryContext(ctx, listMessages, folder)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []Message
+	for rows.Next() {
+		var i Message
+		if err := rows.Scan(
+			&i.ID,
+			&i.Folder,
+			&i.Author,
+			&i.Subject,
+			&i.Message,
+			&i.Permanent,
+			&i.Shutdown,
+			&i.Expiration,
+			&i.CreateAt,
+			&i.UpdateAt,
+		); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
+const listOwners = `-- name: ListOwners :many
+SELECT folder, login, create_at, update_at FROM owners
+`
+
+func (q *Queries) ListOwners(ctx context.Context) ([]Owner, error) {
+	rows, err := q.db.QueryContext(ctx, listOwners)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []Owner
+	for rows.Next() {
+		var i Owner
+		if err := rows.Scan(
+			&i.Folder,
+			&i.Login,
+			&i.CreateAt,
+			&i.UpdateAt,
+		); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
+const listSeen = `-- name: ListSeen :many
+SELECT login, folder, msgid FROM seen
+`
+
+func (q *Queries) ListSeen(ctx context.Context) ([]Seen, error) {
+	rows, err := q.db.QueryContext(ctx, listSeen)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []Seen
+	for rows.Next() {
+		var i Seen
+		if err := rows.Scan(&i.Login, &i.Folder, &i.Msgid); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
+const listUsers = `-- name: ListUsers :many
+SELECT login, name, admin, moderator, alert, disabled, last_login, create_at, update_at FROM users
+`
+
+func (q *Queries) ListUsers(ctx context.Context) ([]User, error) {
+	rows, err := q.db.QueryContext(ctx, listUsers)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []User
+	for rows.Next() {
+		var i User
+		if err := rows.Scan(
+			&i.Login,
+			&i.Name,
+			&i.Admin,
+			&i.Moderator,
+			&i.Alert,
+			&i.Disabled,
+			&i.LastLogin,
+			&i.CreateAt,
+			&i.UpdateAt,
+		); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}