diff --git a/cpp-btree b/cpp-btree
index 8de8b467..45e6d1f1 160000
--- a/cpp-btree
+++ b/cpp-btree
@@ -1 +1 @@
-Subproject commit 8de8b467acbca50cfd8835c20e0e379110f3b32b
+Subproject commit 45e6d1f13196a0824e2089a586c53b9de0283f17
diff --git a/docs/gen-docs.js b/docs/gen-docs.js
new file mode 100755
index 00000000..7b71cbf1
--- /dev/null
+++ b/docs/gen-docs.js
@@ -0,0 +1,55 @@
+#!/usr/bin/nodejs
+
+const fs = require('fs');
+const yaml = require('yaml');
+
+const L = {
+ en: {},
+ ru: {
+ Type: 'Тип',
+ Default: 'Значение по умолчанию',
+ Minimum: 'Минимальное значение',
+ },
+};
+const types = {
+ en: {
+ string: 'string',
+ bool: 'boolean',
+ int: 'integer',
+ sec: 'seconds',
+ ms: 'milliseconds',
+ us: 'microseconds',
+ },
+ ru: {
+ string: 'строка',
+ bool: 'булево (да/нет)',
+ int: 'целое число',
+ sec: 'секунды',
+ ms: 'миллисекунды',
+ us: 'микросекунды',
+ },
+};
+const params_files = fs.readdirSync(__dirname+'/params')
+ .filter(f => f.substr(-4) == '.yml')
+ .map(f => f.substr(0, f.length-4));
+
+for (const file of params_files)
+{
+ const cfg = yaml.parse(fs.readFileSync(__dirname+'/params/'+file+'.yml', { encoding: 'utf-8' }));
+ for (const lang in types)
+ {
+ let out = '\n\n{{< toc >}}';
+ for (const c of cfg)
+ {
+ out += `\n\n## ${c.name}\n\n`;
+ out += `- ${L[lang]['Type'] || 'Type'}: ${c["type_"+lang] || types[lang][c.type] || c.type}\n`;
+ if (c.default !== undefined)
+ out += `- ${L[lang]['Default'] || 'Default'}: ${c.default}\n`;
+ if (c.min !== undefined)
+ out += `- ${L[lang]['Minimum'] || 'Minimum'}: ${c.min}\n`;
+ out += `\n`+(c["info_"+lang] || c["info"]).replace(/\s+$/, '');
+ }
+ const head = fs.readFileSync(__dirname+'/params/head/'+file+'.'+lang+'.md', { encoding: 'utf-8' });
+ fs.writeFileSync(__dirname+'/hugo/content/config/'+file+'.'+lang+'.md', head.replace(/\s+$/, '')+out+"\n");
+ }
+}
diff --git a/docs/params/head/common.en.md b/docs/params/head/common.en.md
new file mode 100644
index 00000000..00e3c728
--- /dev/null
+++ b/docs/params/head/common.en.md
@@ -0,0 +1,6 @@
+---
+title: Common Parameters
+weight: 1
+---
+
+These are the most common parameters which apply to all components of Vitastor.
diff --git a/docs/params/head/common.ru.md b/docs/params/head/common.ru.md
new file mode 100644
index 00000000..c1e7bdaa
--- /dev/null
+++ b/docs/params/head/common.ru.md
@@ -0,0 +1,6 @@
+---
+title: Общие параметры
+weight: 1
+---
+
+Это наиболее общие параметры, используемые всеми компонентами Vitastor.
diff --git a/docs/params/head/layout-cluster.en.md b/docs/params/head/layout-cluster.en.md
new file mode 100644
index 00000000..88c475b9
--- /dev/null
+++ b/docs/params/head/layout-cluster.en.md
@@ -0,0 +1,7 @@
+---
+title: Cluster-Wide Disk Layout Parameters
+weight: 2
+---
+
+These parameters apply to clients and OSDs, are fixed at the moment of OSD drive
+initialization and can't be changed after it without losing data.
diff --git a/docs/params/head/layout-cluster.ru.md b/docs/params/head/layout-cluster.ru.md
new file mode 100644
index 00000000..869b9a37
--- /dev/null
+++ b/docs/params/head/layout-cluster.ru.md
@@ -0,0 +1,7 @@
+---
+title: Дисковые параметры уровня кластера
+weight: 2
+---
+
+Данные параметры используются клиентами и OSD, задаются в момент инициализации
+диска OSD и не могут быть изменены после этого без потери данных.
diff --git a/docs/params/head/layout-osd.en.md b/docs/params/head/layout-osd.en.md
new file mode 100644
index 00000000..9fe1a5e2
--- /dev/null
+++ b/docs/params/head/layout-osd.en.md
@@ -0,0 +1,7 @@
+---
+title: OSD Disk Layout Parameters
+weight: 3
+---
+
+These parameters apply to OSDs, are fixed at the moment of OSD drive
+initialization and can't be changed after it without losing data.
diff --git a/docs/params/head/layout-osd.ru.md b/docs/params/head/layout-osd.ru.md
new file mode 100644
index 00000000..4e3377d3
--- /dev/null
+++ b/docs/params/head/layout-osd.ru.md
@@ -0,0 +1,8 @@
+---
+title: Дисковые параметры OSD
+weight: 3
+---
+
+Данные параметры используются только OSD и, также как и общекластерные
+дисковые параметры, задаются в момент инициализации дисков OSD и не могут быть
+изменены после этого без потери данных.
diff --git a/docs/params/head/monitor.en.md b/docs/params/head/monitor.en.md
new file mode 100644
index 00000000..2dea1d70
--- /dev/null
+++ b/docs/params/head/monitor.en.md
@@ -0,0 +1,6 @@
+---
+title: Monitor Parameters
+weight: 6
+---
+
+These parameters only apply to Monitors.
diff --git a/docs/params/head/monitor.ru.md b/docs/params/head/monitor.ru.md
new file mode 100644
index 00000000..33a3b838
--- /dev/null
+++ b/docs/params/head/monitor.ru.md
@@ -0,0 +1,6 @@
+---
+title: Параметры мониторов
+weight: 6
+---
+
+Данные параметры используются только мониторами Vitastor.
diff --git a/docs/params/head/network.en.md b/docs/params/head/network.en.md
new file mode 100644
index 00000000..ba3bfd21
--- /dev/null
+++ b/docs/params/head/network.en.md
@@ -0,0 +1,7 @@
+---
+title: Network Protocol Parameters
+weight: 4
+---
+
+These parameters apply to clients and OSDs and affect network connection logic
+between clients, OSDs and etcd.
diff --git a/docs/params/head/network.ru.md b/docs/params/head/network.ru.md
new file mode 100644
index 00000000..d77c74c1
--- /dev/null
+++ b/docs/params/head/network.ru.md
@@ -0,0 +1,7 @@
+---
+title: Параметры сетевого протокола
+weight: 4
+---
+
+Данные параметры используются клиентами и OSD и влияют на логику сетевого
+взаимодействия между клиентами, OSD, а также etcd.
diff --git a/docs/params/head/osd.en.md b/docs/params/head/osd.en.md
new file mode 100644
index 00000000..a5340a82
--- /dev/null
+++ b/docs/params/head/osd.en.md
@@ -0,0 +1,7 @@
+---
+title: Runtime OSD Parameters
+weight: 5
+---
+
+These parameters only apply to OSDs, are not fixed at the moment of OSD drive
+initialization and can be changed with an OSD restart.
diff --git a/docs/params/head/osd.ru.md b/docs/params/head/osd.ru.md
new file mode 100644
index 00000000..f805f72d
--- /dev/null
+++ b/docs/params/head/osd.ru.md
@@ -0,0 +1,8 @@
+---
+title: Изменяемые параметры OSD
+weight: 5
+---
+
+Данные параметры используются только OSD, но, в отличие от дисковых параметров,
+не фиксируются в момент инициализации дисков OSD и могут быть изменены в любой
+момент с перезапуском OSD.
diff --git a/hugo/archetypes/default.md b/hugo/archetypes/default.md
new file mode 100644
index 00000000..00e77bd7
--- /dev/null
+++ b/hugo/archetypes/default.md
@@ -0,0 +1,6 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+date: {{ .Date }}
+draft: true
+---
+
diff --git a/hugo/config.yaml b/hugo/config.yaml
new file mode 100644
index 00000000..0203f425
--- /dev/null
+++ b/hugo/config.yaml
@@ -0,0 +1,35 @@
+baseURL: http://localhost
+title: Vitastor
+theme: hugo-geekdoc
+#languageCode: en-us
+
+pluralizeListTitles: false
+
+# Geekdoc required configuration
+pygmentsUseClasses: true
+pygmentsCodeFences: true
+disablePathToLower: true
+
+# Required if you want to render robots.txt template
+enableRobotsTXT: true
+
+defaultContentLanguage: en
+languages:
+ en:
+ weight: 1
+ languageName: English
+ ru:
+ weight: 1
+ languageName: Русский
+
+markup:
+ goldmark:
+ renderer:
+ # Needed for mermaid shortcode
+ unsafe: true
+ tableOfContents:
+ startLevel: 1
+ endLevel: 9
+
+taxonomies:
+ tag: tags
diff --git a/hugo/content/_index.md b/hugo/content/_index.md
new file mode 100644
index 00000000..aefdd528
--- /dev/null
+++ b/hugo/content/_index.md
@@ -0,0 +1,6 @@
+## The Idea
+
+Vitastor is a small, simple and fast clustered block storage (storage for VM drives),
+architecturally similar to Ceph which means strong consistency, primary-replication,
+symmetric clustering and automatic data distribution over any number of drives
+of any size with configurable redundancy (replication or erasure codes/XOR).
diff --git a/hugo/content/config/_index.en.md b/hugo/content/config/_index.en.md
new file mode 100644
index 00000000..e982d56e
--- /dev/null
+++ b/hugo/content/config/_index.en.md
@@ -0,0 +1,5 @@
+---
+title: Parameter Reference
+weight: 1
+---
+
diff --git a/hugo/content/config/_index.ru.md b/hugo/content/config/_index.ru.md
new file mode 100644
index 00000000..a3a3e990
--- /dev/null
+++ b/hugo/content/config/_index.ru.md
@@ -0,0 +1,5 @@
+---
+title: Перечень настроек
+weight: 1
+---
+
diff --git a/hugo/content/config/pool.en.md b/hugo/content/config/pool.en.md
new file mode 100644
index 00000000..e2359301
--- /dev/null
+++ b/hugo/content/config/pool.en.md
@@ -0,0 +1,5 @@
+---
+title: Pool configuration
+weight: 100
+---
+
diff --git a/hugo/content/installation/packages.md b/hugo/content/installation/packages.md
new file mode 100644
index 00000000..227df041
--- /dev/null
+++ b/hugo/content/installation/packages.md
@@ -0,0 +1,5 @@
+---
+title: Packages
+weight: 2
+---
+
diff --git a/hugo/content/installation/quickstart.md b/hugo/content/installation/quickstart.md
new file mode 100644
index 00000000..add2b277
--- /dev/null
+++ b/hugo/content/installation/quickstart.md
@@ -0,0 +1,5 @@
+---
+title: Quick Start
+weight: 1
+---
+
diff --git a/hugo/content/installation/source.md b/hugo/content/installation/source.md
new file mode 100644
index 00000000..e138c548
--- /dev/null
+++ b/hugo/content/installation/source.md
@@ -0,0 +1,5 @@
+---
+title: Building from Source
+weight: 3
+---
+
diff --git a/hugo/content/introduction/_index.md b/hugo/content/introduction/_index.md
new file mode 100644
index 00000000..c1bf0820
--- /dev/null
+++ b/hugo/content/introduction/_index.md
@@ -0,0 +1,4 @@
+---
+title: Introduction
+weight: -1
+---
diff --git a/hugo/content/introduction/architecture.md b/hugo/content/introduction/architecture.md
new file mode 100644
index 00000000..42917cc9
--- /dev/null
+++ b/hugo/content/introduction/architecture.md
@@ -0,0 +1,5 @@
+---
+title: Architecture
+weight: 3
+---
+
diff --git a/hugo/content/introduction/author.md b/hugo/content/introduction/author.md
new file mode 100644
index 00000000..50ba68c9
--- /dev/null
+++ b/hugo/content/introduction/author.md
@@ -0,0 +1,5 @@
+---
+title: Author and License
+weight: 3
+---
+
diff --git a/hugo/content/introduction/features.md b/hugo/content/introduction/features.md
new file mode 100644
index 00000000..541c91a3
--- /dev/null
+++ b/hugo/content/introduction/features.md
@@ -0,0 +1,5 @@
+---
+title: Features
+weight: 1
+---
+
diff --git a/hugo/content/performance/comparison1.md b/hugo/content/performance/comparison1.md
new file mode 100644
index 00000000..49305e6c
--- /dev/null
+++ b/hugo/content/performance/comparison1.md
@@ -0,0 +1,5 @@
+---
+title: Example Comparison with Ceph
+weight: 4
+---
+
diff --git a/hugo/content/performance/theoretical.md b/hugo/content/performance/theoretical.md
new file mode 100644
index 00000000..11a8f0b2
--- /dev/null
+++ b/hugo/content/performance/theoretical.md
@@ -0,0 +1,5 @@
+---
+title: Vitastor's Theoretical Maximum Performance
+weight: 3
+---
+
diff --git a/hugo/content/performance/tuning.md b/hugo/content/performance/tuning.md
new file mode 100644
index 00000000..b882b541
--- /dev/null
+++ b/hugo/content/performance/tuning.md
@@ -0,0 +1,5 @@
+---
+title: Tuning
+weight: 2
+---
+
diff --git a/hugo/content/performance/understanding.md b/hugo/content/performance/understanding.md
new file mode 100644
index 00000000..532fb363
--- /dev/null
+++ b/hugo/content/performance/understanding.md
@@ -0,0 +1,5 @@
+---
+title: Understanding Storage Performance
+weight: 1
+---
+
diff --git a/hugo/content/usage/cli.md b/hugo/content/usage/cli.md
new file mode 100644
index 00000000..20ebaf54
--- /dev/null
+++ b/hugo/content/usage/cli.md
@@ -0,0 +1,7 @@
+---
+title: Vitastor CLI
+weight: 1
+---
+
+{{< toc >}}
+
diff --git a/hugo/content/usage/nbd.md b/hugo/content/usage/nbd.md
new file mode 100644
index 00000000..52301e44
--- /dev/null
+++ b/hugo/content/usage/nbd.md
@@ -0,0 +1,5 @@
+---
+title: NBD
+weight: 6
+---
+
diff --git a/hugo/content/usage/qemu.md b/hugo/content/usage/qemu.md
new file mode 100644
index 00000000..56557513
--- /dev/null
+++ b/hugo/content/usage/qemu.md
@@ -0,0 +1,5 @@
+---
+title: QEMU and qemu-img
+weight: 2
+---
+
diff --git a/hugo/i18n/ru.yaml b/hugo/i18n/ru.yaml
new file mode 100644
index 00000000..a4f4eb40
--- /dev/null
+++ b/hugo/i18n/ru.yaml
@@ -0,0 +1,37 @@
+---
+nav_navigation: Навигация
+nav_tags: Теги
+nav_more: Подробнее
+nav_top: К началу
+
+form_placeholder_search: Поиск
+
+error_page_title: Открыта несуществующая страница
+error_message_title: Потерялись?
+error_message_code: Ошибка 404
+error_message_text: >
+ Похоже, страница, которую вы открыли, не существует. Попробуйте найти
+ нужную информацию с главной страницы.
+
+button_toggle_dark: Переключить тёмный/светлый/авто режим
+button_nav_open: Показать навигацию
+button_nav_close: Скрыть навигацию
+button_menu_open: Открыть меню
+button_menu_close: Закрыть меню
+button_homepage: На главную
+
+title_anchor_prefix: "Ссылка на:"
+
+posts_read_more: Читать подробнее
+posts_read_time:
+ one: "Одна минута на чтение"
+ other: "{{ . }} минут(ы) на чтение"
+posts_update_prefix: Обновлено
+
+footer_build_with: >
+ Сделано на с
+
+footer_legal_notice: Правовая информация
+footer_privacy_policy: Приватность
+
+language_switch_no_tranlation_prefix: "Страница не переведена:"
diff --git a/hugo/layouts/partials/site-footer.html b/hugo/layouts/partials/site-footer.html
new file mode 100644
index 00000000..15021bfa
--- /dev/null
+++ b/hugo/layouts/partials/site-footer.html
@@ -0,0 +1,34 @@
+
diff --git a/hugo/static/brand.svg b/hugo/static/brand.svg
new file mode 100644
index 00000000..e51bde0e
--- /dev/null
+++ b/hugo/static/brand.svg
@@ -0,0 +1,215 @@
+
+
diff --git a/hugo/static/custom.css b/hugo/static/custom.css
new file mode 100644
index 00000000..0b9be97e
--- /dev/null
+++ b/hugo/static/custom.css
@@ -0,0 +1,138 @@
+/* Global customization */
+
+:root {
+ --code-max-height: 60rem;
+}
+
+/* Light mode theming */
+:root,
+:root[color-mode="light"] {
+ --header-background: #404050;
+ --header-font-color: #ffffff;
+
+ --body-background: #ffffff;
+ --body-font-color: #343a40;
+
+ --button-background: #62cb97;
+ --button-border-color: #4ec58a;
+
+ --link-color: #c54e8a;
+ --link-color-visited: #c54e8a;
+
+ --code-background: #f5f6f8;
+ --code-accent-color: #e3e7eb;
+ --code-accent-color-lite: #eff1f3;
+
+ --accent-color: #e9ecef;
+ --accent-color-lite: #f8f9fa;
+
+ --control-icons: #b2bac1;
+
+ --footer-background: #606070;
+ --footer-font-color: #ffffff;
+ --footer-link-color: #ffcc5c;
+ --footer-link-color-visited: #ffcc5c;
+}
+@media (prefers-color-scheme: light) {
+ :root {
+ --header-background: #404050;
+ --header-font-color: #ffffff;
+
+ --body-background: #ffffff;
+ --body-font-color: #343a40;
+
+ --button-background: #62cb97;
+ --button-border-color: #4ec58a;
+
+ --link-color: #c54e8a;
+ --link-color-visited: #c54e8a;
+
+ --code-background: #f5f6f8;
+ --code-accent-color: #e3e7eb;
+ --code-accent-color-lite: #eff1f3;
+
+ --accent-color: #e9ecef;
+ --accent-color-lite: #f8f9fa;
+
+ --control-icons: #b2bac1;
+
+ --footer-background: #606070;
+ --footer-font-color: #ffffff;
+ --footer-link-color: #ffcc5c;
+ --footer-link-color-visited: #ffcc5c;
+ }
+}
+
+/* Dark mode theming */
+:root[color-mode="dark"] {
+ --header-background: #202830;
+ --header-font-color: #ffffff;
+
+ --body-background: #343a44;
+ --body-font-color: #ced3d8;
+
+ --button-background: #62cb97;
+ --button-border-color: #4ec58a;
+
+ --link-color: #7ac29e;
+ --link-color-visited: #7ac29e;
+
+ --code-background: #2f353a;
+ --code-accent-color: #262b2f;
+ --code-accent-color-lite: #2b3035;
+
+ --accent-color: #2b3035;
+ --accent-color-lite: #2f353a;
+
+ --control-icons: #b2bac1;
+
+ --footer-background: #2f333e;
+ --footer-font-color: #cccccc;
+ --footer-link-color: #7ac29e;
+ --footer-link-color-visited: #7ac29e;
+}
+@media (prefers-color-scheme: dark) {
+ :root {
+ --header-background: #404070;
+ --header-font-color: #ffffff;
+
+ --body-background: #343a40;
+ --body-font-color: #ced3d8;
+
+ --button-background: #62cb97;
+ --button-border-color: #4ec58a;
+
+ --link-color: #7ac29e;
+ --link-color-visited: #7ac29e;
+
+ --code-background: #2f353a;
+ --code-accent-color: #262b2f;
+ --code-accent-color-lite: #2b3035;
+
+ --accent-color: #2b3035;
+ --accent-color-lite: #2f353a;
+
+ --control-icons: #b2bac1;
+
+ --footer-background: #2f333e;
+ --footer-font-color: #cccccc;
+ --footer-link-color: #7ac29e;
+ --footer-link-color-visited: #7ac29e;
+ }
+}
+
+.gdoc-brand__img {
+ width: 48px;
+ height: auto;
+ margin-top: -4px;
+ margin-bottom: -4px;
+}
+
+.gdoc-menu-header > span {
+ display: flex;
+ flex-direction: row-reverse;
+}
+
+span.gdoc-language {
+ margin-right: 20px;
+}
diff --git a/hugo/static/favicon/favicon-16x16.png b/hugo/static/favicon/favicon-16x16.png
new file mode 100644
index 00000000..2e88ee28
Binary files /dev/null and b/hugo/static/favicon/favicon-16x16.png differ
diff --git a/hugo/static/favicon/favicon-32x32.png b/hugo/static/favicon/favicon-32x32.png
new file mode 100644
index 00000000..cfacc53f
Binary files /dev/null and b/hugo/static/favicon/favicon-32x32.png differ
diff --git a/hugo/static/favicon/favicon.svg b/hugo/static/favicon/favicon.svg
new file mode 100644
index 00000000..17683e5f
--- /dev/null
+++ b/hugo/static/favicon/favicon.svg
@@ -0,0 +1,196 @@
+
+
diff --git a/json11 b/json11
index fd37016c..52a3af66 160000
--- a/json11
+++ b/json11
@@ -1 +1 @@
-Subproject commit fd37016cf85075303de74bab9c61e5d13bf71f64
+Subproject commit 52a3af664f40775426b189c85b6088d436d05df3