From 4b168e8fa8bb4885d5f3da38f55e6b78eae773af Mon Sep 17 00:00:00 2001
From: Aidaho <aidaho@roxy-wi.org>
Date: Sun, 17 Sep 2023 12:42:39 +0300
Subject: [PATCH] v7.0.0.0

Changelog: https://roxy-wi.org/changelog#7.0.0
---
 README.md                                     |    1 -
 app/__init__.py                               |   56 +
 app/add.py                                    |  436 ----
 app/add_nginx.py                              |  118 -
 app/ajax_views.py                             |  192 ++
 app/app.wsgi                                  |    4 +
 app/config.py                                 |  158 --
 app/create_db.py                              |  203 +-
 app/ha.py                                     |   39 -
 app/hapservers.py                             |  188 --
 app/history.py                                |   53 -
 app/login.py                                  |  238 --
 app/logs.py                                   |   57 -
 app/metrics.py                                |   63 -
 app/modules/alerting/__init__.py              |    1 -
 app/modules/common/common.py                  |    1 +
 app/modules/config/add.py                     |  306 ++-
 app/modules/config/config.py                  |  378 ++-
 app/modules/config/runtime.py                 |  298 ++-
 app/modules/db/db_model.py                    |   72 +-
 app/modules/db/sql.py                         |  382 +--
 app/modules/provisioning/__init__.py          |    1 -
 app/modules/provisioning/aws.py               |  133 --
 app/modules/provisioning/common.py            |   31 -
 app/modules/provisioning/do.py                |  124 -
 app/modules/provisioning/gcore.py             |  141 --
 app/modules/provisioning/provider.py          |  106 -
 app/modules/provisioning/server.py            |  133 --
 app/modules/roxywi/auth.py                    |   85 +-
 app/modules/roxywi/common.py                  |  131 +-
 app/modules/roxywi/group.py                   |   12 +-
 app/modules/roxywi/logs.py                    |   24 +-
 app/modules/roxywi/metrics.py                 |   22 +-
 app/modules/roxywi/nettools.py                |   76 +-
 app/modules/roxywi/overview.py                |  204 +-
 app/modules/roxywi/roxy.py                    |   21 +-
 app/modules/roxywi/user.py                    |  193 +-
 app/modules/roxywi/waf.py                     |   62 +-
 app/modules/server/__init__.py                |    2 +-
 app/modules/server/server.py                  |  121 +-
 app/modules/server/ssh.py                     |   78 +-
 app/modules/service/action.py                 |   87 +-
 app/modules/service/backup.py                 |  102 +-
 app/modules/service/common.py                 |  138 +-
 app/modules/service/exporter_installation.py  |   91 +-
 app/modules/service/haproxy.py                |   49 +-
 app/modules/service/installation.py           |  272 ++-
 app/modules/{alerting => tools}/alerting.py   |  100 +-
 app/modules/tools/checker.py                  |   79 +-
 app/modules/tools/smon.py                     |  121 +-
 app/nettools.py                               |   32 -
 app/options.py                                | 1567 -------------
 app/overview.py                               |   36 -
 app/portscanner.py                            |   75 -
 app/provisioning.py                           |   49 -
 app/routes/add/__init__.py                    |    5 +
 app/routes/add/routes.py                      |  689 ++++++
 app/routes/admin/__init__.py                  |    5 +
 app/routes/admin/routes.py                    |  220 ++
 app/routes/checker/__init__.py                |    5 +
 app/routes/checker/routes.py                  |  130 ++
 app/routes/config/__init__.py                 |    5 +
 app/routes/config/routes.py                   |  461 ++++
 app/routes/install/__init__.py                |    5 +
 app/routes/install/routes.py                  |  268 +++
 app/routes/metric/__init__.py                 |    5 +
 app/routes/metric/routes.py                   |  128 +
 app/routes/runtime/__init__.py                |    5 +
 app/routes/runtime/routes.py                  |  203 ++
 app/routes/server/__init__.py                 |    5 +
 app/routes/server/routes.py                   |  462 ++++
 app/routes/service/__init__.py                |    5 +
 app/routes/service/routes.py                  |  386 ++++
 app/routes/smon/__init__.py                   |    5 +
 app/routes/smon/routes.py                     |  276 +++
 app/routes/user/__init__.py                   |    5 +
 app/routes/user/routes.py                     |  149 ++
 app/routes/waf/__init__.py                    |    5 +
 app/routes/waf/routes.py                      |  219 ++
 app/runtimeapi.py                             |   33 -
 app/scripts/backup.sh                         |    7 +-
 app/scripts/git_backup.sh                     |    4 +-
 app/scripts/install_apache.sh                 |    3 +-
 app/scripts/install_apache_exporter.sh        |    3 +-
 app/scripts/install_grafana.sh                |    3 +-
 app/scripts/install_haproxy_exporter.sh       |    3 +-
 app/scripts/install_haproxy_geoip.sh          |    3 +-
 app/scripts/install_keepalived_exporter.sh    |    3 +-
 app/scripts/install_nginx_exporter.sh         |    3 +-
 app/scripts/install_nginx_geoip.sh            |    3 +-
 app/scripts/install_node_exporter.sh          |    3 +-
 app/scripts/letsencrypt.sh                    |    3 +-
 app/scripts/s3_backup.sh                      |    3 +-
 app/scripts/waf.sh                            |    3 +-
 app/scripts/waf_nginx.sh                      |    3 +-
 app/sections.py                               |  115 -
 app/servers.py                                |   60 -
 app/smon.py                                   |  143 --
 .../images/favicon/android-icon-144x144.png   |  Bin
 .../images/favicon/android-icon-192x192.png   |  Bin
 .../images/favicon/android-icon-36x36.png     |  Bin
 .../images/favicon/android-icon-48x48.png     |  Bin
 .../images/favicon/android-icon-72x72.png     |  Bin
 .../images/favicon/android-icon-96x96.png     |  Bin
 .../images/favicon/apple-icon-114x114.png     |  Bin
 .../images/favicon/apple-icon-120x120.png     |  Bin
 .../images/favicon/apple-icon-144x144.png     |  Bin
 .../images/favicon/apple-icon-152x152.png     |  Bin
 .../images/favicon/apple-icon-180x180.png     |  Bin
 .../images/favicon/apple-icon-57x57.png       |  Bin
 .../images/favicon/apple-icon-60x60.png       |  Bin
 .../images/favicon/apple-icon-72x72.png       |  Bin
 .../images/favicon/apple-icon-76x76.png       |  Bin
 .../images/favicon/apple-icon-precomposed.png |  Bin
 .../static}/images/favicon/apple-icon.png     |  Bin
 .../static}/images/favicon/browserconfig.xml  |    0
 .../static}/images/favicon/favicon-16x16.png  |  Bin
 .../static}/images/favicon/favicon-32x32.png  |  Bin
 .../static}/images/favicon/favicon-96x96.png  |  Bin
 .../static}/images/favicon/favicon.ico        |  Bin
 .../static}/images/favicon/manifest.json      |    0
 .../images/favicon/ms-icon-144x144.png        |  Bin
 .../images/favicon/ms-icon-150x150.png        |  Bin
 .../images/favicon/ms-icon-310x310.png        |  Bin
 .../static}/images/favicon/ms-icon-70x70.png  |  Bin
 {inc => app/static}/images/loading.gif        |  Bin
 {inc => app/static}/images/logo_footer.png    |  Bin
 {inc => app/static}/images/logo_index.png     |  Bin
 {inc => app/static}/images/logo_login.png     |  Bin
 {inc => app/static}/images/logo_menu.png      |  Bin
 {inc => app/static}/images/no_servers.png     |  Bin
 {inc => app/static}/images/oops.png           |  Bin
 app/statsview.py                              |   41 -
 app/templates/404.html                        |   99 +-
 app/templates/500.html                        |  100 +-
 app/templates/add.html                        |    6 +-
 app/templates/add_nginx.html                  |    2 +-
 app/templates/admin.html                      |   11 +-
 app/templates/ajax/check_version.html         |    4 +-
 app/templates/ajax/config_show.html           |   37 +-
 app/templates/ajax/firewall_rules.html        |    6 +-
 .../ajax/haproxyservers_backends.html         |    8 +-
 app/templates/ajax/load_telegram.html         |   37 +-
 app/templates/ajax/new_option.html            |    2 +-
 app/templates/ajax/new_saved_servers.html     |    2 +-
 app/templates/ajax/overivewWaf.html           |    8 +-
 app/templates/ajax/overview.html              |    2 +-
 app/templates/ajax/overviewServers.html       |    2 +-
 .../ajax/provisioning/aws_edit_dialog.html    |  167 --
 .../ajax/provisioning/do_edit_dialog.html     |  190 --
 .../ajax/provisioning/gcore_edit_dialog.html  |  192 --
 .../ajax/provisioning/providers.html          |   44 -
 .../provisioning/provisioned_servers.html     |   84 -
 ...ce_settings.html => service_settings.html} |    0
 app/templates/ajax/show_compare_configs.html  |    7 +-
 app/templates/ajax/show_configs_files.html    |   10 +-
 app/templates/ajax/show_list_version.html     |   12 +-
 app/templates/ajax/show_system_info.html      |   10 +-
 app/templates/ajax/smon/smon_dashboard.html   |    4 +-
 ...ent_group.html => user_current_group.html} |    0
 ..._roles.html => user_groups_and_roles.html} |    0
 ..._user_services.html => user_services.html} |    0
 app/templates/base.html                       |  174 +-
 app/templates/checker.html                    |   12 +
 app/templates/config.html                     |   38 +-
 app/templates/configver.html                  |    4 +-
 app/templates/delver.html                     |    4 +-
 app/templates/ha.html                         |    6 +-
 app/templates/hapservers.html                 |   26 +-
 app/templates/include/admin_backup.html       |    2 +-
 app/templates/include/admin_servers.html      |    2 +-
 app/templates/include/admin_users.html        |    2 +-
 app/templates/include/getstarted.html         |    6 +-
 app/templates/include/login.html              |    4 +-
 app/templates/include/mon_installation.html   |  203 --
 app/templates/include/port_scan_history.html  |   22 +-
 .../provisioning/creating_dialogs.html        |  494 ----
 .../provisioning/providers_dialogs.html       |  212 --
 .../include/provisioning/variables.html       |   98 -
 app/templates/include/smon/smon_history.html  |    4 +-
 .../include/smon/smon_http_server.html        |    2 +-
 app/templates/include/tr_validate_tips.html   |    2 +-
 app/templates/install.html                    |  413 ++++
 app/templates/languages/en.html               |    3 +
 app/templates/languages/fr.html               |    3 +
 app/templates/languages/pt-br.html            |    3 +
 app/templates/languages/ru.html               |    3 +
 app/templates/login.html                      |   11 +-
 app/templates/logs.html                       |   70 +-
 app/templates/logs_internal.html              |   76 +
 app/templates/metrics.html                    |    5 +-
 app/templates/nettools.html                   |   16 +-
 app/templates/ovw.html                        |   28 +-
 app/templates/portscanner.html                |   66 +-
 app/templates/provisioning.html               |   76 -
 app/templates/runtimeapi.html                 |    2 +-
 app/templates/sections.html                   |   30 +-
 app/templates/servers.html                    |  197 +-
 app/templates/{smon.html => smon/add.html}    |   57 +-
 app/templates/smon/checker_history.html       |   33 +
 app/templates/smon/dashboard.html             |   39 +
 app/templates/smon/history.html               |   33 +
 app/templates/statsview.html                  |    5 +-
 app/templates/waf.html                        |   12 +-
 app/users.py                                  |   61 -
 app/versions.py                               |  111 -
 app/viewlogs.py                               |   87 -
 app/views.py                                  |  463 ++++
 app/waf.py                                    |  112 -
 config_other/httpd/roxy-wi.conf               |   14 +-
 config_other/httpd/roxy-wi_deb.conf           |   14 +-
 config_other/requirements_el7.txt             |    1 +
 config_other/requirements_el8.txt             |    1 +
 config_other/requirements_el9.txt             |    1 +
 inc/add.js                                    | 1560 ++++++-------
 inc/add_nginx.js                              |   51 +-
 inc/configshow.js                             |    1 -
 inc/css/{provisioning.css => ha.css}          |    0
 inc/ha.js                                     |  262 +--
 inc/images/logo_logo.png                      |  Bin 18044 -> 0 bytes
 inc/images/provisioning/flags/ae.svg          |    1 -
 inc/images/provisioning/flags/au.svg          |    8 -
 inc/images/provisioning/flags/bh.svg          |    4 -
 inc/images/provisioning/flags/br.svg          |   45 -
 inc/images/provisioning/flags/ca.svg          |    4 -
 inc/images/provisioning/flags/de.svg          |    5 -
 inc/images/provisioning/flags/fr.svg          |    7 -
 inc/images/provisioning/flags/gb.svg          |    7 -
 inc/images/provisioning/flags/hk.svg          |   30 -
 inc/images/provisioning/flags/ie.svg          |    7 -
 inc/images/provisioning/flags/in.svg          |   25 -
 inc/images/provisioning/flags/jp.svg          |   11 -
 inc/images/provisioning/flags/kh.svg          |   61 -
 inc/images/provisioning/flags/kr.svg          |   24 -
 inc/images/provisioning/flags/kz.svg          |   23 -
 inc/images/provisioning/flags/lu.svg          |    5 -
 inc/images/provisioning/flags/nl.svg          |    5 -
 inc/images/provisioning/flags/pl.svg          |    6 -
 inc/images/provisioning/flags/ru.svg          |    7 -
 inc/images/provisioning/flags/se.svg          |    4 -
 inc/images/provisioning/flags/sg.svg          |   13 -
 inc/images/provisioning/flags/tr.svg          |    8 -
 inc/images/provisioning/flags/ua.svg          |    6 -
 inc/images/provisioning/flags/us.svg          |   10 -
 inc/images/provisioning/flags/za.svg          |   17 -
 inc/images/provisioning/oss/.DS_Store         |  Bin 6148 -> 0 bytes
 inc/images/provisioning/oss/centos.svg        |    1 -
 inc/images/provisioning/oss/debian.svg        |    1 -
 inc/images/provisioning/oss/fedora.svg        |    1 -
 inc/images/provisioning/oss/rocky-linux.svg   |    1 -
 inc/images/provisioning/oss/suse.svg          |    1 -
 inc/images/provisioning/oss/ubuntu.svg        |    1 -
 inc/images/provisioning/oss/windows.svg       |    1 -
 inc/images/provisioning/providers/aws.svg     |    1 -
 inc/images/provisioning/providers/do.svg      |   72 -
 inc/images/provisioning/providers/gcore.svg   |    1 -
 inc/{metrics-6.3.16.0.js => metrics.js}       |   63 +-
 inc/{overview-6.3.9.js => overview.js}        |  384 +--
 inc/provisioning.js                           | 2050 -----------------
 inc/runtimeapi.js                             |  289 +--
 inc/{script-6.3.9.js => script.js}            |  819 +++----
 inc/{smon-6.3.16.js => smon.js}               |   59 +-
 inc/users.js                                  | 1663 ++++++-------
 inc/{waf-6.3.8.js => waf.js}                  |  133 +-
 index.html                                    |   42 +-
 requirements.txt                              |    1 +
 266 files changed, 9243 insertions(+), 14802 deletions(-)
 create mode 100644 app/__init__.py
 delete mode 100644 app/add.py
 delete mode 100755 app/add_nginx.py
 create mode 100644 app/ajax_views.py
 create mode 100644 app/app.wsgi
 delete mode 100644 app/config.py
 delete mode 100644 app/ha.py
 delete mode 100644 app/hapservers.py
 delete mode 100644 app/history.py
 delete mode 100644 app/login.py
 delete mode 100644 app/logs.py
 delete mode 100644 app/metrics.py
 delete mode 100644 app/modules/alerting/__init__.py
 delete mode 100644 app/modules/provisioning/__init__.py
 delete mode 100644 app/modules/provisioning/aws.py
 delete mode 100644 app/modules/provisioning/common.py
 delete mode 100644 app/modules/provisioning/do.py
 delete mode 100644 app/modules/provisioning/gcore.py
 delete mode 100644 app/modules/provisioning/provider.py
 delete mode 100644 app/modules/provisioning/server.py
 rename app/modules/{alerting => tools}/alerting.py (86%)
 delete mode 100644 app/nettools.py
 delete mode 100644 app/options.py
 delete mode 100644 app/overview.py
 delete mode 100644 app/portscanner.py
 delete mode 100644 app/provisioning.py
 create mode 100644 app/routes/add/__init__.py
 create mode 100644 app/routes/add/routes.py
 create mode 100644 app/routes/admin/__init__.py
 create mode 100644 app/routes/admin/routes.py
 create mode 100644 app/routes/checker/__init__.py
 create mode 100644 app/routes/checker/routes.py
 create mode 100644 app/routes/config/__init__.py
 create mode 100644 app/routes/config/routes.py
 create mode 100644 app/routes/install/__init__.py
 create mode 100644 app/routes/install/routes.py
 create mode 100644 app/routes/metric/__init__.py
 create mode 100644 app/routes/metric/routes.py
 create mode 100644 app/routes/runtime/__init__.py
 create mode 100644 app/routes/runtime/routes.py
 create mode 100644 app/routes/server/__init__.py
 create mode 100644 app/routes/server/routes.py
 create mode 100644 app/routes/service/__init__.py
 create mode 100644 app/routes/service/routes.py
 create mode 100644 app/routes/smon/__init__.py
 create mode 100644 app/routes/smon/routes.py
 create mode 100644 app/routes/user/__init__.py
 create mode 100644 app/routes/user/routes.py
 create mode 100644 app/routes/waf/__init__.py
 create mode 100644 app/routes/waf/routes.py
 delete mode 100644 app/runtimeapi.py
 delete mode 100644 app/sections.py
 delete mode 100644 app/servers.py
 delete mode 100644 app/smon.py
 rename {inc => app/static}/images/favicon/android-icon-144x144.png (100%)
 rename {inc => app/static}/images/favicon/android-icon-192x192.png (100%)
 rename {inc => app/static}/images/favicon/android-icon-36x36.png (100%)
 rename {inc => app/static}/images/favicon/android-icon-48x48.png (100%)
 rename {inc => app/static}/images/favicon/android-icon-72x72.png (100%)
 rename {inc => app/static}/images/favicon/android-icon-96x96.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-114x114.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-120x120.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-144x144.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-152x152.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-180x180.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-57x57.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-60x60.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-72x72.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-76x76.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon-precomposed.png (100%)
 rename {inc => app/static}/images/favicon/apple-icon.png (100%)
 rename {inc => app/static}/images/favicon/browserconfig.xml (100%)
 rename {inc => app/static}/images/favicon/favicon-16x16.png (100%)
 rename {inc => app/static}/images/favicon/favicon-32x32.png (100%)
 rename {inc => app/static}/images/favicon/favicon-96x96.png (100%)
 rename {inc => app/static}/images/favicon/favicon.ico (100%)
 rename {inc => app/static}/images/favicon/manifest.json (100%)
 rename {inc => app/static}/images/favicon/ms-icon-144x144.png (100%)
 rename {inc => app/static}/images/favicon/ms-icon-150x150.png (100%)
 rename {inc => app/static}/images/favicon/ms-icon-310x310.png (100%)
 rename {inc => app/static}/images/favicon/ms-icon-70x70.png (100%)
 rename {inc => app/static}/images/loading.gif (100%)
 rename {inc => app/static}/images/logo_footer.png (100%)
 rename {inc => app/static}/images/logo_index.png (100%)
 rename {inc => app/static}/images/logo_login.png (100%)
 rename {inc => app/static}/images/logo_menu.png (100%)
 rename {inc => app/static}/images/no_servers.png (100%)
 rename {inc => app/static}/images/oops.png (100%)
 delete mode 100644 app/statsview.py
 delete mode 100644 app/templates/ajax/provisioning/aws_edit_dialog.html
 delete mode 100644 app/templates/ajax/provisioning/do_edit_dialog.html
 delete mode 100644 app/templates/ajax/provisioning/gcore_edit_dialog.html
 delete mode 100644 app/templates/ajax/provisioning/providers.html
 delete mode 100644 app/templates/ajax/provisioning/provisioned_servers.html
 rename app/templates/ajax/{show_service_settings.html => service_settings.html} (100%)
 rename app/templates/ajax/{show_user_current_group.html => user_current_group.html} (100%)
 rename app/templates/ajax/{show_user_groups_and_roles.html => user_groups_and_roles.html} (100%)
 rename app/templates/ajax/{show_user_services.html => user_services.html} (100%)
 create mode 100644 app/templates/checker.html
 delete mode 100644 app/templates/include/mon_installation.html
 delete mode 100644 app/templates/include/provisioning/creating_dialogs.html
 delete mode 100644 app/templates/include/provisioning/providers_dialogs.html
 delete mode 100644 app/templates/include/provisioning/variables.html
 create mode 100644 app/templates/install.html
 create mode 100644 app/templates/logs_internal.html
 delete mode 100644 app/templates/provisioning.html
 rename app/templates/{smon.html => smon/add.html} (79%)
 create mode 100644 app/templates/smon/checker_history.html
 create mode 100644 app/templates/smon/dashboard.html
 create mode 100644 app/templates/smon/history.html
 delete mode 100644 app/users.py
 delete mode 100644 app/versions.py
 delete mode 100644 app/viewlogs.py
 create mode 100644 app/views.py
 delete mode 100644 app/waf.py
 rename inc/css/{provisioning.css => ha.css} (100%)
 delete mode 100644 inc/images/logo_logo.png
 delete mode 100644 inc/images/provisioning/flags/ae.svg
 delete mode 100644 inc/images/provisioning/flags/au.svg
 delete mode 100644 inc/images/provisioning/flags/bh.svg
 delete mode 100644 inc/images/provisioning/flags/br.svg
 delete mode 100644 inc/images/provisioning/flags/ca.svg
 delete mode 100644 inc/images/provisioning/flags/de.svg
 delete mode 100644 inc/images/provisioning/flags/fr.svg
 delete mode 100644 inc/images/provisioning/flags/gb.svg
 delete mode 100644 inc/images/provisioning/flags/hk.svg
 delete mode 100644 inc/images/provisioning/flags/ie.svg
 delete mode 100644 inc/images/provisioning/flags/in.svg
 delete mode 100644 inc/images/provisioning/flags/jp.svg
 delete mode 100644 inc/images/provisioning/flags/kh.svg
 delete mode 100644 inc/images/provisioning/flags/kr.svg
 delete mode 100644 inc/images/provisioning/flags/kz.svg
 delete mode 100644 inc/images/provisioning/flags/lu.svg
 delete mode 100644 inc/images/provisioning/flags/nl.svg
 delete mode 100644 inc/images/provisioning/flags/pl.svg
 delete mode 100644 inc/images/provisioning/flags/ru.svg
 delete mode 100644 inc/images/provisioning/flags/se.svg
 delete mode 100644 inc/images/provisioning/flags/sg.svg
 delete mode 100644 inc/images/provisioning/flags/tr.svg
 delete mode 100644 inc/images/provisioning/flags/ua.svg
 delete mode 100644 inc/images/provisioning/flags/us.svg
 delete mode 100644 inc/images/provisioning/flags/za.svg
 delete mode 100644 inc/images/provisioning/oss/.DS_Store
 delete mode 100644 inc/images/provisioning/oss/centos.svg
 delete mode 100644 inc/images/provisioning/oss/debian.svg
 delete mode 100644 inc/images/provisioning/oss/fedora.svg
 delete mode 100644 inc/images/provisioning/oss/rocky-linux.svg
 delete mode 100644 inc/images/provisioning/oss/suse.svg
 delete mode 100644 inc/images/provisioning/oss/ubuntu.svg
 delete mode 100644 inc/images/provisioning/oss/windows.svg
 delete mode 100644 inc/images/provisioning/providers/aws.svg
 delete mode 100644 inc/images/provisioning/providers/do.svg
 delete mode 100644 inc/images/provisioning/providers/gcore.svg
 rename inc/{metrics-6.3.16.0.js => metrics.js} (94%)
 rename inc/{overview-6.3.9.js => overview.js} (63%)
 delete mode 100644 inc/provisioning.js
 rename inc/{script-6.3.9.js => script.js} (68%)
 rename inc/{smon-6.3.16.js => smon.js} (93%)
 rename inc/{waf-6.3.8.js => waf.js} (65%)

diff --git a/README.md b/README.md
index 5835a05b..8e09a1bb 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,6 @@ Web interface(user-friendly web GUI, alerting, monitoring and secure) for managi
 2. Installing and updating HAProxy and Nginx with Roxy-WI as a Docker service
 3. Installing and updating Grafana, Prometheus servers with Roxy-WI
 4. Installing and updating HAProxy, Nginx, Apache, Keepalived and Node exporters with Roxy-WI
-5. Server provisioning on AWS, DigitalOcean and G-Core Labs
 6. Downloading, updating and formatting GeoIP to the acceptable format for HAProxy with Roxy-WI
 7. Dynamic change of Maxconn, Black/white lists and backend's IP address and port with saving changes to the config file
 8. Configuring HAProxy, Nginx, Apache and Keepalived in a jiffy with Roxy-WI
diff --git a/app/__init__.py b/app/__init__.py
new file mode 100644
index 00000000..ba70c2e0
--- /dev/null
+++ b/app/__init__.py
@@ -0,0 +1,56 @@
+from datetime import timedelta
+
+from flask import Flask
+from flask_caching import Cache
+from flask_login import LoginManager
+
+app = Flask(__name__)
+app.secret_key = 'some secret salt'
+app.jinja_env.add_extension('jinja2.ext.do')
+app.jinja_env.add_extension('jinja2.ext.loopcontrols')
+
+cache = Cache(config={'CACHE_TYPE': 'SimpleCache', "CACHE_DEFAULT_TIMEOUT": 3000})
+cache.init_app(app)
+login_manager = LoginManager(app)
+
+app.config['SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS'] = True
+app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=3)
+
+from app.routes.add import bp as add_bp
+app.register_blueprint(add_bp, url_prefix='/add')
+
+from app.routes.service import bp as service_bp
+app.register_blueprint(service_bp, url_prefix='/service')
+
+from app.routes.config import bp as config_bp
+app.register_blueprint(config_bp, url_prefix='/config')
+
+from app.routes.metric import bp as metric_bp
+app.register_blueprint(metric_bp, url_prefix='/metrics')
+
+from app.routes.waf import bp as waf_bp
+app.register_blueprint(waf_bp, url_prefix='/waf')
+
+from app.routes.runtime import bp as runtime_bp
+app.register_blueprint(runtime_bp, url_prefix='/runtimeapi')
+
+from app.routes.smon import bp as smon_bp
+app.register_blueprint(smon_bp, url_prefix='/smon')
+
+from app.routes.checker import bp as checker_bp
+app.register_blueprint(checker_bp, url_prefix='/checker')
+
+from app.routes.install import bp as install_bp
+app.register_blueprint(install_bp, url_prefix='/install')
+
+from app.routes.user import bp as user_bp
+app.register_blueprint(user_bp, url_prefix='/user')
+
+from app.routes.server import bp as server_bp
+app.register_blueprint(server_bp, url_prefix='/server')
+
+from app.routes.admin import bp as admin_bp
+app.register_blueprint(admin_bp, url_prefix='/admin')
+
+from app import views
+from app import ajax_views
diff --git a/app/add.py b/app/add.py
deleted file mode 100644
index f45b4b57..00000000
--- a/app/add.py
+++ /dev/null
@@ -1,436 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-import os
-import sys
-import http.cookies
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.config.config as config_mod
-import modules.roxy_wi_tools as roxy_wi_tools
-import modules.roxywi.common as roxywi_common
-import modules.roxywi.auth as roxywi_auth
-
-time_zone = sql.get_setting('time_zone')
-get_date = roxy_wi_tools.GetDate(time_zone)
-get_config_var = roxy_wi_tools.GetConfigVar()
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('add.html')
-form = common.form
-serv = common.is_ip_or_dns(form.getvalue('serv'))
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(haproxy=1)
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
-except Exception:
-	print('error: your session is expired')
-	sys.exit()
-
-roxywi_auth.page_for_admin(level=3)
-
-if all(v is None for v in [
-	form.getvalue('mode'), form.getvalue('new_userlist'),
-	form.getvalue('peers-name'), form.getvalue('generateconfig')
-]):
-	try:
-		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-		group = cookie.get('group')
-		user_group = group.value
-	except Exception as e:
-		print(str(e))
-
-	lib_path = get_config_var.get_config_var('main', 'lib_path')
-	dir = lib_path + "/lists"
-	white_dir = lib_path + "/lists/" + user_group + "/white"
-	black_dir = lib_path + "/lists/" + user_group + "/black"
-
-	if not os.path.exists(dir):
-		os.makedirs(dir)
-	if not os.path.exists(dir + "/" + user_group):
-		os.makedirs(dir + "/" + user_group)
-	if not os.path.exists(white_dir):
-		os.makedirs(white_dir)
-	if not os.path.exists(black_dir):
-		os.makedirs(black_dir)
-
-	white_lists = roxywi_common.get_files(folder=white_dir, file_format="lst")
-	black_lists = roxywi_common.get_files(folder=black_dir, file_format="lst")
-	maps = roxywi_common.get_files(folder=f'{lib_path}/maps/{user_group}', file_format="map")
-
-	template = template.render(
-		h2=1, role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=form.getvalue('add'),
-		conf_add=form.getvalue('conf'), group=user_group, options=sql.select_options(), saved_servers=sql.select_saved_servers(),
-		white_lists=white_lists, black_lists=black_lists, user_services=user_params['user_services'], token=user_params['token'],
-		lang=user_params['lang'], maps=maps
-	)
-	print(template)
-
-elif form.getvalue('mode') is not None:
-	haproxy_dir = sql.get_setting('haproxy_dir')
-	port = form.getlist('port')
-	bind = ""
-	ip = ""
-	force_close = form.getvalue('force_close')
-	balance = ""
-	mode = f"    mode {form.getvalue('mode')}\n"
-	maxconn = ""
-	options_split = ""
-	ssl = ""
-	ssl_check = ""
-	backend = ""
-	headers = ''
-	acl = ""
-	servers_split = ""
-	new_listener = form.getvalue('listener')
-	new_frontend = form.getvalue('frontend')
-	new_backend = form.getvalue('new_backend')
-
-	if form.getvalue('balance') is not None:
-		balance = "    balance " + form.getvalue('balance') + "\n"
-
-	if form.getvalue('health_check') is not None:
-		health_check = form.getvalue('health_check')
-		if health_check == 'option httpchk' and form.getvalue('checks_http_domain') is not None:
-			health_check = health_check + ' GET ' + form.getvalue('checks_http_path') + ' "HTTP/1.0\\r\\nHost: ' + form.getvalue('checks_http_domain') + '"'
-		balance += f"    {health_check}\n"
-
-	if form.getvalue('ip') is not None:
-		ip = form.getlist('ip')
-
-	if new_listener is not None:
-		name = f"listen {new_listener}"
-		end_name = new_listener
-	elif new_frontend is not None:
-		name = f"frontend {new_frontend}"
-		end_name = new_frontend
-	elif new_backend is not None:
-		name = f"backend {new_backend}"
-		end_name = new_backend
-	else:
-		print('error: The name cannot be empty')
-		sys.exit()
-
-	if form.getvalue('backends') is not None:
-		backend = f"    default_backend { form.getvalue('backends')}\n"
-
-	if form.getvalue('maxconn'):
-		maxconn = f"    maxconn {form.getvalue('maxconn')}\n"
-
-	if form.getvalue('ssl') == "https" and form.getvalue('mode') != "tcp":
-		cert_path = sql.get_setting('cert_path')
-		if form.getvalue('cert') is not None:
-			ssl = f"ssl crt {cert_path}{form.getvalue('cert')}"
-		if form.getvalue('ssl-dis-check') is None:
-			if form.getvalue('ssl-check') == "ssl-check":
-				ssl_check = " ssl verify none"
-			else:
-				ssl_check = " ssl verify"
-
-	if ip or port:
-		if type(port) is list:
-			i = 0
-			for p in port:
-				if ip[i] == 'IsEmptY':
-					if ip[i] == 'IsEmptY' and port[i] == 'IsEmptY':
-						i += 1
-						continue
-					else:
-						port_value = port[i]
-					bind += f"    bind *:{port_value} {ssl}\n"
-				else:
-					if port[i] == 'IsEmptY':
-						print('error: IP cannot be bind without a port')
-						sys.exit()
-					else:
-						port_value = port[i]
-					bind += f"    bind {ip[i]}:{port_value} {ssl}\n"
-				i += 1
-
-	if form.getvalue('default-check') == "1":
-		if form.getvalue('check-servers') == "1":
-			check = f" check inter {form.getvalue('inter')} rise {form.getvalue('rise')} fall {form.getvalue('fall')}{ssl_check}"
-		else:
-			check = ""
-	else:
-		if form.getvalue('check-servers') != "1":
-			check = ""
-		else:
-			check = f" check{ssl_check}"
-
-	if form.getvalue('option') is not None:
-		options = form.getvalue('option')
-		i = options.split("\n")
-		for j in i:
-			options_split += f"    {j}\n"
-
-	if force_close == "1":
-		options_split += "    option http-server-close\n"
-	elif force_close == "2":
-		options_split += "    option forceclose\n"
-	elif force_close == "3":
-		options_split += "    option http-pretend-keepalive\n"
-
-	if form.getvalue('whitelist') is not None:
-		options_split += "    tcp-request connection accept if { src -f " + haproxy_dir + "/white/" + form.getvalue(
-			'whitelist') + " }\n"
-
-	if form.getvalue('blacklist') is not None:
-		options_split += "    tcp-request connection reject if { src -f " + haproxy_dir + "/black/" + form.getvalue(
-			'blacklist') + " }\n"
-
-	if form.getvalue('cookie'):
-		cookie = f"    cookie {form.getvalue('cookie_name')}"
-		if form.getvalue('cookie_domain'):
-			cookie += f" domain {form.getvalue('cookie_domain')}"
-		if form.getvalue('rewrite'):
-			rewrite = form.getvalue('rewrite')
-		else:
-			rewrite = ""
-		if form.getvalue('prefix'):
-			prefix = form.getvalue('prefix')
-		else:
-			prefix = ""
-		if form.getvalue('nocache'):
-			nocache = form.getvalue('nocache')
-		else:
-			nocache = ""
-		if form.getvalue('postonly'):
-			postonly = form.getvalue('postonly')
-		else:
-			postonly = ""
-		if form.getvalue('dynamic'):
-			dynamic = form.getvalue('dynamic')
-		else:
-			dynamic = ""
-		cookie += f" {rewrite} {prefix} {nocache} {postonly} {dynamic}\n"
-		options_split += cookie
-		if form.getvalue('dynamic'):
-			options_split += f"    dynamic-cookie-key {form.getvalue('dynamic-cookie-key')}\n"
-
-	if form.getvalue('headers_res'):
-		headers_res = form.getlist('headers_res')
-		headers_method = form.getlist('headers_method')
-		header_name = form.getlist('header_name')
-		header_value = form.getlist('header_value')
-		i = 0
-
-		for h in headers_method:
-			if headers_method[i] != 'del-header':
-				headers += f'    {headers_res[i]} {headers_method[i]} {header_name[i]} {header_value[i]}\n'
-			else:
-				headers += f'    {headers_res[i]} {headers_method[i]} {header_name[i]}\n'
-			i += 1
-
-	if form.getvalue('acl_if'):
-		acl_if = form.getlist('acl_if')
-		acl_value = form.getlist('acl_value')
-		acl_then = form.getlist('acl_then')
-		acl_then_values = form.getlist('acl_then_value')
-		i = 0
-
-		for a in acl_if:
-
-			acl_then_value = '' if acl_then_values[i] == 'IsEmptY' else acl_then_values[i]
-
-			try:
-				if a == '1':
-					acl_if_word = 'hdr_beg(host) -i '
-					if form.getvalue('ssl') == "https" and form.getvalue('mode') != "tcp":
-						acl_if_word = 'ssl_fc_sni -i '
-					if form.getvalue('mode') == "tcp":
-						acl_if_word = 'req.ssl_sni -i '
-				elif a == '2':
-					acl_if_word = 'hdr_end(host) -i '
-					if form.getvalue('ssl') == "https" and form.getvalue('mode') != "tcp":
-						acl_if_word = 'ssl_fc_sni -i '
-					if form.getvalue('mode') == "tcp":
-						acl_if_word = 'req.ssl_sni -i '
-				elif a == '3':
-					acl_if_word = 'path_beg -i '
-				elif a == '4':
-					acl_if_word = 'path_end -i '
-				elif a == '6':
-					acl_if_word = 'src ip '
-				else:
-					acl_if_word = ''
-
-				if acl_then[i] == '5':
-					acl += '    use_backend '
-				elif acl_then[i] == '2':
-					acl += '    http-request redirect location '
-				elif acl_then[i] == '3':
-					acl += '    http-request allow'
-					acl_then_value = ''
-				elif acl_then[i] == '4':
-					acl += '    http-request deny'
-					acl_then_value = ''
-				elif acl_then[i] == '6':
-					acl += f'    acl return_{acl_value[i]} {acl_if_word} {acl_value[i]}\n'
-					acl += f'    http-request return if return_{acl_value[i]}\n'
-				elif acl_then[i] == '7':
-					acl += f'    acl set_header_{acl_value[i]} {acl_if_word} {acl_value[i]}\n'
-					acl += f'    http-request set-header if set_header_{acl_value[i]}\n'
-
-				if acl_then[i] in ('2', '3', '4', '5'):
-					acl += acl_then_value + ' if { ' + acl_if_word + acl_value[i] + ' } \n'
-			except Exception:
-				acl = ''
-
-			i += 1
-
-	if form.getvalue('circuit_breaking') == "1":
-		observe = 'observe ' + form.getvalue('circuit_breaking_observe')
-		error_limit = ' error-limit ' + form.getvalue('circuit_breaking_error_limit')
-		circuit_breaking_on_error = ' on-error ' + form.getvalue('circuit_breaking_on_error')
-		default_server = '    default-server ' + observe + error_limit + circuit_breaking_on_error + '\n'
-		servers_split += default_server
-
-	if form.getvalue('servers') is not None:
-		servers = form.getlist('servers')
-		server_port = form.getlist('server_port')
-		send_proxy = form.getlist('send_proxy')
-		backup = form.getlist('backup')
-		server_maxconn = form.getlist('server_maxconn')
-		port_check = form.getvalue('port_check')
-		i = 0
-		for server in servers:
-			if form.getvalue('template') is None:
-				try:
-					if send_proxy[i] == '1':
-						send_proxy_param = 'send-proxy'
-					else:
-						send_proxy_param = ''
-				except Exception:
-					send_proxy_param = ''
-
-				try:
-					if backup[i] == '1':
-						backup_param = 'backup'
-					else:
-						backup_param = ''
-				except Exception:
-					backup_param = ''
-
-				try:
-					maxconn_val = server_maxconn[i]
-				except Exception:
-					maxconn_val = '200'
-
-				try:
-					port_check_val = port_check[i]
-				except Exception:
-					port_check_val = server_port[i]
-
-				servers_split += "    server {0} {0}:{1}{2} port {6} maxconn {5} {3} {4} \n".format(
-					server, server_port[i], check, send_proxy_param, backup_param, maxconn_val, port_check_val
-				)
-			else:
-				servers_split += "    server-template {0} {1} {2}:{3} {4} \n".format(
-					form.getvalue('prefix'), form.getvalue('template-number'), server, server_port[i], check
-				)
-			i += 1
-
-	compression = form.getvalue("compression")
-	cache = form.getvalue("cache")
-	compression_s = ""
-	cache_s = ""
-	cache_set = ""
-	filter_com = ""
-	if compression == "1" or cache == "2":
-		filter_com = "    filter compression\n"
-		if cache == "2":
-			cache_s = f"    http-request cache-use {end_name}\n    http-response cache-store {end_name}\n"
-			cache_set = f"cache {end_name}\n    total-max-size 4\n    max-age 240\n"
-		if compression == "1":
-			compression_s = "    compression algo gzip\n    compression type text/html text/plain text/css\n"
-
-	waf = ""
-	if form.getvalue('waf') is not None:
-		waf = f"    filter spoe engine modsecurity config {haproxy_dir}/waf.conf\n"
-		waf += "    http-request deny if { var(txn.modsec.code) -m int gt 0 }\n"
-
-	config_add = f"\n{name}\n{bind}{mode}{maxconn}{balance}{options_split}{cache_s}{filter_com}{compression_s}" \
-				 f"{waf}{headers}{acl}{backend}{servers_split}\n{cache_set}\n"
-
-if form.getvalue('new_userlist') is not None:
-	name = f"userlist {form.getvalue('new_userlist')}\n"
-
-	new_userlist_groups = ""
-	if form.getvalue('userlist-group') is not None:
-		groups = form.getlist('userlist-group')
-		for group in groups:
-			new_userlist_groups += f"    group {group}\n"
-
-	new_users_list = ""
-	if form.getvalue('userlist-user') is not None:
-		users = form.getlist('userlist-user')
-		passwords = form.getlist('userlist-password')
-		userlist_user_group = form.getlist('userlist-user-group')
-		i = 0
-
-		for user in users:
-			try:
-				group = f' groups {userlist_user_group[i]}'
-			except Exception:
-				group = ''
-			new_users_list += f"    user {user} insecure-password { passwords[i]} {group}\n"
-			i += 1
-
-	config_add = "\n" + name + new_userlist_groups + new_users_list
-
-if form.getvalue('peers-name') is not None:
-	name = "peers " + form.getvalue('peers-name') + "\n"
-	servers_split = ''
-
-	if form.getvalue('servers') is not None:
-		servers = form.getlist('servers')
-		server_port = form.getlist('server_port')
-		servers_name = form.getlist('servers_name')
-		i = 0
-		for server in servers:
-			servers_split += "    peer {0} {1}:{2} \n".format(servers_name[i], server, server_port[i])
-
-			i += 1
-
-		config_add = "\n" + name + servers_split
-
-if form.getvalue('generateconfig') is None and serv is not None:
-	slave_output = ''
-	try:
-		server_name = sql.get_hostname_by_server_ip(serv)
-	except Exception:
-		server_name = serv
-
-	try:
-		roxywi_common.check_is_server_in_group(serv)
-		if config_add:
-			hap_configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
-			cfg = hap_configs_dir + serv + "-" + get_date.return_date('config') + ".cfg"
-
-			config_mod.get_config(serv, cfg)
-			try:
-				with open(cfg, "a") as conf:
-					conf.write(config_add)
-			except IOError as e:
-				print(f"error: Can't read import config file {e}")
-
-			output = config_mod.master_slave_upload_and_restart(serv, cfg, just_save="save")
-
-			if output:
-				print(output)
-			else:
-				print(name)
-
-			try:
-				roxywi_common.logging(serv, f"add.py add new {name}")
-			except Exception:
-				pass
-	except Exception:
-		pass
-else:
-	print(config_add)
diff --git a/app/add_nginx.py b/app/add_nginx.py
deleted file mode 100755
index d4b40b55..00000000
--- a/app/add_nginx.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-import sys
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.config.config as config_mod
-import modules.roxy_wi_tools as roxy_wi_tools
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-get_config_var = roxy_wi_tools.GetConfigVar()
-form = common.form
-serv = form.getvalue('serv')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(service='nginx')
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
-except Exception as e:
-	print(f'error {e}')
-	sys.exit()
-
-roxywi_auth.page_for_admin(level=3)
-
-if all(v is None for v in [form.getvalue('upstream'), form.getvalue('generateconfig')]):
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-	template = env.get_template('add_nginx.html')
-	template = template.render(
-		h2=1, role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=form.getvalue('add'),
-		conf_add=form.getvalue('conf'), user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
-	)
-	print(template)
-elif form.getvalue('upstream') is not None:
-	nginx_dir = sql.get_setting('nginx_dir')
-	name = form.getlist('name')
-	new_upstream = form.getvalue('upstream')
-	balance = form.getvalue("balance")
-	ip = ''
-	port = ''
-	config_add = ''
-	servers_split = ''
-
-	if balance == 'round_robin':
-		balance = ''
-	else:
-		balance = f'    {balance};\n'
-
-	if new_upstream is not None:
-		config_add = f'upstream {new_upstream} {{\n'
-		config_add += balance
-		config_name = f'upstream_{new_upstream}'
-
-	if form.getvalue('keepalive') is not None:
-		config_add += f'    keepalive {form.getvalue("keepalive")};\n'
-
-	if form.getvalue('servers') is not None:
-		servers = form.getlist('servers')
-		server_port = form.getlist('server_port')
-		max_fails = form.getlist('max_fails')
-		fail_timeout = form.getlist('fail_timeout')
-		i = 0
-		for server in servers:
-			try:
-				max_fails_val = f'max_fails={max_fails[i]}'
-			except Exception:
-				max_fails_val = 'max_fails=1'
-
-			try:
-				fail_timeout_val = f'fail_timeout={fail_timeout[i]}'
-			except Exception:
-				fail_timeout_val = 'fail_timeout=1'
-
-			servers_split += f"    server {server}:{server_port[i]} {max_fails_val} {fail_timeout_val}s; \n"
-			i += 1
-	config_add += f'{servers_split} }}\n'
-
-if form.getvalue('generateconfig') is None and serv is not None:
-	slave_output = ''
-	try:
-		server_name = sql.get_hostname_by_server_ip(serv)
-	except Exception:
-		server_name = serv
-
-	try:
-		roxywi_common.check_is_server_in_group(serv)
-		if config_add:
-			sub_folder = 'conf.d' if 'upstream' in config_name else 'sites-enabled'
-
-			service_configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir')
-			cfg = f'{service_configs_dir}{serv}-{config_name}.conf'
-			nginx_dir = common.return_nice_path(sql.get_setting('nginx_dir'))
-
-			config_file_name = f'{nginx_dir}{sub_folder}/{config_name}.conf'
-
-			try:
-				with open(cfg, "w") as conf:
-					conf.write(config_add)
-			except IOError:
-				print("error: Cannot save a new config")
-
-			roxywi_common.logging(serv, "add_nginx.py add new %s" % config_name)
-
-			output = config_mod.master_slave_upload_and_restart(serv, cfg, just_save="save", nginx=1, config_file_name=config_file_name)
-
-			if output:
-				print(output)
-			else:
-				print(config_name)
-
-	except Exception:
-		pass
-else:
-	print(config_add)
diff --git a/app/ajax_views.py b/app/ajax_views.py
new file mode 100644
index 00000000..8fbea176
--- /dev/null
+++ b/app/ajax_views.py
@@ -0,0 +1,192 @@
+import os
+import sys
+
+from flask import render_template, request
+from flask_login import login_required
+
+from app import app, login_manager, cache
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.server.server as server_mod
+import modules.service.action as service_action
+import modules.service.common as service_common
+import modules.service.haproxy as service_haproxy
+import modules.roxywi.roxy as roxy
+import modules.roxywi.logs as roxy_logs
+import modules.roxywi.nettools as nettools
+import modules.roxywi.common as roxywi_common
+import modules.roxywi.overview as roxy_overview
+
+
+
+@app.route('/overview/services')
+@login_required
+def show_services_overview():
+	return roxy_overview.show_services_overview()
+
+
+@app.route('/overview/server/<server_ip>')
+@login_required
+def overview_server(server_ip):
+	return roxy_overview.show_overview(server_ip)
+
+
+@app.route('/overview/users')
+@login_required
+def overview_users():
+	return roxy_overview.user_owv()
+
+
+@app.route('/overview/sub')
+@login_required
+@cache.cached()
+def overview_sub():
+	return roxy_overview.show_sub_ovw()
+
+
+@app.route('/logs/<service>/<serv>', methods=['GET', 'POST'])
+@login_required
+def show_remote_log_files(service, serv):
+	service = common.checkAjaxInput(service)
+	serv = common.checkAjaxInput(serv)
+	log_path = sql.get_setting(f'{service}_path_logs')
+	return_files = server_mod.get_remote_files(serv, log_path, 'log')
+
+	if 'error: ' in return_files:
+		return return_files
+
+	lang = roxywi_common.get_user_lang_for_flask()
+
+	return render_template(
+		'ajax/show_log_files.html', serv=serv, return_files=return_files, path_dir=log_path, lang=lang
+	)
+
+
+@app.route('/logs/<service>/<serv>/<rows>', defaults={'waf': '0'}, methods=['GET', 'POST'])
+@app.route('/logs/<service>/waf/<serv>/<rows>', defaults={'waf': '1'}, methods=['GET', 'POST'])
+@login_required
+def show_logs(service, serv, rows, waf):
+	if request.method == 'GET':
+		grep = request.args.get('grep')
+		exgrep = request.args.get('exgrep')
+		hour = request.args.get('hour')
+		minute = request.args.get('minute')
+		hour1 = request.args.get('hour1')
+		minute1 = request.args.get('minute1')
+		log_file = request.args.get('file')
+	else:
+		grep = request.form.get('grep')
+		exgrep = request.form.get('exgrep')
+		hour = request.form.get('hour')
+		minute = request.form.get('minute')
+		hour1 = request.form.get('hour1')
+		minute1 = request.form.get('minute1')
+		log_file = request.form.get('file')
+
+	if roxywi_common.check_user_group_for_flask():
+		try:
+			out = roxy_logs.show_roxy_log(serv=serv, rows=rows, waf=waf, grep=grep, exgrep=exgrep, hour=hour, minute=minute,
+											hour1=hour1, minute1=minute1, service=service, log_file=log_file)
+		except Exception as e:
+			return str(e)
+		else:
+			return out
+
+
+@app.route('/internal/show_version')
+@cache.cached()
+def show_roxywi_version():
+	return render_template('ajax/check_version.html', versions=roxy.versions())
+
+
+@app.route('/stats/view/<service>/<server_ip>')
+def show_stats(service, server_ip):
+	server_ip = common.is_ip_or_dns(server_ip)
+	
+	if service in ('nginx', 'apache'):
+		return service_common.get_stat_page(server_ip, service)
+	else:
+		return service_haproxy.stat_page_action(server_ip)
+
+
+@app.route('/portscanner/history/<server_ip>')
+@login_required
+def portscanner_history(server_ip):
+	try:
+		user_params = roxywi_common.get_users_params()
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	history = sql.select_port_scanner_history(server_ip)
+	user_subscription = roxywi_common.return_user_subscription()
+
+	return render_template(
+		'include/port_scan_history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, servers=user_params['servers'],
+		history=history, user_services=user_params['user_services'], token=user_params['token'],
+		user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang']
+	)
+
+
+@app.post('/portscanner/settings')
+def change_settings_portscanner():
+	server_id = common.checkAjaxInput(request.form.get('server_id'))
+	enabled = common.checkAjaxInput(request.form.get('enabled'))
+	notify = common.checkAjaxInput(request.form.get('notify'))
+	history = common.checkAjaxInput(request.form.get('history'))
+	user_group_id = [server[3] for server in sql.select_servers(id=server_id)]
+
+	try:
+		if sql.insert_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history):
+			return 'ok'
+		else:
+			if sql.update_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history):
+				return 'ok'
+	except Exception as e:
+		return f'error: Cannot save settings: {e}'
+	else:
+		return 'ok'
+
+
+@app.route('/portscanner/scan/<int:server_id>')
+def scan_port(server_id):
+	server = sql.select_servers(id=server_id)
+	ip = ''
+
+	for s in server:
+		ip = s[2]
+
+	cmd = f"sudo nmap -sS {ip} |grep -E '^[[:digit:]]'|sed 's/  */ /g'"
+	cmd1 = f"sudo nmap -sS {ip} |head -5|tail -2"
+
+	stdout, stderr = server_mod.subprocess_execute(cmd)
+	stdout1, stderr1 = server_mod.subprocess_execute(cmd1)
+
+	if stderr != '':
+		return f'error: {stderr}'
+	else:
+		lang = roxywi_common.get_user_lang_for_flask()
+		return render_template('ajax/scan_ports.html', ports=stdout, info=stdout1, lang=lang)
+
+
+@app.post('/nettols/<check>')
+def nettols_check(check):
+	server_from = common.checkAjaxInput(request.form.get('server_from'))
+	server_to = common.is_ip_or_dns(request.form.get('server_to'))
+	action = common.checkAjaxInput(request.form.get('nettools_action'))
+	port_to = common.checkAjaxInput(request.form.get('nettools_telnet_port_to'))
+	dns_name = common.checkAjaxInput(request.form.get('nettools_nslookup_name'))
+	dns_name = common.is_ip_or_dns(dns_name)
+	record_type = common.checkAjaxInput(request.form.get('nettools_nslookup_record_type'))
+
+	if check == 'icmp':
+		return nettools.ping_from_server(server_from, server_to, action)
+	elif check == 'tcp':
+		return nettools.telnet_from_server(server_from, server_to, port_to)
+	elif check == 'dns':
+		return nettools.nslookup_from_server(server_from, dns_name, record_type)
+	else:
+		return 'error: Wrong check'
diff --git a/app/app.wsgi b/app/app.wsgi
new file mode 100644
index 00000000..c7c3bca5
--- /dev/null
+++ b/app/app.wsgi
@@ -0,0 +1,4 @@
+import sys
+sys.path.insert(0,"/var/www/haproxy-wi/")
+
+from app import app as application
diff --git a/app/config.py b/app/config.py
deleted file mode 100644
index 5e862ed8..00000000
--- a/app/config.py
+++ /dev/null
@@ -1,158 +0,0 @@
-#!/usr/bin/env python3
-import os
-import sys
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.config.config as config_mod
-import modules.roxy_wi_tools as roxy_wi_tools
-import modules.roxywi.common as roxywi_common
-
-time_zone = sql.get_setting('time_zone')
-get_date = roxy_wi_tools.GetDate(time_zone)
-get_config_var = roxy_wi_tools.GetConfigVar()
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('config.html')
-
-print('Content-type: text/html\n')
-
-form = common.form
-serv = common.is_ip_or_dns(form.getvalue('serv'))
-try:
-	service = common.checkAjaxInput(form.getvalue('service'))
-except Exception:
-	print('<meta http-equiv="refresh" content="0; url=/app/">')
-
-is_serv_protected = False
-
-try:
-	config_file_name = form.getvalue('config_file_name').replace('92', '/')
-except Exception:
-	config_file_name = ''
-
-config_read = ""
-cfg = ""
-stderr = ""
-error = ""
-aftersave = ""
-is_restart = ''
-service_desc = ''
-
-user_params = roxywi_common.get_users_params(service='nginx')
-
-if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
-	service_desc = sql.select_service(service)
-	if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
-		if user_params['lang'] == 'ru':
-			title = f"Работа с конфигурационным файлом {service_desc.service}"
-		else:
-			title = f"Working with {service_desc.service} configuration files"
-		action = f"config.py?service={service_desc.slug}"
-		configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
-		file_format = 'conf'
-		servers = roxywi_common.get_dick_permit(service=service_desc.slug)
-
-		if service in ('haproxy', 'nginx', 'apache'):
-			configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir')
-		else:
-			configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
-
-		if service == 'haproxy':
-			file_format = 'cfg'
-else:
-	print('<meta http-equiv="refresh" content="0; url=/app/overview.py">')
-
-if serv is not None:
-	if service == 'nginx' or service == 'apache':
-		conf_file_name_short = config_file_name.split('/')[-1]
-		cfg = f"{configs_dir}{serv}-{conf_file_name_short}-{get_date.return_date('config')}.{file_format}"
-	else:
-		cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.{file_format}"
-
-if serv is not None and form.getvalue('open') is not None and form.getvalue('new_config') is None:
-	roxywi_common.check_is_server_in_group(serv)
-	is_serv_protected = sql.is_serv_protected(serv)
-	server_id = sql.select_server_id_by_ip(serv)
-	is_restart = sql.select_service_setting(server_id, service, 'restart')
-
-	if service == 'keepalived':
-		error = config_mod.get_config(serv, cfg, keepalived=1)
-		try:
-			roxywi_common.logging(serv, " Keepalived config has been opened for ")
-		except Exception:
-			pass
-	elif service == 'nginx':
-		error = config_mod.get_config(serv, cfg, nginx=1, config_file_name=config_file_name)
-		try:
-			roxywi_common.logging(serv, " NGINX config has been opened ")
-		except Exception:
-			pass
-	elif service == 'apache':
-		error = config_mod.get_config(serv, cfg, apache=1, config_file_name=config_file_name)
-		try:
-			roxywi_common.logging(serv, " Apache config has been opened ")
-		except Exception:
-			pass
-	else:
-		error = config_mod.get_config(serv, cfg)
-		try:
-			roxywi_common.logging(serv, " HAProxy config has been opened ")
-		except Exception:
-			pass
-
-	try:
-		conf = open(cfg, "r")
-		config_read = conf.read()
-		conf.close()
-	except IOError:
-		error += '<br />Cannot read imported config file'
-
-	os.system("/bin/mv %s %s.old" % (cfg, cfg))
-
-if form.getvalue('new_config') is not None:
-	config_read = ' '
-
-if serv is not None and form.getvalue('config') is not None:
-	roxywi_common.check_is_server_in_group(serv)
-
-	config = form.getvalue('config')
-	oldcfg = form.getvalue('oldconfig')
-	save = form.getvalue('save')
-
-	try:
-		with open(cfg, "a") as conf:
-			conf.write(config)
-	except IOError:
-		print("error: Cannot read imported config file")
-
-	if service == 'keepalived':
-		stderr = config_mod.upload_and_restart(serv, cfg, just_save=save, keepalived=1, oldcfg=oldcfg)
-	elif service == 'nginx':
-		stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, nginx=1, oldcfg=oldcfg, config_file_name=config_file_name)
-	elif service == 'apache':
-		stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, apache=1, oldcfg=oldcfg, config_file_name=config_file_name)
-	else:
-		stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, oldcfg=oldcfg)
-
-	config_mod.diff_config(oldcfg, cfg)
-
-	try:
-		os.system("/bin/rm -f " + configs_dir + "*.old")
-	except Exception as e:
-		print('error: ' + str(e))
-
-	if stderr:
-		print(stderr)
-
-	sys.exit()
-
-template = template.render(
-	h2=1, role=user_params['role'], action=action, user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave,
-	config=config_read, cfg=cfg, selects=servers, stderr=stderr, error=error, service=service, is_restart=is_restart,
-	user_services=user_params['user_services'], config_file_name=config_file_name, is_serv_protected=is_serv_protected,
-	token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
-)
-print(template)
diff --git a/app/create_db.py b/app/create_db.py
index 603cc4ce..cbe10832 100644
--- a/app/create_db.py
+++ b/app/create_db.py
@@ -159,194 +159,6 @@ def default_values():
 		except Exception as e:
 			print(str(e))
 
-	data_source = [
-		{'param': 'aws', 'name': 'AWS', 'optgroup': 'aws', 'section': 'provider', 'provider': 'aws', 'image': '/inc/images/provisioning/providers/aws.svg'},
-		{'param': 'do', 'name': 'DigitalOcearn', 'optgroup': 'do', 'section': 'provider', 'provider': 'do', 'image': '/inc/images/provisioning/providers/do.svg'},
-		{'param': 'gcore', 'name': 'G-Core Labs', 'optgroup': 'gcore', 'section': 'provider', 'provider': 'gcore', 'image': '/inc/images/provisioning/providers/gcore.svg'},
-		{'param': 'us-east-1', 'name': 'N. Virginia', 'optgroup': 'US East', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'us-east-2', 'name': 'Ohio', 'optgroup': 'US East', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'us-west-1', 'name': 'N. California', 'optgroup': 'US West', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'us-west-2', 'name': 'Oregon', 'optgroup': 'US West', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'af-south-1', 'name': 'Cape Town', 'optgroup': 'Africa', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/za.svg'},
-		{'param': 'ap-east-1', 'name': 'Hong Kong', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/hk.svg'},
-		{'param': 'ap-south-1', 'name': 'Mumbai', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/in.svg'},
-		{'param': 'ap-northeast-2', 'name': 'Seoul', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/kr.svg'},
-		{'param': 'ap-southeast-1', 'name': 'Singapore', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/sg.svg'},
-		{'param': 'ap-southeast-2', 'name': 'Sydney', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/au.svg'},
-		{'param': 'ap-northeast-1', 'name': 'Tokyo', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/jp.svg'},
-		{'param': 'ca-central-1', 'name': 'Central', 'optgroup': 'Canada', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/ca.svg'},
-		{'param': 'eu-central-1', 'name': 'Frankfurt', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws',
-			'image': '/inc/images/provisioning/flags/de.svg'},
-		{'param': 'eu-west-1', 'name': 'Ireland', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/ie.svg'},
-		{'param': 'eu-west-2', 'name': 'London', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/gb.svg'},
-		{'param': 'eu-south-1', 'name': 'Milan', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/fr.svg'},
-		{'param': 'eu-west-3', 'name': 'Paris', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/fr.svg'},
-		{'param': 'eu-north-1', 'name': 'Stockholm', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/se.svg'},
-		{'param': 'me-south-1', 'name': 'Bahrain', 'optgroup': 'Middle East', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/bh.svg'},
-		{'param': 'sa-east-1', 'name': 'São Paulo', 'optgroup': 'South America', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/br.svg'},
-		{'param': 'nyc1', 'name': 'New York 1', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'nyc2', 'name': 'New York 2', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'nyc3', 'name': 'New York 3', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'sfo1', 'name': 'San Francisco 1', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'sfo2', 'name': 'San Francisco 2', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'sfo3', 'name': 'San Francisco 3', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': 'tor1', 'name': 'Toronto 1', 'optgroup': 'Canada', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/ca.svg'},
-		{'param': 'ams2', 'name': 'Amsterdam 2', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/nl.svg'},
-		{'param': 'ams3', 'name': 'Amsterdam 3', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/nl.svg'},
-		{'param': 'fra1', 'name': 'Frankfurt 1', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/de.svg'},
-		{'param': 'lon1', 'name': 'London 1', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/gb.svg'},
-		{'param': 'sgp1', 'name': 'Singapore 1', 'optgroup': 'Asia', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/sg.svg'},
-		{'param': 'blr1', 'name': 'Bangalore 1', 'optgroup': 'Asia', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/bh.svg'},
-		{'param': '68', 'name': 'Chicago', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': '14', 'name': 'Manassas', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': '35', 'name': 'Santa-Clara', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/us.svg'},
-		{'param': '91', 'name': 'Sao Paulo', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/br.svg'},
-		{'param': '64', 'name': 'Hong-Kong', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/hk.svg'},
-		{'param': '18', 'name': 'Singapore', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/sg.svg'},
-		{'param': '88', 'name': 'Sydney', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/au.svg'},
-		{'param': '29', 'name': 'Tokyo', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/jp.svg'},
-		{'param': '46', 'name': 'Almaty', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/kz.svg'},
-		{'param': '26', 'name': 'Amsterdam', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/nl.svg'},
-		{'param': '51', 'name': 'Amsterdam-2', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/nl.svg'},
-		{'param': '38', 'name': 'Frankfurt', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/de.svg'},
-		{'param': '120', 'name': 'Darmstadt', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/de.svg'},
-		{'param': '50', 'name': 'Istanbul', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/tr.svg'},
-		{'param': '84', 'name': 'Johannesburg', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/za.svg'},
-		{'param': '6', 'name': 'Luxembourg', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/lu.svg'},
-		{'param': '76', 'name': 'Luxembourg-2', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/lu.svg'},
-		{'param': '56', 'name': 'Paris', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/fr.svg'},
-		{'param': '100', 'name': 'Paris-2', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/fr.svg'},
-		{'param': '80', 'name': 'Warsaw', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/pl.svg'},
-		{'param': '116', 'name': 'Dubai', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/ae.svg'},
-		{'param': '22', 'name': 'Khabarovsk', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'},
-		{'param': '10', 'name': 'Moscow', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'},
-		{'param': '42', 'name': 'Saint Petersburg', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'},
-		{'param': '60', 'name': 'Yekaterinburg', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'},
-		{'param': '72', 'name': 'Novosibirsk', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'},
-		{'param': 'ubuntu-18-04', 'name': 'Ubuntu 18.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-20-04', 'name': 'Ubuntu 20.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-20-14', 'name': 'Ubuntu 20.14', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-22-04', 'name': 'Ubuntu 22.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-23-04', 'name': 'Ubuntu 23.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'centos-7', 'name': 'CentOS 7', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'centos-8', 'name': 'CentOS 8', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'centos-9', 'name': 'CentOS 9', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'debian-9', 'name': 'Debian 9', 'optgroup': 'Debian', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'debian-10', 'name': 'Debian 10', 'optgroup': 'Debian', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'debian-11', 'name': 'Debian 11', 'optgroup': 'Debian', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'amazon-2_lts', 'name': 'Amazon Linux 2', 'optgroup': 'Amazon Linux', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/providers/aws.svg'},
-		{'param': 'ubuntu-18-04-x64', 'name': 'Ubuntu 18.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-20-04-x64', 'name': 'Ubuntu 20.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-20-14-x64', 'name': 'Ubuntu 20.14', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-22-04-x64', 'name': 'Ubuntu 22.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-23-04-x64', 'name': 'Ubuntu 23.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'centos-7-x64', 'name': 'CentOS 7', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'centos-stream-8-x64', 'name': 'CentOS 8 Stream', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'centos-stream-9-x64', 'name': 'CentOS 9 Stream', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'rockylinux-8-4-x64', 'name': 'RockyLinux 8.4', 'optgroup': 'RockyLinux', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/rocky-linux.svg'},
-		{'param': 'rockylinux-8-x64', 'name': 'RockyLinux 8.5', 'optgroup': 'RockyLinux', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/rocky-linux.svg'},
-		{'param': 'debian-9-x64', 'name': 'Debian 9', 'optgroup': 'Debian', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'debian-10-x64', 'name': 'Debian 10', 'optgroup': 'Debian', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'debian-11-x64', 'name': 'Debian 11', 'optgroup': 'Debian', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'ubuntu-18.04-x64', 'name': 'Ubuntu 18.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-20.04-x64', 'name': 'Ubuntu 20.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-20.10-x64', 'name': 'Ubuntu 20.10', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-22.04-x64', 'name': 'Ubuntu 22.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-22.10-x64', 'name': 'Ubuntu 22.10', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'ubuntu-23.04-x64', 'name': 'Ubuntu 23.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'},
-		{'param': 'centos-7-1811-x64-qcow2', 'name': 'CentOS 7.6', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'centos-7-2003-x64-qcow2', 'name': 'CentOS 7.8', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'centos8-stream-0210-x64', 'name': 'CentOS 8.4', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'centos9-stream-0330-x64', 'name': 'CentOS 9', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'},
-		{'param': 'fedora-33-x64-qcow2', 'name': 'Fedora 33', 'optgroup': 'Fedora', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/fedora.svg'},
-		{'param': 'fedora-34-x64-qcow2', 'name': 'Fedora 34', 'optgroup': 'Fedora', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/fedora.svg'},
-		{'param': 'fedora-35-x64-qcow2', 'name': 'Fedora 35', 'optgroup': 'Fedora', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/fedora.svg'},
-		{'param': 'debian-9.7-x64-qcow2', 'name': 'Debian 9.7', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'debian-10.1-x64-qcow2', 'name': 'Debian 10.1', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'debian-10.3-x64-qcow2', 'name': 'Debian 10.3', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'debian-11.generic-x64-qcow2', 'name': 'Debian 11', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'},
-		{'param': 'windows-server-2019', 'name': 'Windows 2019', 'optgroup': 'Windows', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/windows.svg'},
-		{'param': 'windows-server-2022', 'name': 'Windows 2022', 'optgroup': 'Windows', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/windows.svg'},
-		{'param': 'sles15-SP2', 'name': 'SLES 15-SP2', 'optgroup': 'SUSE', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/suse.svg'},
-		{'param': 's-1vcpu-1gb', 'name': 's-1vcpu-1gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'},
-		{'param': 's-2vcpu-2gb', 'name': 's-2vcpu-2gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'},
-		{'param': 's-2vcpu-4gb', 'name': 's-2vcpu-4gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'},
-		{'param': 's-4vcpu-8gb', 'name': 's-4vcpu-8gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'},
-		{'param': 's-8vcpu-16gb', 'name': 's-8vcpu-16gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'},
-		{'param': 's-1vcpu-1gb-intel', 'name': 's-1vcpu-1gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'},
-		{'param': 's-2vcpu-2gb-intel', 'name': 's-2vcpu-2gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'},
-		{'param': 's-2vcpu-4gb-intel', 'name': 's-2vcpu-4gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'},
-		{'param': 's-4vcpu-8gb-intel', 'name': 's-4vcpu-8gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'},
-		{'param': 's-8vcpu-16gb-intel', 'name': 's-8vcpu-16gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'},
-		{'param': 's-1vcpu-1gb-amd', 'name': 's-1vcpu-1gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'},
-		{'param': 's-2vcpu-2gb-amd', 'name': 's-2vcpu-2gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'},
-		{'param': 's-2vcpu-4gb-amd', 'name': 's-2vcpu-4gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'},
-		{'param': 's-4vcpu-8gb-amd', 'name': 's-4vcpu-8gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'},
-		{'param': 's-8vcpu-16gb-amd', 'name': 's-8vcpu-16gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'},
-		{'param': 'g-2vcpu-8gb', 'name': 'g-2vcpu-8gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'},
-		{'param': 'g-4vcpu-16gb', 'name': 'g-4vcpu-16gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'},
-		{'param': 'g-8vcpu-32gb', 'name': 'g-8vcpu-32gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'},
-		{'param': 'g-32vcpu-128gb', 'name': 'g-32vcpu-128gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'},
-		{'param': 'g-40vcpu-160gb', 'name': 'g-40vcpu-160gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'},
-		{'param': 'c-4-8gib', 'name': 'c-4-8gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'c-8-16gib', 'name': 'c-8-16gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'c-16-32gib', 'name': 'c-16-32gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'c-32-64gib', 'name': 'c-32-64gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'm-2vcpu-16gb', 'name': 'm-2vcpu-16gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'm-4vcpu-32gb', 'name': 'm-4vcpu-32gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'm-8vcpu-64gb', 'name': 'm-8vcpu-64gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'm-16vcpu-128gb', 'name': 'm-16vcpu-128gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'm-24vcpu-192gb', 'name': 'm-24vcpu-192gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'm-32vcpu-256gb', 'name': 'm-32vcpu-256gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'm-32vcpu-256gb', 'name': 'm-32vcpu-256gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'},
-		{'param': 'g1-standard-1-2', 'name': 'g1-standard-1-2', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-2-4', 'name': 'g1-standard-2-4', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-2-8', 'name': 'g1-standard-2-8', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-4-8', 'name': 'g1-standard-4-8', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-4-16', 'name': 'g1-standard-4-16', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-8-16', 'name': 'g1-standard-8-16', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-8-32', 'name': 'g1-standard-8-32', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-16-32', 'name': 'g1-standard-16-32', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-16-64', 'name': 'g1-standard-16-64', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-32-64', 'name': 'g1-standard-32-64', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-standard-32-128', 'name': 'g1-standard-32-128', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-cpu-2-2', 'name': 'g1-cpu-2-2', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-cpu-4-4', 'name': 'g1-cpu-4-4', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-cpu-8-8', 'name': 'g1-cpu-8-8', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-cpu-16-16', 'name': 'g1-cpu-16-16', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-cpu-32-32', 'name': 'g1-cpu-32-32', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-memory-4-32', 'name': 'g1-memory-4-32', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-memory-8-64', 'name': 'g1-memory-8-64', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-memory-16-128', 'name': 'g1-memory-16-128', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'g1-memory-32-256', 'name': 'g1-memory-32-256', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'},
-		{'param': 'gp2', 'name': 'gp2', 'optgroup': 'General Purpose SSD', 'section': 'volume_type', 'provider': 'aws'},
-		{'param': 'gp3', 'name': 'gp3', 'optgroup': 'General Purpose SSD', 'section': 'volume_type', 'provider': 'aws'},
-		{'param': 'standard', 'name': 'standard', 'optgroup': 'Magnetic', 'section': 'volume_type', 'provider': 'aws'},
-		{'param': 'io1', 'name': 'io1', 'optgroup': 'Provisioned IOPS SSD', 'section': 'volume_type', 'provider': 'aws'},
-		{'param': 'io2', 'name': 'io2', 'optgroup': 'Provisioned IOPS SSD', 'section': 'volume_type', 'provider': 'aws'},
-		{'param': 'sc1', 'name': 'sc1', 'optgroup': 'Cold HDD', 'section': 'volume_type', 'provider': 'aws'},
-		{'param': 'st1', 'name': 'st1', 'optgroup': 'Throughput Optimized HDD', 'section': 'volume_type', 'provider': 'aws'},
-		{'param': 'standard', 'name': 'standard', 'optgroup': 'Standard network SSD', 'section': 'volume_type', 'provider': 'gcore'},
-		{'param': 'ssd_hiiops', 'name': 'ssd_hiiops', 'optgroup': 'High IOPS SSD', 'section': 'volume_type', 'provider': 'gcore'},
-		{'param': 'cold', 'name': 'cold', 'optgroup': 'HDD disk', 'section': 'volume_type', 'provider': 'gcore'},
-	]
-
-	try:
-		ProvisionParam.insert_many(data_source).on_conflict_ignore().execute()
-	except Exception as e:
-		print(str(e))
-
 	data_source = [
 		{'code': 'RW', 'name': 'Rwanda'},
 		{'code': 'SO', 'name': 'Somalia'},
@@ -731,18 +543,6 @@ def update_db_v_6_3_11():
 		print("Updating... DB has been updated to version 6.3.11")
 
 
-def update_db_v_6_3_12():
-	try:
-		ProvisionParam.delete().where(
-			(ProvisionParam.provider == 'gcore') &
-			(ProvisionParam.optgroup == 'Russia and CIS')
-		).execute()
-	except Exception as e:
-		print("An error occurred:", e)
-	else:
-		print("Updating... DB has been updated to version 6.3.12")
-
-
 def update_db_v_6_3_13():
 	cursor = conn.cursor()
 	sql = """
@@ -849,7 +649,7 @@ def update_db_v_6_3_18():
 
 def update_ver():
 	try:
-		Version.update(version='6.3.18.0').execute()
+		Version.update(version='7.0.0.0').execute()
 	except Exception:
 		print('Cannot update version')
 
@@ -874,7 +674,6 @@ def update_all():
 	update_db_v_6_3_8()
 	update_db_v_6_3_9()
 	update_db_v_6_3_11()
-	update_db_v_6_3_12()
 	update_db_v_6_3_13()
 	update_db_v_6_3_13_1()
 	update_db_v_6_3_13_2()
diff --git a/app/ha.py b/app/ha.py
deleted file mode 100644
index 7871d59c..00000000
--- a/app/ha.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('ha.html')
-
-print('Content-type: text/html\n')
-
-form = common.form
-serv = form.getvalue('serv')
-
-user_params = roxywi_common.get_users_params()
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=3)
-except Exception as e:
-	print(f'error {e}')
-	sys.exit()
-
-roxywi_auth.page_for_admin(level=2)
-is_needed_tool = common.is_tool('ansible')
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-parsed_template = template.render(
-	h2=1, role=user_params['role'], user=user_params['user'], serv=serv, selects=user_params['servers'],
-	user_services=user_params['user_services'], user_status=user_subscription['user_status'], lang=user_params['lang'],
-	user_plan=user_subscription['user_plan'], is_needed_tool=is_needed_tool, token=user_params['token']
-)
-print(parsed_template)
diff --git a/app/hapservers.py b/app/hapservers.py
deleted file mode 100644
index c2945ba6..00000000
--- a/app/hapservers.py
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-import distro
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.server.server as server_mod
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('hapservers.html')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-services = []
-servers: object
-form = common.form
-serv = common.is_ip_or_dns(form.getvalue('serv'))
-service = common.checkAjaxInput(form.getvalue('service'))
-autorefresh = 0
-servers_waf = ()
-title = ''
-cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l"
-keep_alive, stderr = server_mod.subprocess_execute(cmd)
-is_restart = ''
-service_desc = ''
-restart_settings = ''
-
-if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
-	service_desc = sql.select_service(service)
-	if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
-		if serv:
-			if roxywi_common.check_is_server_in_group(serv):
-				servers = sql.select_servers(server=serv)
-				autorefresh = 1
-				server_id = sql.select_server_id_by_ip(serv)
-				docker_settings = sql.select_docker_service_settings(server_id, service_desc.slug)
-				restart_settings = sql.select_restart_service_settings(server_id, service_desc.slug)
-		else:
-			servers = roxywi_common.get_dick_permit(virt=1, service=service_desc.slug)
-			docker_settings = sql.select_docker_services_settings(service_desc.slug)
-			restart_settings = sql.select_restart_services_settings(service_desc.slug)
-else:
-	print('<meta http-equiv="refresh" content="0; url=/app/overview.py">')
-	sys.exit()
-
-services_name = {'roxy-wi-checker': 'Master backends checker service',
-				 'roxy-wi-keep_alive': 'Auto start service',
-				 'roxy-wi-metrics': 'Master metrics service'}
-for s, v in services_name.items():
-	if distro.id() == 'ubuntu':
-		if s == 'roxy-wi-keep_alive':
-			s = 'roxy-wi-keep-alive'
-		cmd = "apt list --installed 2>&1 |grep " + s
-	else:
-		cmd = "rpm --query " + s + "-* |awk -F\"" + s + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
-	service_ver, stderr = server_mod.subprocess_execute(cmd)
-	try:
-		services.append([s, service_ver[0]])
-	except Exception:
-		services.append([s, ''])
-
-haproxy_sock_port = sql.get_setting('haproxy_sock_port')
-servers_with_status1 = []
-out1 = ''
-if len(servers) == 1:
-	serv = servers[0][2]
-for s in servers:
-	servers_with_status = list()
-	servers_with_status.append(s[0])
-	servers_with_status.append(s[1])
-	servers_with_status.append(s[2])
-	servers_with_status.append(s[11])
-	if service == 'nginx':
-		h = (['', ''],)
-		cmd = [
-			"/usr/sbin/nginx -v 2>&1|awk '{print $3}' && systemctl status nginx |grep -e 'Active' |awk "
-			"'{print $2, $9$10$11$12$13}' && ps ax |grep nginx:|grep -v grep |wc -l"]
-		for service_set in docker_settings:
-			if service_set.server_id == s[0] and service_set.setting == 'dockerized' and service_set.value == '1':
-				container_name = sql.get_setting('nginx_container_name')
-				cmd = [
-					"docker exec -it " + container_name + " /usr/sbin/nginx -v 2>&1|awk '{print $3}' && "
-					"docker ps -a -f name=" + container_name + " --format '{{.Status}}'|tail -1 && ps ax |grep nginx:"
-					"|grep -v grep |wc -l"
-				]
-		try:
-			out = server_mod.ssh_command(s[2], cmd)
-			h = ()
-			out1 = []
-			for k in out.split():
-				out1.append(k)
-			h = (out1,)
-			servers_with_status.append(h)
-			servers_with_status.append(h)
-			servers_with_status.append(s[17])
-		except Exception:
-			servers_with_status.append(h)
-			servers_with_status.append(h)
-			servers_with_status.append(s[17])
-	elif service == 'keepalived':
-		h = (['', ''],)
-		cmd = [
-			"/usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}' && systemctl status keepalived |"
-			"grep -e 'Active' |awk '{print $2, $9$10$11$12$13}' && ps ax |grep keepalived|grep -v grep |wc -l"
-		]
-		try:
-			out = server_mod.ssh_command(s[2], cmd)
-			out1 = []
-			for k in out.split():
-				out1.append(k)
-			h = (out1,)
-			servers_with_status.append(h)
-			servers_with_status.append(h)
-			servers_with_status.append(s[22])
-		except Exception:
-			servers_with_status.append(h)
-			servers_with_status.append(h)
-			servers_with_status.append(s[22])
-	elif service == 'apache':
-		h = (['', ''],)
-		apache_stats_user = sql.get_setting('apache_stats_user')
-		apache_stats_password = sql.get_setting('apache_stats_password')
-		apache_stats_port = sql.get_setting('apache_stats_port')
-		apache_stats_page = sql.get_setting('apache_stats_page')
-		cmd = "curl -s -u %s:%s http://%s:%s/%s?auto |grep 'ServerVersion\|Processes\|ServerUptime:'" % (
-			apache_stats_user, apache_stats_password, s[2], apache_stats_port, apache_stats_page
-		)
-		try:
-			out = server_mod.subprocess_execute(cmd)
-			if out != '':
-				for k in out:
-					servers_with_status.append(k)
-				servers_with_status.append(s[22])
-		except Exception:
-			servers_with_status.append(h)
-			servers_with_status.append(h)
-			servers_with_status.append(s[22])
-	else:
-		cmd = 'echo "show info" |nc %s %s -w 1 -v|grep -e "Ver\|Uptime:\|Process_num"' % (s[2], haproxy_sock_port)
-		out = server_mod.subprocess_execute(cmd)
-		for k in out:
-			if "Connection refused" not in k:
-				out1 = out
-			else:
-				out1 = False
-			servers_with_status.append(out1)
-
-		servers_with_status.append(s[12])
-
-	servers_with_status.append(sql.is_master(s[2]))
-	servers_with_status.append(sql.select_servers(server=s[2]))
-
-	is_keepalived = sql.select_keepalived(s[2])
-
-	if is_keepalived:
-		try:
-			cmd = ['sudo kill -USR1 `cat /var/run/keepalived.pid` && sudo grep State /tmp/keepalived.data -m 1 |'
-				   'awk -F"=" \'{print $2}\'|tr -d \'[:space:]\' && sudo rm -f /tmp/keepalived.data']
-			out = server_mod.ssh_command(s[2], cmd)
-			out1 = ('1', out)
-			servers_with_status.append(out1)
-		except Exception as e:
-			servers_with_status.append(str(e))
-	else:
-		servers_with_status.append('')
-
-	servers_with_status1.append(servers_with_status)
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-template = template.render(
-	h2=1, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], servers=servers_with_status1,
-	keep_alive=''.join(keep_alive), serv=serv, service=service, services=services, user_services=user_params['user_services'],
-	docker_settings=docker_settings, user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
-    servers_waf=servers_waf, restart_settings=restart_settings, service_desc=service_desc, token=user_params['token'],
-	lang=user_params['lang']
-)
-print(template)
diff --git a/app/history.py b/app/history.py
deleted file mode 100644
index 4edbdade..00000000
--- a/app/history.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env python3
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('history.html')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(service='keepalived')
-
-form = common.form
-serv = common.is_ip_or_dns(form.getvalue('serv'))
-service = form.getvalue('service')
-user_id_history = form.getvalue('user_id')
-
-if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
-	service_desc = sql.select_service(service)
-	if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
-		server_id = sql.select_server_id_by_ip(serv)
-		history = sql.select_action_history_by_server_id_and_service(server_id, service_desc.service)
-elif service == 'server':
-	if serv:
-		if roxywi_common.check_is_server_in_group(serv):
-			server_id = sql.select_server_id_by_ip(serv)
-			history = sql.select_action_history_by_server_id(server_id)
-elif service == 'user':
-	if user_id_history:
-		history = sql.select_action_history_by_user_id(user_id_history)
-
-users = sql.select_users()
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-try:
-	sql.delete_action_history_for_period()
-except Exception as e:
-	print(e)
-
-rendered_template = template.render(
-	h2=1, autorefresh=0, role=user_params['role'], user=user_params['user'], users=users, serv=serv,
-	service=service, history=history, user_services=user_params['user_services'], token=user_params['token'],
-	user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang']
-)
-print(rendered_template)
diff --git a/app/login.py b/app/login.py
deleted file mode 100644
index ee85c303..00000000
--- a/app/login.py
+++ /dev/null
@@ -1,238 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-import os
-import sys
-import http.cookies
-
-import datetime
-import uuid
-import distro
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.server.server as server_mod
-import modules.roxy_wi_tools as roxy_wi_tools
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('login.html')
-form = common.form
-
-cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-user_id = cookie.get('uuid')
-try:
-	ref = form.getvalue('ref')
-	login = form.getvalue('login')
-	password = form.getvalue('pass')
-except Exception:
-	ref = ''
-	login = ''
-	password = ''
-error_log = ""
-error = ""
-
-
-def send_cookie(login):
-	session_ttl = int(sql.get_setting('session_ttl'))
-	expires = datetime.datetime.utcnow() + datetime.timedelta(days=session_ttl)
-	user_group = ''
-	user_uuid = str(uuid.uuid4())
-	user_token = str(uuid.uuid4())
-	sql.write_user_uuid(login, user_uuid)
-	sql.write_user_token(login, user_token)
-
-	user_id = sql.get_user_id_by_uuid(user_uuid)
-	try:
-		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-		user_group_id = cookie.get('group')
-		user_group_id = user_group_id.value
-		if sql.check_user_group(user_id, user_group_id):
-			user_groups = user_group_id
-		else:
-			user_groups = sql.select_user_groups(user_id, limit=1)
-	except Exception:
-		user_groups = sql.select_user_groups(user_id, limit=1)
-
-	c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-	c["uuid"] = user_uuid
-	c["uuid"]["path"] = "/app"
-	# c["uuid"]["samesite"] = "Strict"
-	c["uuid"]["Secure"] = "True"
-	c["uuid"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
-	c["group"] = user_groups
-	c["group"]["path"] = "/app"
-	# c["group"]["samesite"] = "Strict"
-	c["group"]["Secure"] = "True"
-	c["group"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
-	print(c.output())
-
-	try:
-		groups = sql.select_groups(id=user_groups)
-		for g in groups:
-			if g[0] == int(user_groups):
-				user_group = g[1]
-	except Exception:
-		user_group = ''
-
-	try:
-		user_name = sql.get_user_name_by_uuid(user_uuid)
-		roxywi_common.logging('Roxy-WI server', f' user: {user_name}, group: {user_group} login', roxywi=1)
-	except Exception:
-		pass
-	print("Content-type: text/html\n")
-	print('ok')
-
-	try:
-		if distro.id() == 'ubuntu':
-			if os.path.exists('/etc/apt/auth.conf.d/roxy-wi.conf'):
-				cmd = "grep login /etc/apt/auth.conf.d/roxy-wi.conf |awk '{print $2}'"
-				get_user_name, stderr = server_mod.subprocess_execute(cmd)
-				user_name = get_user_name[0]
-			else:
-				user_name = 'git'
-		else:
-			if os.path.exists('/etc/yum.repos.d/roxy-wi.repo'):
-				cmd = "grep base /etc/yum.repos.d/roxy-wi.repo |awk -F\":\" '{print $2}'|awk -F\"/\" '{print $3}'"
-				get_user_name, stderr = server_mod.subprocess_execute(cmd)
-				user_name = get_user_name[0]
-			else:
-				user_name = 'git'
-		if sql.select_user_name():
-			sql.update_user_name(user_name)
-		else:
-			sql.insert_user_name(user_name)
-	except Exception as e:
-		roxywi_common.logging('Cannot update subscription: ', str(e), roxywi=1)
-
-	sys.exit()
-
-
-def ban():
-	c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-	expires = datetime.datetime.utcnow() + datetime.timedelta(seconds=10)
-	c["ban"] = "1"
-	c["ban"]["path"] = "/"
-	# c["ban"]["samesite"] = "Strict"
-	c["ban"]["Secure"] = "True"
-	c["ban"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
-	try:
-		roxywi_common.logging('Roxy-WI server', f'{login} failed log in', roxywi=1, login=1)
-	except Exception:
-		roxywi_common.logging('Roxy-WI server', ' Failed log in. Wrong username', roxywi=1)
-	print(c.output())
-	print("Content-type: text/html\n")
-	print('ban')
-	sys.exit()
-
-
-def check_in_ldap(user, password):
-	import ldap
-
-	server = sql.get_setting('ldap_server')
-	port = sql.get_setting('ldap_port')
-	ldap_class_search = sql.get_setting('ldap_class_search')
-	root_user = sql.get_setting('ldap_user')
-	root_password = sql.get_setting('ldap_password')
-	ldap_base = sql.get_setting('ldap_base')
-	ldap_search_field = sql.get_setting('ldap_search_field')
-	ldap_user_attribute = sql.get_setting('ldap_user_attribute')
-	ldap_type = sql.get_setting('ldap_type')
-
-	ldap_proto = 'ldap' if ldap_type == "0" else 'ldaps'
-
-	ldap_bind = ldap.initialize('{}://{}:{}/'.format(ldap_proto, server, port))
-	try:
-		ldap_bind.protocol_version = ldap.VERSION3
-		ldap_bind.set_option(ldap.OPT_REFERRALS, 0)
-
-		bind = ldap_bind.simple_bind_s(root_user, root_password)
-
-		criteria = "(&(objectClass=" + ldap_class_search + ")(" + ldap_user_attribute + "=" + user + "))"
-		attributes = [ldap_search_field]
-		result = ldap_bind.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes)
-
-		bind = ldap_bind.simple_bind_s(result[0][0], password)
-	except ldap.INVALID_CREDENTIALS:
-		ban()
-	except ldap.SERVER_DOWN:
-		print("Content-type: text/html\n")
-		print('error: LDAP server is down')
-		sys.exit()
-	except ldap.LDAPError as e:
-		if type(e.message) == dict and 'desc' in e.message:
-			print("Content-type: text/html\n")
-			print(f'error: {e.message["desc"]}')
-			sys.exit()
-		else:
-			print("Content-type: text/html\n")
-			print(f'error: {e}')
-			sys.exit()
-	else:
-		send_cookie(user)
-
-
-if ref is None:
-	ref = "/index.html"
-
-if form.getvalue('error'):
-	error_log = 'Something wrong. Try again'
-
-try:
-	if sql.get_setting('session_ttl'):
-		session_ttl = sql.get_setting('session_ttl')
-except Exception as e:
-	error = f'error: {e}'
-
-try:
-	role = sql.get_user_role_by_uuid(user_id.value, user_group_id)
-	user = sql.get_user_name_by_uuid(user_id.value)
-except Exception:
-	role = ""
-	user = ""
-
-
-if form.getvalue('logout'):
-	try:
-		sql.delete_uuid(user_id.value)
-	except Exception:
-		pass
-	print("Set-cookie: uuid=; expires=Wed, May 18 03:33:20 2003; path=/app; httponly")
-	print("Content-type: text/html\n")
-	print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
-	sys.exit()
-
-if login is not None and password is not None:
-	USERS = sql.select_users(user=login)
-
-	for users in USERS:
-		if users.activeuser == 0:
-			print("Content-type: text/html\n")
-			print('Your login is disabled')
-			sys.exit()
-		if users.ldap_user == 1:
-			if login in users.username:
-				check_in_ldap(login, password)
-		else:
-			passwordHashed = roxy_wi_tools.Tools.get_hash(password)
-			if login in users.username and passwordHashed == users.password:
-				send_cookie(login)
-				break
-			else:
-				ban()
-	else:
-		ban()
-	print("Content-type: text/html\n")
-
-if login is None:
-	print("Content-type: text/html\n")
-
-try:
-	lang = roxywi_common.get_user_lang()
-except Exception:
-	lang = 'en'
-
-parsed_template = template.render(
-	h2=0, title="Login page", role=role, user=user, error_log=error_log, error=error, ref=ref, lang=lang
-)
-print(parsed_template)
diff --git a/app/logs.py b/app/logs.py
deleted file mode 100644
index fee5ea16..00000000
--- a/app/logs.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python3
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('logs.html')
-form = common.form
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-if form.getvalue('grep') is None:
-	grep = ""
-else:
-	grep = form.getvalue('grep')
-
-exgrep = form.getvalue('exgrep') if form.getvalue('exgrep') else ''
-
-if form.getvalue('rows') is None:
-	rows = 10
-else:
-	if form.getvalue('rows1') is not None:
-		rows = form.getvalue('rows1')
-	else:
-		rows = form.getvalue('rows')
-
-hour = form.getvalue('hour')
-hour1 = form.getvalue('hour1')
-minut = form.getvalue('minut')
-minut1 = form.getvalue('minut1')
-waf = form.getvalue('waf')
-service = common.checkAjaxInput(form.getvalue('service'))
-remote_file = form.getvalue('file')
-service_name = ''
-
-if service in ('haproxy', 'nginx', 'keepalived', 'apache') and waf != '1':
-	service_desc = sql.select_service(service)
-	service_name = service_desc.service
-	if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
-		servers = roxywi_common.get_dick_permit(service=service_desc.slug)
-elif waf == '1':
-	service_name = 'WAF'
-	if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1):
-		servers = roxywi_common.get_dick_permit(haproxy=1)
-else:
-	print('<meta http-equiv="refresh" content="0; url=/app/overview.py">')
-
-template = template.render(
-	h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], select_id="serv",
-	selects=servers, serv=form.getvalue('serv'), rows=rows, grep=grep, exgrep=exgrep, hour=hour, hour1=hour1,
-	minut=minut, minut1=minut1, waf=waf, service=service, user_services=user_params['user_services'],
-	token=user_params['token'], remote_file=remote_file, lang=user_params['lang'], service_name=service_name
-)
-print(template)
diff --git a/app/metrics.py b/app/metrics.py
deleted file mode 100644
index 63231cbe..00000000
--- a/app/metrics.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env python3
-import distro
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.server.server as server_mod
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('metrics.html')
-form = common.form
-service = form.getvalue('service')
-service_desc = ''
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-roxywi_common.check_user_group()
-
-try:
-	if distro.id() == 'ubuntu':
-		cmd = "apt list --installed 2>&1 |grep roxy-wi-metrics"
-	else:
-		cmd = "rpm -q roxy-wi-metrics-* |awk -F\"metrics\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
-	service_ver, stderr = server_mod.subprocess_execute(cmd)
-	services = '0'
-
-	if not stderr:
-		if service_ver[0] == ' is not installed' or service_ver == '':
-			servers = ''
-		else:
-			service_desc = sql.select_service(service)
-
-			if service == 'nginx':
-				if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2):
-					user_params['servers'] = sql.select_nginx_servers_metrics_for_master()
-			elif service == 'apache':
-				if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=4):
-					user_params['servers'] = sql.select_apache_servers_metrics_for_master()
-			else:
-				if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1):
-					group_id = roxywi_common.get_user_group(id=1)
-					user_params['servers'] = sql.select_servers_metrics(group_id)
-					service = 'haproxy'
-			services = '1'
-except Exception:
-	pass
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-template = template.render(
-	h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
-	services=services, user_services=user_params['user_services'], service=service, user_status=user_subscription['user_status'],
-	user_plan=user_subscription['user_plan'], token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
-)
-print(template)
diff --git a/app/modules/alerting/__init__.py b/app/modules/alerting/__init__.py
deleted file mode 100644
index ec8976af..00000000
--- a/app/modules/alerting/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-NAME = 'roxy-wi-alerting-module'
diff --git a/app/modules/common/common.py b/app/modules/common/common.py
index 3337ce9a..5e2de6eb 100644
--- a/app/modules/common/common.py
+++ b/app/modules/common/common.py
@@ -1,5 +1,6 @@
 import re
 import cgi
+import cgitb
 
 form = cgi.FieldStorage()
 error_mess = 'error: All fields must be completed'
diff --git a/app/modules/config/add.py b/app/modules/config/add.py
index 3324c493..508c4a4b 100644
--- a/app/modules/config/add.py
+++ b/app/modules/config/add.py
@@ -1,5 +1,6 @@
 import os
-import json
+
+from flask import render_template, request
 
 import modules.db.sql as sql
 import modules.server.ssh as ssh_mod
@@ -14,6 +15,69 @@ get_date = roxy_wi_tools.GetDate(time_zone)
 get_config = roxy_wi_tools.GetConfigVar()
 
 
+def save_to_haproxy_config(config: str, server_ip) -> str:
+	roxywi_common.check_is_server_in_group(server_ip)
+	hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
+	cfg = hap_configs_dir + server_ip + "-" + get_date.return_date('config') + ".cfg"
+
+	config_mod.get_config(server_ip, cfg)
+
+	try:
+		with open(cfg, "a") as conf:
+			conf.write(config)
+	except IOError as e:
+		raise Exception(f"error: Cannot read import config file {e}")
+
+	try:
+		output = config_mod.master_slave_upload_and_restart(server_ip, cfg, "save", 'haproxy')
+	except Exception as e:
+		raise Exception(e)
+
+	try:
+		roxywi_common.logging(server_ip, f"Add has been added a new {name}")
+	except Exception:
+		pass
+
+	if output:
+		return output
+	else:
+		return name
+
+
+def save_nginx_config(config_add: str, server_ip: str, config_name: str) -> str:
+	try:
+		server_name = sql.get_hostname_by_server_ip(server_ip)
+	except Exception:
+		server_name = server_ip
+
+	roxywi_common.check_is_server_in_group(server_ip)
+	sub_folder = 'conf.d' if 'upstream' in config_name else 'sites-enabled'
+
+	service_configs_dir = get_config.get_config_var('configs', 'nginx_save_configs_dir')
+	cfg = f'{service_configs_dir}{server_ip}-{config_name}.conf'
+	nginx_dir = common.return_nice_path(sql.get_setting('nginx_dir'))
+
+	config_file_name = f'{nginx_dir}{sub_folder}/{config_name}.conf'
+
+	try:
+		with open(cfg, "w") as conf:
+			conf.write(config_add)
+	except IOError:
+		return "error: Cannot save a new config"
+
+	try:
+		roxywi_common.logging(server_ip, "add/nginx add new %s" % config_name)
+	except Exception:
+		pass
+
+	output = config_mod.master_slave_upload_and_restart(server_ip, cfg, "save", 'nginx', config_file_name=config_file_name)
+
+	if output:
+		return output
+	else:
+		return config_name
+
+
 def get_userlists(config):
 	return_config = ''
 	with open(config, 'r') as f:
@@ -25,7 +89,7 @@ def get_userlists(config):
 	return return_config
 
 
-def show_userlist(server_ip: str) -> None:
+def show_userlist(server_ip: str) -> str:
 	configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
 	format_file = 'cfg'
 
@@ -47,55 +111,100 @@ def show_userlist(server_ip: str) -> None:
 			roxywi_common.logging('Roxy-WI server', f' Cannot get Userlists from the config file {e}', roxywi=1)
 			sections = 'error: Cannot get Userlists'
 
-	print(sections)
+	return sections
 
 
-def get_bwlist(color: str, group: str, list_name: str) -> None:
+def add_userlist() -> str:
+	generate = request.form.get('generateconfig')
+	server_ip = request.form.get('serv')
+	name = f"userlist {request.form.get('new_userlist')}\n"
+
+	new_userlist_groups = ""
+	if request.form.get('userlist-group') is not None:
+		groups = request.form.getlist('userlist-group')
+		for group in groups:
+			if group == '':
+				continue
+			new_userlist_groups += f"    group {group}\n"
+
+	new_users_list = ""
+	if request.form.get('userlist-user') is not None:
+		users = request.form.getlist('userlist-user')
+		passwords = request.form.getlist('userlist-password')
+		userlist_user_group = request.form.getlist('userlist-user-group')
+		i = 0
+
+		for user in users:
+			if user == '':
+				continue
+			try:
+				group = f' groups {userlist_user_group[i]}'
+			except Exception:
+				group = ''
+			new_users_list += f"    user {user} insecure-password {passwords[i]} {group}\n"
+			i += 1
+
+	config_add = "\n" + name + new_userlist_groups + new_users_list
+
+	if generate:
+		return config_add
+	else:
+		try:
+			return save_to_haproxy_config(config_add, server_ip)
+		except Exception as e:
+			return str(e)
+
+
+def get_bwlist(color: str, group: str, list_name: str) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	list_path = f"{lib_path}/lists/{group}/{color}/{list_name}"
 
 	try:
 		with open(list_path, 'r') as f:
-			print(f.read())
+			return f.read()
 	except IOError as e:
-		print(f"error: Cannot read {color} list: {e}")
+		return f"error: Cannot read {color} list: {e}"
 
 
-def get_bwlists_for_autocomplete(color: str, group: str) -> None:
+def get_bwlists_for_autocomplete(color: str, group: str) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	list_path = f"{lib_path}/lists/{group}/{color}"
 	lists = roxywi_common.get_files(list_path, "lst")
+	lines = ''
 
 	for line in lists:
-		print(line)
+		lines += line + ' '
+
+	return lines
 
 
-def create_bwlist(server_ip: str, list_name: str, color: str, group: str) -> None:
+def create_bwlist(server_ip: str, list_name: str, color: str, group: str) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	list_name = f"{list_name.split('.')[0]}.lst"
 	list_path = f"{lib_path}/lists/{group}/{color}/{list_name}"
 	try:
 		open(list_path, 'a').close()
-		print('success: ')
 		try:
 			roxywi_common.logging(server_ip, f'A new list {color} {list_name} has been created', roxywi=1, login=1)
 		except Exception:
 			pass
+		return 'success: '
 	except IOError as e:
-		print(f'error: Cannot create a new {color} list. {e}, ')
+		return f'error: Cannot create a new {color} list. {e}, '
 
 
-def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip: str, action: str) -> None:
+def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip: str, action: str) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	list_path = f"{lib_path}/lists/{group}/{color}/{list_name}"
+	path = sql.get_setting('haproxy_dir') + "/" + color
+	servers = []
+	output = ''
+
 	try:
 		with open(list_path, "w") as file:
 			file.write(list_con)
 	except IOError as e:
-		print(f'error: Cannot save {color} list. {e}')
-
-	path = sql.get_setting('haproxy_dir') + "/" + color
-	servers = []
+		return f'error: Cannot save {color} list. {e}'
 
 	if server_ip != 'all':
 		servers.append(server_ip)
@@ -112,12 +221,12 @@ def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip
 	for serv in servers:
 		server_mod.ssh_command(serv, [f"sudo mkdir {path}"])
 		server_mod.ssh_command(serv, [f"sudo chown $(whoami) {path}"])
-		error = config_mod.upload(serv, f'{path}/{list_name}', list_path, dir='fullpath')
+		error = config_mod.upload(serv, f'{path}/{list_name}', list_path)
 
 		if error:
-			print(f'error: Upload fail: {error} , ')
+			output += f'error: Upload fail: {error} , '
 		else:
-			print(f'success: Edited {color} list was uploaded to {serv} , ')
+			output += f'success: Edited {color} list was uploaded to {serv} , '
 			try:
 				roxywi_common.logging(serv, f'Has been edited the {color} list {list_name}', roxywi=1, login=1)
 			except Exception:
@@ -135,17 +244,20 @@ def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip
 			elif action == 'reload':
 				server_mod.ssh_command(serv, [f"sudo systemctl reload {haproxy_service_name}"])
 
+	return output
 
-def delete_bwlist(list_name: str, color: str, group: str, server_ip: str) -> None:
+
+def delete_bwlist(list_name: str, color: str, group: str, server_ip: str) -> str:
 	servers = []
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	list_path = f"{lib_path}/lists/{group}/{color}/{list_name}"
 	path = f"{sql.get_setting('haproxy_dir')}/{color}"
+	output = ''
 
 	try:
 		os.remove(list_path)
 	except IOError as e:
-		print(f'error: Cannot delete {color} list from Roxy-WI server. {e} , ')
+		return f'error: Cannot delete {color} list from Roxy-WI server. {e} , '
 
 	if server_ip != 'all':
 		servers.append(server_ip)
@@ -163,27 +275,30 @@ def delete_bwlist(list_name: str, color: str, group: str, server_ip: str) -> Non
 		error = server_mod.ssh_command(serv, [f"sudo rm {path}/{list_name}"], return_err=1)
 
 		if error:
-			print(f'error: Deleting fail: {error} , ')
+			return f'error: Deleting fail: {error} , '
 		else:
-			print(f'success: the {color} list has been deleted on {serv} , ')
+			output += f'success: the {color} list has been deleted on {serv} , '
 			try:
 				roxywi_common.logging(serv, f'has been deleted the {color} list {list_name}', roxywi=1, login=1)
 			except Exception:
 				pass
+	return output
 
 
-def edit_map(map_name: str, group: str) -> None:
+def edit_map(map_name: str, group: str) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	list_path = f"{lib_path}/maps/{group}/{map_name}"
 
 	try:
 		with open(list_path, 'r') as f:
-			print(f.read())
+			read_map = f.read()
 	except IOError as e:
-		print(f"error: Cannot read {map_name} list: {e}")
+		return f"error: Cannot read {map_name} list: {e}"
+	else:
+		return read_map
 
 
-def create_map(server_ip: str, map_name: str, group: str) -> None:
+def create_map(server_ip: str, map_name: str, group: str) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	map_name = f"{map_name.split('.')[0]}.map"
 	map_path = f'{lib_path}/maps/{group}/'
@@ -195,23 +310,26 @@ def create_map(server_ip: str, map_name: str, group: str) -> None:
 		assert Exception(f'error: cannot create a local folder for maps: {e}')
 	try:
 		open(full_path, 'a').close()
-		print('success: ')
 		try:
 			roxywi_common.logging(server_ip, f'A new map {map_name} has been created', roxywi=1, login=1)
 		except Exception:
 			pass
 	except IOError as e:
 		assert Exception(f'error: Cannot create a new {map_name} map. {e}, ')
+	else:
+		return 'success: '
 
 
-def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: str) -> None:
+def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: str) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	map_path = f"{lib_path}/maps/{group}/{map_name}"
+	output = ''
+
 	try:
 		with open(map_path, "w") as file:
 			file.write(list_con)
 	except IOError as e:
-		print(f'error: Cannot save {map_name} list. {e}')
+		return f'error: Cannot save {map_name} list. {e}'
 
 	path = sql.get_setting('haproxy_dir') + "/maps"
 	servers = []
@@ -231,12 +349,11 @@ def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: s
 	for serv in servers:
 		server_mod.ssh_command(serv, [f"sudo mkdir {path}"])
 		server_mod.ssh_command(serv, [f"sudo chown $(whoami) {path}"])
-		error = config_mod.upload(serv, f'{path}/{map_name}', map_path, dir='fullpath')
+		error = config_mod.upload(serv, f'{path}/{map_name}', map_path)
 
 		if error:
-			print(f'error: Upload fail: {error} , ')
+			return f'error: Upload fail: {error} , '
 		else:
-			print(f'success: Edited {map_name} map was uploaded to {serv} , ')
 			try:
 				roxywi_common.logging(serv, f'Has been edited the map {map_name}', roxywi=1, login=1)
 			except Exception:
@@ -254,17 +371,22 @@ def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: s
 			elif action == 'reload':
 				server_mod.ssh_command(serv, [f"sudo systemctl reload {haproxy_service_name}"])
 
+			output += f'success: Edited {map_name} map was uploaded to {serv} , '
 
-def delete_map(map_name: str, group: str, server_ip: str) -> None:
+	return output
+
+
+def delete_map(map_name: str, group: str, server_ip: str) -> str:
 	servers = []
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	list_path = f"{lib_path}/maps/{group}/{map_name}"
 	path = f"{sql.get_setting('haproxy_dir')}/maps"
+	output = ''
 
 	try:
 		os.remove(list_path)
 	except IOError as e:
-		print(f'error: Cannot delete {map_name} map from Roxy-WI server. {e} , ')
+		return f'error: Cannot delete {map_name} map from Roxy-WI server. {e} , '
 
 	if server_ip != 'all':
 		servers.append(server_ip)
@@ -282,47 +404,49 @@ def delete_map(map_name: str, group: str, server_ip: str) -> None:
 		error = server_mod.ssh_command(serv, [f"sudo rm {path}/{map_name}"], return_err=1)
 
 		if error:
-			print(f'error: Deleting fail: {error} , ')
+			return f'error: Deleting fail: {error} , '
 		else:
-			print(f'success: the {map_name} map has been deleted on {serv} , ')
 			try:
 				roxywi_common.logging(serv, f'has been deleted the {map_name} map', roxywi=1, login=1)
 			except Exception:
 				pass
+			output += f'success: the {map_name} map has been deleted on {serv} , '
+
+	return output
 
 
-def create_saved_option(option: str, group: int) -> None:
+def create_saved_option(option: str, group: int) -> str:
 	if sql.insert_new_option(option, group):
-		from jinja2 import Environment, FileSystemLoader
-		env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
-		template = env.get_template('/new_option.html')
-		template = template.render(options=sql.select_options(option=option))
-		print(template)
+		return render_template('ajax/new_option.html', options=sql.select_options(option=option))
 
 
-def get_saved_option(group: str, term: str) -> None:
+def get_saved_option(group: str, term: str) -> dict:
 	options = sql.select_options(group=group, term=term)
-
 	a = {}
 	v = 0
+
 	for i in options:
 		a[v] = i.options
 		v = v + 1
 
-	print(json.dumps(a))
+	return a
 
 
-def create_saved_server(server: str, group: str, desc: str) -> None:
+def update_saved_option(option, option_id) -> bool:
+	try:
+		sql.update_options(option, option_id)
+	except Exception as e:
+		raise Exception(e)
+	else:
+		return True
+
+
+def create_saved_server(server: str, group: str, desc: str) -> str:
 	if sql.insert_new_savedserver(server, desc, group):
-		from jinja2 import Environment, FileSystemLoader
-		env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
-		template = env.get_template('/new_saved_servers.html')
-
-		template = template.render(server=sql.select_saved_servers(server=server))
-		print(template)
+		return render_template('ajax/new_saved_servers.html', server=sql.select_saved_servers(server=server))
 
 
-def get_saved_servers(group: str, term: str) -> None:
+def get_saved_servers(group: str, term: str) -> str:
 	servers = sql.select_saved_servers(group=group, term=term)
 
 	a = {}
@@ -335,10 +459,10 @@ def get_saved_servers(group: str, term: str) -> None:
 		a[v]['desc'] = i.description
 		v = v + 1
 
-	print(json.dumps(a))
+	return a
 
 
-def get_le_cert(server_ip: str, lets_domain: str, lets_email: str) -> None:
+def get_le_cert(server_ip: str, lets_domain: str, lets_email: str) -> str:
 	proxy = sql.get_setting('proxy')
 	ssl_path = common.return_nice_path(sql.get_setting('cert_path'), is_service=0)
 	haproxy_dir = sql.get_setting('haproxy_dir')
@@ -361,94 +485,90 @@ def get_le_cert(server_ip: str, lets_domain: str, lets_email: str) -> None:
 
 	if error:
 		roxywi_common.logging('Roxy-WI server', error, roxywi=1)
-		print(error)
+		return error
 	else:
 		for line in output:
 			if any(s in line for s in ("msg", "FAILED")):
 				try:
 					line = line.split(':')[1]
 					line = line.split('"')[1]
-					print(line + "<br>")
-					break
+					return line + "<br>"
 				except Exception:
-					print(output)
-					break
+					return output
 		else:
-			print('success: Certificate has been created')
-
-	os.remove(script)
+			os.remove(script)
+			return 'success: Certificate has been created'
 
 
-def get_ssl_cert(server_ip: str, cert_id: int) -> None:
+def get_ssl_cert(server_ip: str, cert_id: int) -> str:
 	cert_path = sql.get_setting('cert_path')
 	commands = [f"openssl x509 -in {cert_path}/{cert_id} -text"]
 
 	try:
-		server_mod.ssh_command(server_ip, commands, ip="1")
+		return server_mod.ssh_command(server_ip, commands)
 	except Exception as e:
-		print(f'error: Cannot connect to the server {e.args[0]}')
+		return f'error: Cannot connect to the server {e.args[0]}'
 
 
-def get_ssl_raw_cert(server_ip: str, cert_id: int) -> None:
+def get_ssl_raw_cert(server_ip: str, cert_id: int) -> str:
 	cert_path = sql.get_setting('cert_path')
 	commands = [f"cat {cert_path}/{cert_id}"]
 
 	try:
-		server_mod.ssh_command(server_ip, commands, ip="1")
+		return server_mod.ssh_command(server_ip, commands)
 	except Exception as e:
-		print(f'error: Cannot connect to the server {e.args[0]}')
+		return f'error: Cannot connect to the server {e.args[0]}'
 
 
-def get_ssl_certs(server_ip: str) -> None:
+def get_ssl_certs(server_ip: str) -> str:
 	cert_path = sql.get_setting('cert_path')
 	commands = [f"sudo ls -1t {cert_path} |grep -E 'pem|crt|key'"]
 	try:
-		server_mod.ssh_command(server_ip, commands, ip="1")
+		return server_mod.ssh_command(server_ip, commands)
 	except Exception as e:
-		print(f'error: Cannot connect to the server: {e.args[0]}')
+		return f'error: Cannot connect to the server: {e.args[0]}'
 
 
-def del_ssl_cert(server_ip: str, cert_id: str) -> None:
+def del_ssl_cert(server_ip: str, cert_id: str) -> str:
 	cert_path = sql.get_setting('cert_path')
 	commands = [f"sudo rm -f {cert_path}/{cert_id}"]
 
 	try:
-		server_mod.ssh_command(server_ip, commands, ip="1")
+		return server_mod.ssh_command(server_ip, commands)
 	except Exception as e:
-		print(f'error: Cannot delete the certificate {e.args[0]}')
+		return f'error: Cannot delete the certificate {e.args[0]}'
 
 
-def upload_ssl_cert(server_ip: str, ssl_name: str, ssl_cont: str) -> None:
+def upload_ssl_cert(server_ip: str, ssl_name: str, ssl_cont: str) -> str:
 	cert_path = sql.get_setting('cert_path')
-	name = ''
+	tmp_path = sql.get_setting('tmp_config_path')
+	slave_output = ''
 
 	if ssl_name is None:
-		print('error: Please enter a desired name')
+		return 'error: Please enter a desired name'
 	else:
 		name = f"{ssl_name}.pem"
+		path_to_file = f"{tmp_path}/{ssl_name}.pem"
 
 	try:
-		with open(name, "w") as ssl_cert:
+		with open(path_to_file, "w") as ssl_cert:
 			ssl_cert.write(ssl_cont)
 	except IOError as e:
-		print(f'error: Cannot save the SSL key file: {e.args[0]}')
-		return
+		return f'error: Cannot save the SSL key file: {e}'
 
 	masters = sql.is_master(server_ip)
 	for master in masters:
 		if master[0] is not None:
-			error = config_mod.upload(master[0], cert_path, name)
+			error = config_mod.upload(master[0], f'{cert_path}/{name}', path_to_file)
 			if not error:
-				print(f'success: the SSL file has been uploaded to {master[0]} into: {cert_path}/{name} <br/>')
+				slave_output += f'success: the SSL file has been uploaded to {master[0]} into: {cert_path}/{name} \n'
 	try:
-		error = config_mod.upload(server_ip, cert_path, name)
-		if not error:
-			print(f'success: the SSL file has been uploaded to {server_ip} into: {cert_path}/{name}')
+		error = config_mod.upload(server_ip, f'{cert_path}/{name}', path_to_file)
 	except Exception as e:
-		roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
-	# try:
-	# 	os.rename(name, cert_local_dir)
-	# except OSError as e:
-	# 	roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
+		roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
+		return f'error: cannot upload SSL cert: {e}'
 
-	roxywi_common.logging(server_ip, f"add.py#ssl uploaded a new SSL cert {name}", roxywi=1, login=1)
+	roxywi_common.logging(server_ip, f"add#ssl uploaded a new SSL cert {name}", roxywi=1, login=1)
+
+	if not error:
+		return f'success: the SSL file has been uploaded to {server_ip} into: {cert_path}/{name} \n {slave_output}'
diff --git a/app/modules/config/config.py b/app/modules/config/config.py
index fbc9e9fb..99ffb0bf 100644
--- a/app/modules/config/config.py
+++ b/app/modules/config/config.py
@@ -1,8 +1,7 @@
 import os
 import re
-import http.cookies
 
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template, request
 
 import modules.db.sql as sql
 import modules.server.ssh as mod_ssh
@@ -12,7 +11,6 @@ import modules.roxywi.common as roxywi_common
 import modules.roxy_wi_tools as roxy_wi_tools
 import modules.service.common as service_common
 
-form = common.form
 time_zone = sql.get_setting('time_zone')
 get_date = roxy_wi_tools.GetDate(time_zone)
 get_config_var = roxy_wi_tools.GetConfigVar()
@@ -28,6 +26,7 @@ def get_config(server_ip, cfg, **kwargs):
 		or kwargs.get("apache") or kwargs.get("service") == 'apache'
 	):
 		config_path = common.checkAjaxInput(kwargs.get('config_file_name'))
+		config_path = config_path.replace('92', '/')
 	elif kwargs.get("waf") or kwargs.get("service") == 'waf':
 		if kwargs.get("waf") == 'haproxy':
 			config_path = f'{sql.get_setting("haproxy_dir")}/waf/rules/{kwargs.get("waf_rule_file")}'
@@ -44,51 +43,42 @@ def get_config(server_ip, cfg, **kwargs):
 			ssh.get_sftp(config_path, cfg)
 	except Exception as e:
 		roxywi_common.logging('Roxy-WI server', f'error: cannot get config: {e}', roxywi=1)
+		raise Exception(f'error: cannot get config: {e}')
 
 
-def upload(server_ip, path, file, **kwargs):
-	full_path = path + file
-	if kwargs.get('dir') == "fullpath":
-		full_path = path
-
+def upload(server_ip, path, file):
 	try:
 		with mod_ssh.ssh_connect(server_ip) as ssh:
-			ssh.put_sftp(file, full_path)
+			ssh.put_sftp(file, path)
 	except Exception as e:
 		error = str(e.args)
-		roxywi_common.logging('Roxy-WI server', error, roxywi=1)
-		print(f' Cannot upload {file} to {full_path} to server: {server_ip} error: {error}')
-		return error
+		roxywi_common.logging('Roxy-WI server', f'error: Cannot upload {file} to {path} to server: {server_ip}: {error}', roxywi=1)
+		print(f'error: Cannot upload {file} to {path} to server: {server_ip}: {error}')
+		raise Exception(error)
 
 
-def upload_and_restart(server_ip: str, cfg: str, **kwargs):
-	error = ''
+def upload_and_restart(server_ip: str, cfg: str, just_save: str, service: str, **kwargs):
+	file_format = 'conf'
+	config_path = kwargs.get('config_file_name')
 	service_name = ''
 	container_name = ''
 	reload_or_restart_command = ''
-	file_format = 'conf'
-	config_path = kwargs.get('config_file_name')
 	config_date = get_date.return_date('config')
 	server_id = sql.select_server_id_by_ip(server_ip=server_ip)
 
-	if kwargs.get("nginx"):
-		service = 'nginx'
-	elif kwargs.get("apache"):
-		service = 'apache'
-	elif kwargs.get("keepalived"):
-		service = 'keepalived'
-		config_path = sql.get_setting('keepalived_config_path')
-		file_format = 'cfg'
-	elif kwargs.get('waf'):
-		service = 'waf'
-	else:
-		service = 'haproxy'
+	if config_path and config_path != 'undefined':
+		config_path = kwargs.get('config_file_name').replace('92', '/')
+
+	if service == 'haproxy':
 		config_path = sql.get_setting('haproxy_config_path')
 		file_format = 'cfg'
 
+	if service == 'keepalived':
+		config_path = sql.get_setting('keepalived_config_path')
+		file_format = 'cfg'
+
 	if '..' in config_path:
-		print('error: nice try')
-		return None
+		raise Exception('error: nice try')
 
 	tmp_file = f"{sql.get_setting('tmp_config_path')}/{config_date}.{file_format}"
 	is_dockerized = sql.select_service_setting(server_id, service, 'dockerized')
@@ -105,20 +95,22 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs):
 			if haproxy_enterprise == '1':
 				service_name = "hapee-2.0-lb"
 		if service == 'apache':
-			service_name = service_common.get_correct_apache_service_name(server_ip, 0)
+			service_name = service_common.get_correct_apache_service_name(0, server_id)
 
 		reload_command = f" && sudo systemctl reload {service_name}"
 		restart_command = f" && sudo systemctl restart {service_name}"
 
-	if kwargs.get("just_save") == 'save':
-		action = 'save'
-	elif kwargs.get("just_save") == 'test':
-		action = 'test'
-	elif kwargs.get("just_save") == 'reload':
+	if just_save in ('save', 'test'):
+		action = just_save
+	elif just_save == 'reload':
 		action = 'reload'
 		reload_or_restart_command = reload_command
 	else:
-		service_common.is_not_allowed_to_restart(server_id, service)
+		try:
+			service_common.is_not_allowed_to_restart(server_id, service)
+		except Exception as e:
+			return str(e)
+
 		action = 'restart'
 		reload_or_restart_command = restart_command
 
@@ -130,7 +122,7 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs):
 	try:
 		os.system(f"dos2unix -q {cfg}")
 	except OSError:
-		return 'error: there is no dos2unix'
+		raise Exception('error: there is no dos2unix')
 
 	if service == "keepalived":
 		move_config = f"sudo mv -f {tmp_file} {config_path}"
@@ -189,62 +181,68 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs):
 			commands[0] += open_port_firewalld(cfg, server_ip=server_ip)
 
 	try:
-		upload(server_ip, tmp_file, cfg, dir='fullpath')
+		upload(server_ip, tmp_file, cfg)
+	except Exception as e:
+		roxywi_common.logging('Roxy-WI server', f'error: Cannot upload config: {e}', roxywi=1)
+		raise Exception(f'error: Cannot upload config: {e}')
+
+	try:
+		if action != 'test':
+			roxywi_common.logging(server_ip, 'A new config file has been uploaded', login=login, keep_history=1, service=service)
+	except Exception as e:
+		roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
+
+	# If master then save version of config in a new way
+	if not kwargs.get('slave') and service != 'waf':
+		from pathlib import Path
+
+		diff = ''
 		try:
-			if action != 'test':
-				roxywi_common.logging(server_ip, 'A new config file has been uploaded', login=login, keep_history=1, service=service)
+			old_cfg = kwargs.get('oldcfg')
+			path = Path(old_cfg)
+		except Exception:
+			old_cfg = ''
+			path = Path(old_cfg)
+
+		if not path.is_file():
+			old_cfg = f'{tmp_file}.old'
+			try:
+				get_config(server_ip, old_cfg, service=service, config_file_name=config_path)
+			except Exception:
+				roxywi_common.logging('Roxy-WI server', 'Cannot download config for diff', roxywi=1)
+		try:
+			diff = diff_config(old_cfg, cfg, return_diff=1)
 		except Exception as e:
 			roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
 
-		# If master then save version of config in a new way
-		if not kwargs.get('slave') and service != 'waf':
-			from pathlib import Path
-
-			diff = ''
-			try:
-				old_cfg = kwargs.get('oldcfg')
-				path = Path(old_cfg)
-			except Exception:
-				old_cfg = ''
-				path = Path(old_cfg)
-
-			if not path.is_file():
-				old_cfg = f'{tmp_file}.old'
-				try:
-					get_config(server_ip, old_cfg, service=service, config_file_name=config_path)
-				except Exception:
-					roxywi_common.logging('Roxy-WI server', 'Cannot download config for diff', roxywi=1)
-			try:
-				diff = diff_config(old_cfg, cfg, return_diff=1)
-			except Exception as e:
-				roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
-
-			try:
-				user_id = roxywi_common.get_user_id(login=kwargs.get('login'))
-				sql.insert_config_version(server_id, user_id, service, cfg, config_path, diff)
-			except Exception as e:
-				roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
-	except Exception as e:
-		roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
-		return error
+		try:
+			user_id = roxywi_common.get_user_id(login=kwargs.get('login'))
+			sql.insert_config_version(server_id, user_id, service, cfg, config_path, diff)
+		except Exception as e:
+			roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
 
 	try:
 		error = server_mod.ssh_command(server_ip, commands)
-		try:
-			if action == 'reload' or action == 'restart':
-				roxywi_common.logging(server_ip, f'Service has been {action}ed', login=login, keep_history=1, service=service)
-		except Exception as e:
-			roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
 	except Exception as e:
 		roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
-		return e
+		raise Exception(f'{e}')
+
+	try:
+		if action == 'reload' or action == 'restart':
+			roxywi_common.logging(server_ip, f'Service has been {action}ed', login=login, keep_history=1, service=service)
+	except Exception as e:
+		roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
 
 	if error.strip() != 'haproxy' and error.strip() != 'nginx':
 		return error.strip()
 
 
-def master_slave_upload_and_restart(server_ip, cfg, just_save, **kwargs):
+def master_slave_upload_and_restart(server_ip, cfg, just_save, service, **kwargs):
 	slave_output = ''
+	masters = sql.is_master(server_ip)
+	config_file_name = kwargs.get('config_file_name')
+	oldcfg = kwargs.get('oldcfg')
+	waf = kwargs.get('waf')
 
 	try:
 		server_name = sql.get_hostname_by_server_ip(server_ip)
@@ -256,25 +254,25 @@ def master_slave_upload_and_restart(server_ip, cfg, just_save, **kwargs):
 	else:
 		login = ''
 
-	masters = sql.is_master(server_ip)
-
 	for master in masters:
 		if master[0] is not None:
-			slv_output = upload_and_restart(
-				master[0], cfg, just_save=just_save, nginx=kwargs.get('nginx'),
-				apache=kwargs.get('apache'), config_file_name=kwargs.get('config_file_name'), slave=1
-			)
-			slave_output += f'<br>slave_server:\n{slv_output}'
-
-	output = upload_and_restart(
-		server_ip, cfg, just_save=just_save, nginx=kwargs.get('nginx'), waf=kwargs.get('waf'),
-		apache=kwargs.get('apache'), config_file_name=kwargs.get('config_file_name'),
-		oldcfg=kwargs.get('oldcfg'), login=login
-	)
+			try:
+				slv_output = upload_and_restart(
+					master[0], cfg, just_save, service, waf=waf, config_file_name=config_file_name, slave=1
+				)
+				slave_output += f'<br>slave_server:\n{slv_output}'
+			except Exception as e:
+				return f'{e}'
+	try:
+		output = upload_and_restart(
+			server_ip, cfg, just_save, service, waf=waf, config_file_name=config_file_name, oldcfg=oldcfg, login=login
+		)
+	except Exception as e:
+		return f'{e}'
 
 	output = server_name + ':\n' + output
-
 	output = output + slave_output
+
 	return output
 
 
@@ -325,7 +323,6 @@ def open_port_firewalld(cfg, server_ip, **kwargs):
 
 
 def diff_config(oldcfg, cfg, **kwargs):
-	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 	log_path = get_config_var.get_config_var('main', 'log_path')
 	user_group = roxywi_common.get_user_group()
 	diff = ""
@@ -334,8 +331,8 @@ def diff_config(oldcfg, cfg, **kwargs):
 	cmd = "/bin/diff -ub %s %s" % (oldcfg, cfg)
 
 	try:
-		user_uuid = cookie.get('uuid')
-		login = sql.get_user_name_by_uuid(user_uuid.value)
+		user_uuid = request.cookies.get('uuid')
+		login = sql.get_user_name_by_uuid(user_uuid)
 	except Exception:
 		login = ''
 
@@ -377,164 +374,149 @@ def show_finding_in_config(stdout: str, **kwargs) -> str:
 	return out
 
 
-def show_compare_config(server_ip: str) -> None:
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-	template = env.get_template('ajax/show_compare_configs.html')
-	left = form.getvalue('left')
-	right = form.getvalue('right')
-	service = form.getvalue('service')
-	lang = roxywi_common.get_user_lang()
+def show_compare_config(server_ip: str, service: str) -> str:
+	lang = roxywi_common.get_user_lang_for_flask()
+	config_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir')
 
-	if service == 'nginx':
-		return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'nginx_save_configs_dir'), 'conf')
-	elif service == 'apache':
-		return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'apache_save_configs_dir'), 'conf')
-	elif service == 'keepalived':
-		return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'kp_save_configs_dir'), 'conf')
+	if service in ('nginx', 'apache', 'keepalived'):
+		return_files = roxywi_common.get_files(config_dir, 'conf', server_ip=server_ip)
+	elif service == 'haproxy':
+		return_files = roxywi_common.get_files(config_dir, 'cfg', server_ip=server_ip)
 	else:
-		return_files = roxywi_common.get_files()
+		return 'error: Wrong service'
 
-	template = template.render(serv=server_ip, right=right, left=left, return_files=return_files, lang=lang)
-	print(template)
+	return render_template('ajax/show_compare_configs.html', serv=server_ip, return_files=return_files, lang=lang)
 
 
-def compare_config() -> None:
-	left = common.checkAjaxInput(form.getvalue('left'))
-	right = common.checkAjaxInput(form.getvalue('right'))
-	lang = roxywi_common.get_user_lang()
+def compare_config(service: str, left: str, right: str) -> str:
+	lang = roxywi_common.get_user_lang_for_flask()
 
-	if form.getvalue('service') == 'nginx':
-		configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir')
-	elif form.getvalue('service') == 'apache':
-		configs_dir = get_config_var.get_config_var('configs', 'apache_save_configs_dir')
-	elif form.getvalue('service') == 'keepalived':
-		configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
+	if service in ('haproxy', 'nginx', 'apache', 'keepalived'):
+		configs_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir')
 	else:
-		configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
+		return 'error: Wrong service'
 
 	cmd = f'diff -pub {configs_dir}{left} {configs_dir}{right}'
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
-					  extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
-	template = env.get_template('ajax/compare.html')
-
 	output, stderr = server_mod.subprocess_execute(cmd)
-	template = template.render(stdout=output, lang=lang)
 
-	print(template)
-	print(stderr)
+	return render_template('ajax/compare.html', stdout=output, lang=lang)
 
 
-def show_config(server_ip: str) -> None:
-	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-	user_uuid = cookie.get('uuid')
-	group_id = cookie.get('group')
-	group_id = int(group_id.value)
-	role_id = sql.get_user_role_by_uuid(user_uuid.value, group_id)
-	service = form.getvalue('service')
+def show_config(server_ip: str, service: str, config_file_name: str, configver: str) -> str:
+	user_uuid = request.cookies.get('uuid')
+	group_id = int(request.cookies.get('group'))
+	role_id = sql.get_user_role_by_uuid(user_uuid, group_id)
+
 	try:
-		config_file_name = form.getvalue('config_file_name').replace('/', '92')
+		config_file_name = config_file_name.replace('/', '92')
 	except Exception:
 		config_file_name = ''
 
-	if service == 'keepalived':
-		configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
-		cfg = '.conf'
-	elif service == 'nginx':
-		configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir')
-		cfg = '.conf'
-	elif service == 'apache':
-		configs_dir = get_config_var.get_config_var('configs', 'apache_save_configs_dir')
+	if service in ('nginx', 'apache', 'keepalived'):
+		configs_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir')
 		cfg = '.conf'
 	else:
 		configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
 		cfg = '.cfg'
 
 	if '..' in configs_dir:
-		print('error: nice try')
-		return None
+		raise Exception('error: nice try')
 
-	if form.getvalue('configver') is None:
+	if configver is None:
 		cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}{cfg}"
 		try:
-			get_config(server_ip, cfg, service=service, config_file_name=form.getvalue('config_file_name'))
+			get_config(server_ip, cfg, service=service, config_file_name=config_file_name)
 		except Exception as e:
-			print(e)
-			return
+			raise Exception(e)
 	else:
-		cfg = configs_dir + form.getvalue('configver')
+		cfg = configs_dir + configver
+
 	try:
-		conf = open(cfg, "r")
-	except IOError:
-		print('<div class="alert alert-danger">Cannot read config file</div>')
+		with open(cfg, 'r') as file:
+			conf = file.readlines()
+	except Exception as e:
+		raise Exception(f'error: Cannot read config file: {e}')
+
+	if configver is None:
+		os.remove(cfg)
 
 	is_serv_protected = sql.is_serv_protected(server_ip)
 	server_id = sql.select_server_id_by_ip(server_ip)
 	hostname = sql.get_hostname_by_server_ip(server_ip)
 	is_restart = sql.select_service_setting(server_id, service, 'restart')
-	lang = roxywi_common.get_user_lang()
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, trim_blocks=True, lstrip_blocks=True,
-					  extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
-	template = env.get_template('ajax/config_show.html')
+	lang = roxywi_common.get_user_lang_for_flask()
 
-	template = template.render(conf=conf, serv=server_ip, configver=form.getvalue('configver'), role=role_id,
-							   service=service, config_file_name=config_file_name, is_serv_protected=is_serv_protected,
-							   is_restart=is_restart, lang=lang, hostname=hostname)
-	print(template)
-	conf.close()
-
-	if form.getvalue('configver') is None:
-		os.remove(cfg)
+	return render_template(
+		'ajax/config_show.html', conf=conf, serv=server_ip, configver=configver, role=role_id, service=service,
+		config_file_name=config_file_name, is_serv_protected=is_serv_protected, is_restart=is_restart, lang=lang,
+		hostname=hostname
+	)
 
 
-def show_config_files(server_ip: str) -> None:
-	service = form.getvalue('service')
+def show_config_files(server_ip: str, service: str, config_file_name: str) -> str:
 	service_config_dir = sql.get_setting(f'{service}_dir')
 	return_files = server_mod.get_remote_files(server_ip, service_config_dir, 'conf')
 
 	if 'error: ' in return_files:
-		print(return_files)
-		return
+		raise Exception(return_files)
 
 	try:
-		config_file_name = form.getvalue('config_file_name').replace('92', '/')
+		config_file_name = config_file_name.replace('92', '/')
 	except Exception:
 		config_file_name = ''
 
 	return_files += ' ' + sql.get_setting(f'{service}_config_path')
-	lang = roxywi_common.get_user_lang()
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-	template = env.get_template('ajax/show_configs_files.html')
-	template = template.render(serv=server_ip, service=service, return_files=return_files, lang=lang,
-							   config_file_name=config_file_name, path_dir=service_config_dir)
-	print(template)
+	lang = roxywi_common.get_user_lang_for_flask()
+
+	return render_template(
+		'ajax/show_configs_files.html', serv=server_ip, service=service, return_files=return_files, lang=lang,
+		config_file_name=config_file_name, path_dir=service_config_dir
+	)
 
 
-def list_of_versions(server_ip: str, service: str) -> None:
+def list_of_versions(server_ip: str, service: str, configver: str, for_delver: int) -> str:
 	if service not in ('haproxy', 'nginx', 'keepalived', 'apache'):
-		print('error: wrong service')
-		return None
+		raise Exception('error: wrong service')
 
-	configver = common.checkAjaxInput(form.getvalue('configver'))
-	for_delver = common.checkAjaxInput(form.getvalue('for_delver'))
 	users = sql.select_users()
 	service_desc = sql.select_service(service)
 	configs = sql.select_config_version(server_ip, service_desc.slug)
-	lang = roxywi_common.get_user_lang()
-	action = f'versions.py?service={service_desc.slug}'
-
-	if service in ('haproxy', 'nginx', 'apache'):
-		configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir')
-	else:
-		configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
+	lang = roxywi_common.get_user_lang_for_flask()
+	action = f'/app/config/versions/{service_desc.slug}/{server_ip}'
+	configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir')
 
 	if service == 'haproxy':
-		files = roxywi_common.get_files()
+		files = roxywi_common.get_files(configs_dir, 'cfg', server_ip)
 	else:
-		files = roxywi_common.get_files(configs_dir, 'conf')
+		files = roxywi_common.get_files(configs_dir, 'conf', server_ip)
 
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
-	template = env.get_template('ajax/show_list_version.html')
+	return render_template(
+		'ajax/show_list_version.html', server_ip=server_ip, service=service, action=action, return_files=files,
+		configver=configver, for_delver=for_delver, configs=configs, users=users, lang=lang
+	)
 
-	template = template.render(serv=server_ip, service=service, action=action, return_files=files, configver=configver,
-							   for_delver=for_delver, configs=configs, users=users, lang=lang)
-	print(template)
+
+def return_cfg(service: str, server_ip: str, config_file_name: str) -> str:
+	if service == 'haproxy':
+		file_format = 'cfg'
+	else:
+		file_format = 'conf'
+
+	if service in ('haproxy', 'nginx', 'apache', 'keepalived'):
+		configs_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir')
+	else:
+		raise Exception('error: Wrong service')
+
+	if service in ('nginx', 'apache'):
+		config_file_name = config_file_name.replace('92', '/')
+		conf_file_name_short = config_file_name.split('/')[-1]
+		cfg = f"{configs_dir}{server_ip}-{conf_file_name_short}-{get_date.return_date('config')}.{file_format}"
+	else:
+		cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}.{file_format}"
+
+	try:
+		os.system(f"/bin/rm -f {configs_dir}*.old")
+	except Exception:
+		pass
+
+	return cfg
diff --git a/app/modules/config/runtime.py b/app/modules/config/runtime.py
index 99365887..2b7df89a 100644
--- a/app/modules/config/runtime.py
+++ b/app/modules/config/runtime.py
@@ -1,49 +1,47 @@
 import json
 
+from flask import render_template
+
 import modules.db.sql as sql
-import modules.common.common as common
 import modules.config.config as config_mod
 import modules.server.server as server_mod
 import modules.roxywi.common as roxywi_common
 import modules.roxy_wi_tools as roxy_wi_tools
 
-form = common.form
-serv = common.is_ip_or_dns(form.getvalue('serv'))
 time_zone = sql.get_setting('time_zone')
 get_date = roxy_wi_tools.GetDate(time_zone)
 get_config_var = roxy_wi_tools.GetConfigVar()
 
 
-def show_frontend_backend() -> None:
+def show_frontend_backend(serv: str, backend: str) -> str:
 	haproxy_sock_port = int(sql.get_setting('haproxy_sock_port'))
-	backend = common.checkAjaxInput(form.getvalue('ipbackend'))
 	cmd = 'echo "show servers state"|nc %s %s |grep "%s" |awk \'{print $4}\'' % (serv, haproxy_sock_port, backend)
 	output, stderr = server_mod.subprocess_execute(cmd)
+	lines = ''
 	for i in output:
 		if i == ' ':
 			continue
 		i = i.strip()
-		print(i + '<br>')
+		lines += i + '<br>'
+	return lines
 
 
-def show_server() -> None:
+def show_server(serv: str, backend: str, backend_server: str) -> str:
 	haproxy_sock_port = int(sql.get_setting('haproxy_sock_port'))
-	backend = common.checkAjaxInput(form.getvalue('ipbackend'))
-	backend_server = common.checkAjaxInput(form.getvalue('backend_server'))
 	cmd = 'echo "show servers state"|nc %s %s |grep "%s" |grep "%s" |awk \'{print $5":"$19}\' |head -1' % (
 		serv, haproxy_sock_port, backend, backend_server)
 	output, stderr = server_mod.subprocess_execute(cmd)
-	print(output[0])
+	return output[0]
 
 
-def get_all_stick_table():
+def get_all_stick_table(serv: str):
 	hap_sock_p = sql.get_setting('haproxy_sock_port')
 	cmd = 'echo "show table"|nc %s %s |awk \'{print $3}\' | tr -d \'\n\' | tr -d \'[:space:]\'' % (serv, hap_sock_p)
 	output, stderr = server_mod.subprocess_execute(cmd)
 	return output[0]
 
 
-def get_stick_table(table):
+def get_stick_table(serv: str, table: str):
 	hap_sock_p = sql.get_setting('haproxy_sock_port')
 	cmd = 'echo "show table %s"|nc %s %s |awk -F"#" \'{print $2}\' |head -1 | tr -d \'\n\'' % (table, serv, hap_sock_p)
 	output, stderr = server_mod.subprocess_execute(cmd)
@@ -62,6 +60,7 @@ def show_backends(server_ip, **kwargs):
 	hap_sock_p = sql.get_setting('haproxy_sock_port')
 	cmd = f'echo "show backend" |nc {server_ip} {hap_sock_p}'
 	output, stderr = server_mod.subprocess_execute(cmd)
+	lines = ''
 	if stderr:
 		roxywi_common.logging('Roxy-WI server', ' ' + stderr, roxywi=1)
 	if kwargs.get('ret'):
@@ -76,16 +75,19 @@ def show_backends(server_ip, **kwargs):
 			if kwargs.get('ret'):
 				ret.append(back[1])
 			else:
-				print(back[1], end="<br>")
+				lines += back[1] + "<br>"
 
 	if kwargs.get('ret'):
 		return ret
 
+	return lines
 
-def get_backends_from_config(server_ip: str, backends='') -> None:
+
+def get_backends_from_config(server_ip: str, backends='') -> str:
 	config_date = get_date.return_date('config')
 	configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
 	format_cfg = 'cfg'
+	lines = ''
 
 	try:
 		cfg = configs_dir + roxywi_common.get_files(configs_dir, format_cfg)[0]
@@ -93,39 +95,34 @@ def get_backends_from_config(server_ip: str, backends='') -> None:
 		roxywi_common.logging('Roxy-WI server', str(e), roxywi=1)
 		try:
 			cfg = f'{configs_dir}{server_ip}-{config_date}.{format_cfg}'
-		except Exception:
-			roxywi_common.logging('Roxy-WI server', ' Cannot generate cfg path', roxywi=1)
-			return
+		except Exception as e:
+			roxywi_common.logging('Roxy-WI server', f'error: Cannot generate cfg path: {e}', roxywi=1)
+			return f'error: Cannot generate cfg path: {e}'
 		try:
 			config_mod.get_config(server_ip, cfg)
-		except Exception:
-			roxywi_common.logging('Roxy-WI server', ' Cannot download config', roxywi=1)
-			print('error: Cannot get backends')
-			return
+		except Exception as e:
+			roxywi_common.logging('Roxy-WI server', f'error: Cannot download config: {e}', roxywi=1)
+			return f'error: Cannot download config: {e}'
 
 	with open(cfg, 'r') as f:
 		for line in f:
 			if backends == 'frontend':
 				if (line.startswith('listen') or line.startswith('frontend')) and 'stats' not in line:
 					line = line.strip()
-					print(line.split(' ')[1], end="<br>")
+					lines += line.split(' ')[1] + '<br>'
+
+	return lines
 
 
-def change_ip_and_port() -> None:
-	backend_backend = common.checkAjaxInput(form.getvalue('backend_backend'))
-	backend_server = common.checkAjaxInput(form.getvalue('backend_server'))
-	backend_ip = common.checkAjaxInput(form.getvalue('backend_ip'))
-	backend_port = common.checkAjaxInput(form.getvalue('backend_port'))
+def change_ip_and_port(serv, backend_backend, backend_server, backend_ip, backend_port) -> str:
+	if backend_ip is None:
+		return 'error: Backend IP must be IP and not 0'
 
-	if form.getvalue('backend_ip') is None:
-		print('error: Backend IP must be IP and not 0')
-		return
-
-	if form.getvalue('backend_port') is None:
-		print('error: The backend port must be integer and not 0')
-		return
+	if backend_port is None:
+		return 'error: The backend port must be integer and not 0'
 
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
+	lines = ''
 
 	masters = sql.is_master(serv)
 	for master in masters:
@@ -133,7 +130,7 @@ def change_ip_and_port() -> None:
 			cmd = 'echo "set server %s/%s addr %s port %s check-port %s" |nc %s %s' % (
 				backend_backend, backend_server, backend_ip, backend_port, backend_port, master[0], haproxy_sock_port)
 			output, stderr = server_mod.subprocess_execute(cmd)
-			print(output[0])
+			lines += output[0]
 			roxywi_common.logging(
 				master[0], 'IP address and port have been changed. On: {}/{} to {}:{}'.format(
 					backend_backend, backend_server, backend_ip, backend_port
@@ -151,9 +148,9 @@ def change_ip_and_port() -> None:
 	output, stderr = server_mod.subprocess_execute(cmd)
 
 	if stderr != '':
-		print('error: ' + stderr[0])
+		lines += 'error: ' + stderr[0]
 	else:
-		print(output[0])
+		lines += output[0]
 		configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
 		cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg"
 
@@ -162,15 +159,16 @@ def change_ip_and_port() -> None:
 			  '&& sed -Ei "$( echo $string)s/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]):[0-9]+/%s:%s/g" %s' % \
 			  (backend_backend, cfg, backend_server, backend_ip, backend_port, cfg)
 		server_mod.subprocess_execute(cmd)
-		config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save')
+		config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy')
+
+	return lines
 
 
-def change_maxconn_global() -> None:
-	if form.getvalue('maxconn_global') is None:
-		print('error: Maxconn must be integer and not 0')
-		return
+def change_maxconn_global(serv: str, maxconn: int) -> str:
+	if maxconn is None:
+		return 'error: Maxconn must be integer and not 0'
+
 
-	maxconn = common.checkAjaxInput(form.getvalue('maxconn_global'))
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
 	masters = sql.is_master(serv)
 
@@ -181,12 +179,11 @@ def change_maxconn_global() -> None:
 		roxywi_common.logging(master[0], f'Maxconn has been changed. Globally to {maxconn}', login=1, keep_history=1, service='haproxy')
 
 	cmd = f'echo "set maxconn global {maxconn}" |nc {serv} {haproxy_sock_port}'
-	print(cmd)
 	roxywi_common.logging(serv, f'Maxconn has been changed. Globally to {maxconn}', login=1, keep_history=1, service='haproxy')
 	output, stderr = server_mod.subprocess_execute(cmd)
 
 	if stderr != '':
-		print(stderr[0])
+		return stderr[0]
 	elif output[0] == '':
 		configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
 		cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg"
@@ -195,19 +192,16 @@ def change_maxconn_global() -> None:
 		cmd = 'string=`grep global %s -n -A5 |grep maxcon -n |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \
 			  '&& sed -Ei "$( echo $string)s/[0-9]+/%s/g" %s' % (cfg, maxconn, cfg)
 		server_mod.subprocess_execute(cmd)
-		config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save')
-		print(f'success: Maxconn globally has been set to {maxconn} ')
+		config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy')
+		return f'success: Maxconn globally has been set to {maxconn} '
 	else:
-		print(f'error: {output[0]}')
+		return f'error: {output[0]}'
 
 
-def change_maxconn_frontend() -> None:
-	if form.getvalue('maxconn_int') is None:
-		print('error: Maxconn must be integer and not 0')
-		return
+def change_maxconn_frontend(serv, maxconn, frontend) -> str:
+	if maxconn is None:
+		return 'error: Maxconn must be integer and not 0'
 
-	frontend = common.checkAjaxInput(form.getvalue('maxconn_frontend'))
-	maxconn = common.checkAjaxInput(form.getvalue('maxconn_int'))
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
 	masters = sql.is_master(serv)
 
@@ -222,7 +216,7 @@ def change_maxconn_frontend() -> None:
 	output, stderr = server_mod.subprocess_execute(cmd)
 
 	if stderr != '':
-		print(stderr[0])
+		return stderr[0]
 	elif output[0] == '':
 		configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
 		cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg"
@@ -231,20 +225,16 @@ def change_maxconn_frontend() -> None:
 		cmd = 'string=`grep %s %s -n -A5 |grep maxcon -n |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \
 			  '&& sed -Ei "$( echo $string)s/[0-9]+/%s/g" %s' % (frontend, cfg, maxconn, cfg)
 		server_mod.subprocess_execute(cmd)
-		config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save')
-		print(f'success: Maxconn for {frontend} has been set to {maxconn} ')
+		config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy')
+		return f'success: Maxconn for {frontend} has been set to {maxconn} '
 	else:
-		print(f'error: {output[0]}')
+		return f'error: {output[0]}'
 
 
-def change_maxconn_backend() -> None:
-	if form.getvalue('maxconn_int') is None:
-		print('error: Maxconn must be integer and not 0')
-		return
+def change_maxconn_backend(serv, backend, backend_server, maxconn) -> str:
+	if maxconn is None:
+		return 'error: Maxconn must be integer and not 0'
 
-	backend = common.checkAjaxInput(form.getvalue('maxconn_backend'))
-	backend_server = common.checkAjaxInput(form.getvalue('maxconn_backend_server'))
-	maxconn = common.checkAjaxInput(form.getvalue('maxconn_int'))
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
 
 	masters = sql.is_master(serv)
@@ -255,12 +245,11 @@ def change_maxconn_backend() -> None:
 		roxywi_common.logging(master[0], f'Maxconn has been changed. On: {backend}/{backend_server} to {maxconn}', login=1, keep_history=1, service='haproxy')
 
 	cmd = f'echo "set maxconn server {backend}/{backend_server} {maxconn}" |nc {serv} {haproxy_sock_port}'
-	print(cmd)
 	roxywi_common.logging(serv, f'Maxconn has been changed. On: {backend} to {maxconn}', login=1, keep_history=1, service='haproxy')
 	output, stderr = server_mod.subprocess_execute(cmd)
 
 	if stderr != '':
-		print(stderr[0])
+		return stderr[0]
 	elif output[0] == '':
 		configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
 		cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg"
@@ -269,180 +258,169 @@ def change_maxconn_backend() -> None:
 		cmd = 'string=`grep %s %s -n -A10 |grep maxcon -n|grep %s |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \
 			  '&& sed -Ei "$( echo $string)s/maxconn [0-9]+/maxconn %s/g" %s' % (backend, cfg, backend_server, maxconn, cfg)
 		server_mod.subprocess_execute(cmd)
-		config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save')
-		print(f'success: Maxconn for {backend}/{backend_server} has been set to {maxconn} ')
+		config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy')
+		return f'success: Maxconn for {backend}/{backend_server} has been set to {maxconn} '
 	else:
-		print(f'error: {output[0]}')
+		return f'error: {output[0]}'
 
 
-def table_select():
-	from jinja2 import Environment, FileSystemLoader
-	env = Environment(loader=FileSystemLoader('templates'), autoescape=True,
-					  extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True)
-	table = form.getvalue('table_select')
-	lang = roxywi_common.get_user_lang()
+def table_select(serv: str, table: str):
+	lang = roxywi_common.get_user_lang_for_flask()
 
 	if table == 'All':
-		template = env.get_template('ajax/stick_tables.html')
-		tables = get_all_stick_table()
+		tables = get_all_stick_table(serv)
 		table = []
 		for t in tables.split(','):
 			if t != '':
 				table_id = []
-				tables_head1, table1 = get_stick_table(t)
+				tables_head1, table1 = get_stick_table(serv, t)
 				table_id.append(tables_head1)
 				table_id.append(table1)
 				table.append(table_id)
 
-		template = template.render(table=table, lang=lang)
+		return render_template('ajax/stick_tables.html', table=table, lang=lang)
 	else:
-		template = env.get_template('ajax/stick_table.html')
-		tables_head, table = get_stick_table(table)
-		template = template.render(tables_head=tables_head, table=table, lang=lang)
-
-	print(template)
+		tables_head, table = get_stick_table(serv, table)
+		return render_template('ajax/stick_table.html', tables_head=tables_head, table=table, lang=lang)
 
 
-def delete_ip_from_stick_table() -> None:
+def delete_ip_from_stick_table(serv, ip, table) -> str:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
-	ip = common.checkAjaxInput(form.getvalue('ip_for_delete'))
-	table = common.checkAjaxInput(form.getvalue('table_for_delete'))
 
 	cmd = f'echo "clear table {table} key {ip}" |nc {serv} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
-	if stderr[0] != '':
-		print(f'error: {stderr[0]}')
+	try:
+		if stderr[0] != '':
+			return f'error: {stderr[0]}'
+	except Exception:
+		return 'ok'
 
 
-def clear_stick_table() -> None:
+def clear_stick_table(serv, table) -> str:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
-	table = common.checkAjaxInput(form.getvalue('table_for_clear'))
 
 	cmd = f'echo "clear table {table} " |nc {serv} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
-	if stderr[0] != '':
-		print(f'error: {stderr[0]}')
+	try:
+		if stderr[0] != '':
+			return f'error: {stderr[0]}'
+	except Exception:
+		return 'ok'
 
 
-def list_of_lists() -> None:
+def list_of_lists(serv) -> str:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
 	cmd = f'echo "show acl"|nc {serv} {haproxy_sock_port} |grep "loaded from" |awk \'{{print $1,$2}}\''
 	output, stderr = server_mod.subprocess_execute(cmd)
-	print(output)
+	try:
+		return output[0]
+	except Exception:
+		return '------'
 
 
-def show_lists() -> None:
-	from jinja2 import Environment, FileSystemLoader
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
-						extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True)
-	template = env.get_template('ajax/list.html')
-	list_id = common.checkAjaxInput(form.getvalue('list_select_id'))
-	list_name = common.checkAjaxInput(form.getvalue('list_select_name'))
-
+def show_lists(serv, list_id, list_name) -> None:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
 	cmd = f'echo "show acl #{list_id}"|nc {serv} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
 
-	template = template.render(list=output, list_id=list_id, list_name=list_name)
-	print(template)
+	return render_template('ajax/list.html', list=output, list_id=list_id, list_name=list_name)
 
 
-def delete_ip_from_list() -> None:
+def delete_ip_from_list(serv, ip_id, ip, list_id, list_name) -> str:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
 	lib_path = get_config_var.get_config_var('main', 'lib_path')
-	ip_id = common.checkAjaxInput(form.getvalue('list_ip_id_for_delete'))
-	ip = common.is_ip_or_dns(form.getvalue('list_ip_for_delete'))
-	list_id = common.checkAjaxInput(form.getvalue('list_id_for_delete'))
-	list_name = common.checkAjaxInput(form.getvalue('list_name'))
 	user_group = roxywi_common.get_user_group(id=1)
 	cmd = f"sed -i 's!{ip}$!!' {lib_path}/lists/{user_group}/{list_name}"
 	cmd1 = f"sed -i '/^$/d' {lib_path}/lists/{user_group}/{list_name}"
 	output, stderr = server_mod.subprocess_execute(cmd)
 	output1, stderr1 = server_mod.subprocess_execute(cmd1)
 	if output:
-		print(f'error: {output}')
+		return f'error: {output}'
 	if stderr:
-		print(f'error: {stderr}')
+		return f'error: {stderr}'
 	if output1:
-		print(f'error: {output1}')
+		return f'error: {output1}'
 	if stderr1:
-		print(f'error: {stderr}')
+		return f'error: {stderr}'
 
 	cmd = f'echo "del acl #{list_id} #{ip_id}" |nc {serv} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
-	if output[0] != '':
-		print(f'error: {output[0]}')
-	if stderr != '':
-		print(f'error: {stderr[0]}')
 
 	roxywi_common.logging(serv, f'{ip_id} has been delete from list {list_id}', login=1, keep_history=1, service='haproxy')
+	try:
+		if output[0] != '':
+			return f'error: {output[0]}'
+	except Exception:
+		pass
+	try:
+		if stderr != '':
+			return f'error: {stderr[0]}'
+	except Exception:
+		pass
 
 
-def add_ip_to_list() -> None:
+def add_ip_to_list(serv, ip, list_id, list_name) -> str:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
-	lib_path = get_config_var.get_config_var('main', 'lib_path')
-	ip = form.getvalue('list_ip_for_add')
-	ip = ip.strip()
-	ip = common.is_ip_or_dns(ip)
-	list_id = common.checkAjaxInput(form.getvalue('list_id_for_add'))
-	list_name = common.checkAjaxInput(form.getvalue('list_name'))
 	user_group = roxywi_common.get_user_group(id=1)
 	cmd = f'echo "add acl #{list_id} {ip}" |nc {serv} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
-	if output[0]:
-		print(f'error: {output[0]}')
-	if stderr:
-		print(f'error: {stderr[0]}')
+	try:
+		if output[0]:
+			return f'error: {output[0]}'
+	except Exception:
+		pass
+	try:
+		if stderr:
+			print(f'error: {stderr[0]}')
+	except Exception:
+		pass
 
 	if 'is not a valid IPv4 or IPv6 address' not in output[0]:
 		cmd = f'echo "{ip}" >> {lib_path}/lists/{user_group}/{list_name}'
 		output, stderr = server_mod.subprocess_execute(cmd)
+		roxywi_common.logging(serv, f'{ip} has been added to list {list_id}', login=1, keep_history=1, service='haproxy')
 		if output:
-			print(f'error: {output}')
+			return f'error: {output}'
 		if stderr:
-			print(f'error: {stderr}')
-
-	roxywi_common.logging(serv, f'{ip} has been added to list {list_id}', login=1, keep_history=1, service='haproxy')
+			return f'error: {stderr}'
 
 
-def select_session() -> None:
-	from jinja2 import Environment, FileSystemLoader
-	env = Environment(loader=FileSystemLoader('templates'), autoescape=True,
-						extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True)
-	session = common.checkAjaxInput(form.getvalue('sessions_select'))
-	lang = roxywi_common.get_user_lang()
+def select_session(server_ip: str) -> str:
+	lang = roxywi_common.get_user_lang_for_flask()
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
-
-	cmd = f'echo "show sess" |nc {session} {haproxy_sock_port}'
+	cmd = f'echo "show sess" |nc {server_ip} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
 
-	template = env.get_template('ajax/sessions_table.html')
-	template = template.render(sessions=output, lang=lang)
-
-	print(template)
+	return render_template('ajax/sessions_table.html', sessions=output, lang=lang)
 
 
-def show_session() -> None:
-	session = common.checkAjaxInput(form.getvalue('sessions_select_show'))
-	sess_id = common.checkAjaxInput(form.getvalue('sessions_select_id'))
+def show_session(server_ip, sess_id) -> str:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
-	cmd = f'echo "show sess {sess_id}" |nc {session} {haproxy_sock_port}'
-
+	cmd = f'echo "show sess {sess_id}" |nc {server_ip} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
+	lines = ''
 
 	if stderr:
-		print('error: ' + stderr[0])
+		return 'error: ' + stderr[0]
 	else:
 		for o in output:
-			print(f'{o}<br />')
+			lines += f'{o}<br />'
+		return lines
 
 
-def delete_session() -> None:
+def delete_session(server_ip, sess_id) -> str:
 	haproxy_sock_port = sql.get_setting('haproxy_sock_port')
-	sess_id = common.checkAjaxInput(form.getvalue('session_delete_id'))
-	cmd = 'echo "shutdown session %s" |nc %s %s' % (sess_id, serv, haproxy_sock_port)
+	cmd = f'echo "shutdown session {sess_id}" |nc {server_ip} {haproxy_sock_port}'
 	output, stderr = server_mod.subprocess_execute(cmd)
-	if output[0] != '':
-		print('error: ' + output[0])
-	if stderr[0] != '':
-		print('error: ' + stderr[0])
+	try:
+		if output[0] != '':
+			return 'error: ' + output[0]
+	except Exception:
+		pass
+	try:
+		if stderr[0] != '':
+			return 'error: ' + stderr[0]
+	except Exception:
+		pass
+
+	return 'ok'
diff --git a/app/modules/db/db_model.py b/app/modules/db/db_model.py
index 01324df6..ee028beb 100644
--- a/app/modules/db/db_model.py
+++ b/app/modules/db/db_model.py
@@ -1,6 +1,7 @@
 from peewee import *
 from playhouse.migrate import *
 from datetime import datetime
+from flask_login import UserMixin
 
 import modules.roxy_wi_tools as roxy_wi_tools
 
@@ -26,7 +27,7 @@ class BaseModel(Model):
         database = conn
 
 
-class User(BaseModel):
+class User(BaseModel, UserMixin):
     user_id = AutoField(column_name='id')
     username = CharField(constraints=[SQL('UNIQUE')])
     email = CharField(constraints=[SQL('UNIQUE')])
@@ -354,66 +355,6 @@ class PortScannerHistory(BaseModel):
         primary_key = False
 
 
-class ProvidersCreds(BaseModel):
-    id = AutoField()
-    name = CharField()
-    type = CharField()
-    group = CharField()
-    key = CharField()
-    secret = CharField(null=True)
-    create_date = DateTimeField(default=datetime.now)
-    edit_date = DateTimeField(default=datetime.now)
-
-    class Meta:
-        table_name = 'providers_creds'
-
-
-class ProvisionParam(BaseModel):
-    id = AutoField()
-    param = CharField()
-    name = CharField()
-    optgroup = CharField()
-    section = CharField()
-    provider = CharField()
-    image = CharField(null=True)
-
-    class Meta:
-        table_name = 'provision_param'
-        constraints = [SQL('UNIQUE (param, section, provider)')]
-
-
-class ProvisionedServers(BaseModel):
-    id = AutoField()
-    region = CharField()
-    instance_type = CharField()
-    public_ip = IntegerField(null=True)
-    floating_ip = IntegerField(null=True)
-    volume_size = IntegerField(null=True)
-    backup = IntegerField(null=True)
-    monitoring = IntegerField(null=True)
-    private_networking = IntegerField(null=True)
-    ssh_key_name = CharField(null=True)
-    ssh_ids = CharField(null=True)
-    name = CharField()
-    os = CharField()
-    firewall = IntegerField()
-    provider_id = IntegerField()
-    type = CharField()
-    status = CharField()
-    group_id = IntegerField()
-    date = DateTimeField(default=datetime.now)
-    IP = CharField(null=True)
-    last_error = CharField(null=True)
-    delete_on_termination = IntegerField(null=True)
-    project = CharField(null=True)
-    network_name = CharField(null=True)
-    volume_type = CharField(null=True)
-    name_template = CharField(null=True)
-
-    class Meta:
-        table_name = 'provisioned_servers'
-
-
 class MetricsHttpStatus(BaseModel):
     serv = CharField()
     ok_ans = IntegerField(column_name='2xx')
@@ -679,8 +620,7 @@ def create_tables():
     with conn:
         conn.create_tables([User, Server, Role, Telegram, Slack, UUID, Token, ApiToken, Groups, UserGroups, ConfigVersion,
                             Setting, Cred, Backup, Metrics, WafMetrics, Version, Option, SavedServer, Waf, ActionHistory,
-                            PortScannerSettings, PortScannerPorts, PortScannerHistory, ProvidersCreds, ServiceSetting,
-                            ProvisionedServers, MetricsHttpStatus, SMON, WafRules, Alerts, GeoipCodes, NginxMetrics,
-                            SystemInfo, Services, UserName, GitSetting, CheckerSetting, ApacheMetrics, ProvisionParam,
-                            WafNginx, ServiceStatus, KeepaliveRestart, PD, SmonHistory, SmonTcpCheck, SmonHttpCheck,
-                            SmonPingCheck, SmonDnsCheck, S3Backup])
+                            PortScannerSettings, PortScannerPorts, PortScannerHistory, ServiceSetting, MetricsHttpStatus,
+                            SMON, WafRules, Alerts, GeoipCodes, NginxMetrics, SystemInfo, Services, UserName, GitSetting,
+                            CheckerSetting, ApacheMetrics, WafNginx, ServiceStatus, KeepaliveRestart, PD, SmonHistory,
+                            SmonTcpCheck, SmonHttpCheck, SmonPingCheck, SmonDnsCheck, S3Backup])
diff --git a/app/modules/db/sql.py b/app/modules/db/sql.py
index 5df0052e..07b30473 100755
--- a/app/modules/db/sql.py
+++ b/app/modules/db/sql.py
@@ -1,13 +1,23 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
-import traceback
-import sys
 import os
+import sys
+import traceback
 
 from modules.db.db_model import *
 import modules.roxy_wi_tools as roxy_wi_tools
 
 
+def out_error(error):
+	error = str(error)
+	exc_type, exc_obj, exc_tb = sys.exc_info()
+	file_name = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
+	stk = traceback.extract_tb(exc_tb, 1)
+	function_name = stk[0][2]
+	error = f'{error} in function: {function_name} in file: {file_name}'
+	raise Exception(f'error: {error}')
+
+
 def get_setting(param, **kwargs):
 	import http.cookies
 
@@ -59,16 +69,6 @@ time_zone = get_setting('time_zone')
 get_date = roxy_wi_tools.GetDate(time_zone)
 
 
-def out_error(error):
-	error = str(error)
-	exc_type, exc_obj, exc_tb = sys.exc_info()
-	file_name = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
-	stk = traceback.extract_tb(exc_tb, 1)
-	function_name = stk[0][2]
-	error = f'{error} in function: {function_name} in file: {file_name}'
-	raise Exception(f'error: {error}')
-
-
 def add_user(user, email, password, role, activeuser, group):
 	if password != 'aduser':
 		try:
@@ -702,21 +702,13 @@ def delete_old_uuid():
 		out_error(e)
 
 
-def update_last_act_user(uuid, token):
+def update_last_act_user(uuid: str, token: str, ip: str) -> None:
 	session_ttl = int(get_setting('session_ttl'))
 	token_ttl = int(get_setting('token_ttl'))
 	cur_date_session = get_date.return_date('regular', timedelta=session_ttl)
 	cur_date_token = get_date.return_date('regular', timedelta=token_ttl)
 	cur_date = get_date.return_date('regular')
 	user_id = get_user_id_by_uuid(uuid)
-
-	try:
-		import cgi
-		import os
-		ip = cgi.escape(os.environ["REMOTE_ADDR"])
-	except Exception:
-		ip = ''
-
 	query = UUID.update(exp=cur_date_session).where(UUID.uuid == uuid)
 	query1 = Token.update(exp=cur_date_token).where(Token.token == token)
 	query2 = User.update(last_login_date=cur_date, last_login_ip=ip).where(User.user_id == user_id)
@@ -767,6 +759,7 @@ def get_user_role_by_uuid(uuid, group_id):
 			(UserGroups.user_group_id == group_id)
 		)
 	)
+
 	try:
 		query_res = query.execute()
 	except Exception as e:
@@ -866,19 +859,7 @@ def get_pd_by_id(pd_id):
 		return query_res
 
 
-def get_dick_permit(**kwargs):
-	if kwargs.get('username'):
-		grp = kwargs.get('group_id')
-	else:
-		try:
-			import http.cookies
-			cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-			group = cookie.get('group')
-			grp = group.value
-		except Exception:
-			print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
-			return
-
+def get_dick_permit(group_id, **kwargs):
 	only_group = kwargs.get('only_group')
 	disable = 'enable = 1'
 	haproxy = ''
@@ -907,21 +888,15 @@ def get_dick_permit(**kwargs):
 	cursor = conn.cursor()
 	try:
 		if mysql_enable == '1':
-			if grp == '1' and not only_group:
-				sql = """ select * from `servers` where {} {} {} {} {} {} {} order by `pos` asc""".format(
-					disable, type_ip, nginx, haproxy, keepalived, apache, ip
-				)
+			if group_id == '1' and not only_group:
+				sql = f" select * from `servers` where {disable} {type_ip} {nginx} {haproxy} {keepalived} {apache} {ip} order by `pos` asc"
 			else:
-				sql = """ select * from `servers` where `groups` = {group} and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by `pos` asc
-				""".format(
-					group=grp, disable=disable, type_ip=type_ip, ip=ip, haproxy=haproxy, nginx=nginx, keepalived=keepalived, apache=apache
-				)
+				sql = f" select * from `servers` where `groups` = {group_id} and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by `pos` asc"
 		else:
-			if grp == '1' and not only_group:
-				sql = """ select * from servers where {} {} {} {} {} {} {} order by pos""".format(disable, type_ip, nginx, haproxy, keepalived, apache, ip)
+			if group_id == '1' and not only_group:
+				sql = f" select * from servers where {disable} {type_ip} {nginx} {haproxy} {keepalived} {apache} {ip} order by pos"
 			else:
-				sql = """ select * from servers where groups = '{group}' and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by pos
-				""".format(group=grp, disable=disable, type_ip=type_ip, ip=ip, haproxy=haproxy, nginx=nginx, keepalived=keepalived, apache=apache)
+				sql = f" select * from servers where groups = '{group_id}' and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by pos"
 
 	except Exception as e:
 		raise Exception(f'error: {e}')
@@ -1737,6 +1712,8 @@ def update_waf_metrics_enable(name, enable):
 		Waf.update(metrics=enable).where(Waf.server_id == server_id).execute()
 	except Exception as e:
 		out_error(e)
+	else:
+		return 'ok'
 
 
 def delete_metrics():
@@ -2492,14 +2469,14 @@ def update_firewall(serv):
 		return False
 
 
-def update_server_pos(pos, server_id):
+def update_server_pos(pos, server_id) -> str:
 	query = Server.update(pos=pos).where(Server.server_id == server_id)
 	try:
 		query.execute()
-		return True
+		return 'ok'
 	except Exception as e:
 		out_error(e)
-		return False
+		return 'not_ok'
 
 
 def check_token_exists(token):
@@ -2915,6 +2892,7 @@ def select_one_smon(smon_id: int, check_id: int) -> object:
 		query = SmonDnsCheck.select(SmonDnsCheck, SMON).join_from(SmonDnsCheck, SMON).where(SMON.id == smon_id)
 	else:
 		query = SmonPingCheck.select(SmonPingCheck, SMON).join_from(SmonPingCheck, SMON).where(SMON.id == smon_id)
+
 	try:
 		query_res = query.execute()
 	except Exception as e:
@@ -3345,300 +3323,6 @@ def delete_provider(provider_id):
 		return False
 
 
-def add_server_aws(
-	region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall,
-	provider_id, group_id, status, delete_on_termination, volume_type
-):
-	cur_date = get_date.return_date('regular')
-	try:
-		ProvisionedServers.insert(
-			region=region, instance_type=instance_type, public_ip=public_ip, floating_ip=floating_ip,
-			volume_size=volume_size, volume_type=volume_type, ssh_key_name=ssh_key_name, name=name, os=os,
-			firewall=firewall, provider_id=provider_id, group_id=group_id, delete_on_termination=delete_on_termination,
-			type='aws', status=status, date=cur_date
-		).execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def add_server_gcore(
-	project, region, instance_type, network_type, network_name, volume_size, ssh_key_name, name, os,
-	firewall, provider_id, group_id, status, delete_on_termination, volume_type
-):
-	cur_date = get_date.return_date('regular')
-	try:
-		ProvisionedServers.insert(
-			region=region, instance_type=instance_type, public_ip=network_type, network_name=network_name,
-			volume_size=volume_size, volume_type=volume_type, ssh_key_name=ssh_key_name, name=name,
-			os=os, firewall=firewall, provider_id=provider_id, group_id=group_id, type='gcore',
-			delete_on_termination=delete_on_termination, project=project, status=status, date=cur_date
-		).execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def add_server_do(
-	region, size, privet_net, floating_ip, ssh_ids, ssh_key_name, name, oss, firewall, monitoring, backup,
-	provider_id, group_id, status
-):
-	cur_date = get_date.return_date('regular')
-	try:
-		ProvisionedServers.insert(
-			region=region, instance_type=size, private_networking=privet_net, floating_ip=floating_ip,
-			ssh_ids=ssh_ids, ssh_key_name=ssh_key_name, name=name, os=oss, firewall=firewall,
-			monitoring=monitoring, backup=backup, provider_id=provider_id, group_id=group_id,
-			type='do', status=status, date=cur_date
-		).execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def select_aws_server(server_id):
-	prov_serv = ProvisionedServers.alias()
-	query = (
-		prov_serv.select(
-			prov_serv.region, prov_serv.instance_type, prov_serv.public_ip, prov_serv.floating_ip, prov_serv.volume_size,
-			prov_serv.ssh_key_name, prov_serv.name, prov_serv.os, prov_serv.firewall, prov_serv.provider_id,
-			prov_serv.group_id, prov_serv.id, prov_serv.delete_on_termination, prov_serv.volume_type
-		).where(prov_serv.id == server_id))
-	try:
-		query_res = query.execute()
-	except Exception as e:
-		out_error(e)
-	else:
-		return query_res
-
-
-def select_gcore_server(server_id):
-	prov_serv = ProvisionedServers.alias()
-	query = (
-		prov_serv.select(
-			prov_serv.region, prov_serv.instance_type, prov_serv.public_ip, prov_serv.floating_ip, prov_serv.volume_size,
-			prov_serv.ssh_key_name, prov_serv.name, prov_serv.os, prov_serv.firewall, prov_serv.provider_id,
-			prov_serv.group_id, prov_serv.id, prov_serv.delete_on_termination, prov_serv.project, prov_serv.network_name,
-			prov_serv.volume_type, prov_serv.name_template
-		).where(prov_serv.id == server_id))
-	try:
-		query_res = query.execute()
-	except Exception as e:
-		out_error(e)
-	else:
-		return query_res
-
-
-def select_do_server(server_id):
-	prov_serv = ProvisionedServers.alias()
-	query = (
-		prov_serv.select(
-			prov_serv.region, prov_serv.instance_type, prov_serv.private_networking, prov_serv.floating_ip,
-			prov_serv.ssh_ids, prov_serv.ssh_key_name, prov_serv.name, prov_serv.os, prov_serv.firewall, prov_serv.backup,
-			prov_serv.monitoring, prov_serv.provider_id, prov_serv.group_id, prov_serv.id
-		).where(prov_serv.id == server_id))
-	try:
-		query_res = query.execute()
-	except Exception as e:
-		out_error(e)
-	else:
-		return query_res
-
-
-def update_provisioning_server_status(status, user_group_id, name, provider_id, **kwargs):
-	if kwargs.get('update_ip'):
-		query = ProvisionedServers.update(status=status, IP=kwargs.get('update_ip')).where(
-			(ProvisionedServers.name == name) & (ProvisionedServers.group_id == user_group_id) & (ProvisionedServers.provider_id == provider_id)
-		)
-	else:
-		query = ProvisionedServers.update(status=status).where(
-			(ProvisionedServers.name == name)
-			& (ProvisionedServers.group_id == user_group_id)
-			& (ProvisionedServers.provider_id == provider_id)
-		)
-	try:
-		query.execute()
-	except Exception as e:
-		out_error(e)
-
-
-def update_provisioning_server_gcore_name(name, template_name, user_group_id, provider_id):
-	query = ProvisionedServers.update(name_template=template_name).where(
-		(ProvisionedServers.name == name)
-		& (ProvisionedServers.group_id == user_group_id)
-		& (ProvisionedServers.provider_id == provider_id)
-	)
-	try:
-		query.execute()
-	except Exception as e:
-		out_error(e)
-
-
-def update_provisioning_server_error(status, user_group_id, name, provider_id):
-	query = ProvisionedServers.update(last_error=status).where(
-		(ProvisionedServers.name == name)
-		& (ProvisionedServers.group_id == user_group_id)
-		& (ProvisionedServers.provider_id == provider_id)
-	)
-	try:
-		query.execute()
-	except Exception as e:
-		out_error(e)
-
-
-def update_server_aws(
-	region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, provider,
-	group, status, server_id, delete_on_termination, volume_type
-):
-	query = ProvisionedServers.update(
-		region=region, instance_type=size, public_ip=public_ip, floating_ip=floating_ip, volume_size=volume_size,
-		ssh_key_name=ssh_name, name=workspace, os=oss, firewall=firewall, provider_id=provider, group_id=group,
-		status=status, delete_on_termination=delete_on_termination, volume_type=volume_type
-	).where(ProvisionedServers.id == server_id)
-	try:
-		query.execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def update_server_gcore(
-	region, size, network_type, network_name, volume_size, ssh_name, workspace, oss, firewall,
-	provider, group, status, server_id, delete_on_termination, volume_type, project
-):
-	query = ProvisionedServers.update(
-		region=region, instance_type=size, public_ip=network_type, network_name=network_name, volume_size=volume_size,
-		ssh_key_name=ssh_name, name=workspace, os=oss, firewall=firewall, provider_id=provider, group_id=group,
-		status=status, delete_on_termination=delete_on_termination, volume_type=volume_type, project=project
-	).where(ProvisionedServers.id == server_id)
-	try:
-		query.execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def update_server_do(
-	size, privet_net, floating_ip, ssh_ids, ssh_name, oss, firewall, monitoring, backup, provider, group,
-	status, server_id
-):
-	query = ProvisionedServers.update(
-		instance_type=size, private_networking=privet_net, floating_ip=floating_ip, ssh_ids=ssh_ids,
-		ssh_key_name=ssh_name, os=oss, firewall=firewall, monitoring=monitoring, backup=backup, provider_id=provider,
-		group_id=group, status=status
-	).where(ProvisionedServers.id == server_id)
-	try:
-		query.execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def delete_provisioned_servers(server_id):
-	query = ProvisionedServers.delete().where(ProvisionedServers.id == server_id)
-	try:
-		query.execute()
-	except Exception as e:
-		out_error(e)
-
-
-def select_provisioned_servers(**kwargs):
-	prov_serv = ProvisionedServers.alias()
-	if kwargs.get('new'):
-		query = (
-			prov_serv.select(
-				prov_serv.id, prov_serv.name, prov_serv.provider_id, prov_serv.type, prov_serv.group_id,
-				prov_serv.instance_type, prov_serv.status, prov_serv.date, prov_serv.region, prov_serv.os,
-				prov_serv.IP, prov_serv.last_error, prov_serv.name_template
-			).where(
-				(prov_serv.name == kwargs.get('new'))
-				& (prov_serv.group_id == kwargs.get('group'))
-				& (prov_serv.type == kwargs.get('type'))
-			)
-		)
-	else:
-		query = prov_serv.select(
-			prov_serv.id, prov_serv.name, prov_serv.provider_id, prov_serv.type, prov_serv.group_id,
-			prov_serv.instance_type, prov_serv.status, prov_serv.date, prov_serv.region, prov_serv.os,
-			prov_serv.IP, prov_serv.last_error, prov_serv.name_template
-		)
-	try:
-		query_res = query.execute()
-	except Exception as e:
-		out_error(e)
-	else:
-		return query_res
-
-
-def select_aws_provider(provider_id):
-	try:
-		query_res = ProvidersCreds.get(ProvidersCreds.id == provider_id)
-	except Exception:
-		return ""
-	else:
-		return query_res.key, query_res.secret
-
-
-def select_gcore_provider(provider_id):
-	try:
-		query_res = ProvidersCreds.get(ProvidersCreds.id == provider_id)
-	except Exception:
-		return ""
-	else:
-		return query_res.key, query_res.secret
-
-
-def select_do_provider(provider_id):
-	try:
-		query_res = ProvidersCreds.get(ProvidersCreds.id == provider_id)
-	except Exception:
-		return ""
-	else:
-		return query_res.key
-
-
-def update_do_provider(new_name, new_token, provider_id):
-	cur_date = get_date.return_date('regular')
-	try:
-		ProvidersCreds.update(
-			name=new_name, key=new_token, edit_date=cur_date
-		).where(ProvidersCreds.id == provider_id).execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def update_gcore_provider(new_name, new_user, new_pass, provider_id):
-	cur_date = get_date.return_date('regular')
-	try:
-		ProvidersCreds.update(
-			name=new_name, key=new_user, secret=new_pass, edit_date=cur_date
-		).where(ProvidersCreds.id == provider_id).execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
-def update_aws_provider(new_name, new_key, new_secret, provider_id):
-	cur_date = get_date.return_date('regular')
-	try:
-		ProvidersCreds.update(
-			name=new_name, key=new_key, secret=new_secret, edit_date=cur_date
-		).where(ProvidersCreds.id == provider_id).execute()
-		return True
-	except Exception as e:
-		out_error(e)
-		return False
-
-
 def is_serv_protected(serv):
 	try:
 		query_res = Server.get(Server.ip == serv)
@@ -4219,18 +3903,6 @@ def update_service_checker_settings(
 		return True
 
 
-def select_provisioning_params():
-	query = ProvisionParam.select()
-
-	try:
-		query_res = query.execute()
-	except Exception as e:
-		out_error(e)
-		return
-	else:
-		return query_res
-
-
 def select_service(slug: str) -> str:
 	try:
 		query_res = Services.get(Services.slug == slug)
diff --git a/app/modules/provisioning/__init__.py b/app/modules/provisioning/__init__.py
deleted file mode 100644
index c44b825b..00000000
--- a/app/modules/provisioning/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-NAME = 'roxy-wi-provisioning-modules'
diff --git a/app/modules/provisioning/aws.py b/app/modules/provisioning/aws.py
deleted file mode 100644
index e9f51004..00000000
--- a/app/modules/provisioning/aws.py
+++ /dev/null
@@ -1,133 +0,0 @@
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.server.server as server_mod
-import modules.provisioning.common as prov_common
-
-form = common.form
-
-
-def validate() -> None:
-    if form.getvalue('awsvalidate'):
-        workspace = form.getvalue('awsvalidate')
-        group = form.getvalue('aws_create_group')
-    else:
-        workspace = form.getvalue('awseditvalidate')
-        group = form.getvalue('aws_edit_group')
-
-    cmd = f'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.aws_module -var-file vars/{workspace}_{group}_aws.tfvars'
-    output, stderr = server_mod.subprocess_execute(cmd)
-    if stderr != '':
-        print('error: ' + stderr)
-    else:
-        print('ok')
-
-
-def new_workspace() -> None:
-    workspace = form.getvalue('awsworkspace')
-    group = form.getvalue('aws_create_group')
-    provider = form.getvalue('aws_create_provider')
-    region = form.getvalue('aws_create_regions')
-    size = form.getvalue('aws_create_size')
-    oss = form.getvalue('aws_create_oss')
-    ssh_name = form.getvalue('aws_create_ssh_name')
-    volume_size = form.getvalue('aws_create_volume_size')
-    volume_type = form.getvalue('aws_create_volume_type')
-    delete_on_termination = form.getvalue('aws_create_delete_on_termination')
-    floating_ip = form.getvalue('aws_create_floating_net')
-    firewall = form.getvalue('aws_create_firewall')
-    public_ip = form.getvalue('aws_create_public_ip')
-
-    cmd = f'cd scripts/terraform/ && sudo terraform workspace new {workspace}_{group}_aws'
-    output, stderr = server_mod.subprocess_execute(cmd)
-
-    if stderr != '':
-        prov_common.show_error(stderr, group, workspace, provider)
-    else:
-        try:
-            if sql.add_server_aws(
-                    region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall,
-                    provider, group, 'Creating', delete_on_termination, volume_type
-            ):
-                prov_common.show_new_server(workspace, group, 'aws')
-        except Exception as e:
-            print(e)
-
-
-def edit_workspace() -> None:
-    workspace = form.getvalue('awseditworkspace')
-    group = form.getvalue('aws_editing_group')
-    provider = form.getvalue('aws_editing_provider')
-    region = form.getvalue('aws_editing_regions')
-    size = form.getvalue('aws_editing_size')
-    oss = form.getvalue('aws_editing_oss')
-    ssh_name = form.getvalue('aws_editing_ssh_name')
-    volume_size = form.getvalue('aws_editing_volume_size')
-    volume_type = form.getvalue('aws_editing_volume_type')
-    delete_on_termination = form.getvalue('aws_editing_delete_on_termination')
-    floating_ip = form.getvalue('aws_editing_floating_net')
-    firewall = form.getvalue('aws_editing_firewall')
-    public_ip = form.getvalue('aws_editing_public_ip')
-    server_id = form.getvalue('server_id')
-
-    try:
-        if sql.update_server_aws(
-                region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall,
-                provider, group, 'Editing', server_id, delete_on_termination, volume_type
-        ):
-
-            try:
-                cmd = f'cd scripts/terraform/ && sudo terraform workspace select {workspace}_{group}_aws'
-                output, stderr = server_mod.subprocess_execute(cmd)
-            except Exception as e:
-                print(f'error: {e}')
-
-            if stderr != '':
-                prov_common.show_error(stderr, group, workspace, provider)
-            else:
-                print('ok')
-    except Exception as e:
-        print(e)
-
-
-def create_vars() -> None:
-    if form.getvalue('awsvars'):
-        awsvars = common.checkAjaxInput(form.getvalue('awsvars'))
-        group = common.checkAjaxInput(form.getvalue('aws_create_group'))
-        provider = common.checkAjaxInput(form.getvalue('aws_create_provider'))
-        region = common.checkAjaxInput(form.getvalue('aws_create_regions'))
-        size = common.checkAjaxInput(form.getvalue('aws_create_size'))
-        oss = common.checkAjaxInput(form.getvalue('aws_create_oss'))
-        ssh_name = common.checkAjaxInput(form.getvalue('aws_create_ssh_name'))
-        volume_size = common.checkAjaxInput(form.getvalue('aws_create_volume_size'))
-        volume_type = common.checkAjaxInput(form.getvalue('aws_create_volume_type'))
-        delete_on_termination = common.checkAjaxInput(form.getvalue('aws_create_delete_on_termination'))
-        floating_ip = common.checkAjaxInput(form.getvalue('aws_create_floating_net'))
-        firewall = common.checkAjaxInput(form.getvalue('aws_create_firewall'))
-        public_ip = common.checkAjaxInput(form.getvalue('aws_create_public_ip'))
-    else:
-        awsvars = common.checkAjaxInput(form.getvalue('awseditvars'))
-        group = common.checkAjaxInput(form.getvalue('aws_editing_group'))
-        provider = common.checkAjaxInput(form.getvalue('aws_editing_provider'))
-        region = common.checkAjaxInput(form.getvalue('aws_editing_regions'))
-        size = common.checkAjaxInput(form.getvalue('aws_editing_size'))
-        oss = common.checkAjaxInput(form.getvalue('aws_editing_oss'))
-        ssh_name = common.checkAjaxInput(form.getvalue('aws_editing_ssh_name'))
-        volume_size = common.checkAjaxInput(form.getvalue('aws_editing_volume_size'))
-        volume_type = common.checkAjaxInput(form.getvalue('aws_editing_volume_type'))
-        delete_on_termination = common.checkAjaxInput(form.getvalue('aws_editing_delete_on_termination'))
-        floating_ip = common.checkAjaxInput(form.getvalue('aws_editing_floating_net'))
-        firewall = common.checkAjaxInput(form.getvalue('aws_editing_firewall'))
-        public_ip = common.checkAjaxInput(form.getvalue('aws_editing_public_ip'))
-
-    aws_key, aws_secret = sql.select_aws_provider(provider)
-
-    cmd = f'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={region} ' \
-          f'group={group} size={size} os={oss} floating_ip={floating_ip} volume_size={volume_size} server_name={awsvars} ' \
-          f'AWS_ACCESS_KEY={aws_key} AWS_SECRET_KEY={aws_secret} firewall={firewall} public_ip={public_ip} ' \
-          f'ssh_name={ssh_name} delete_on_termination={delete_on_termination} volume_type={volume_type} cloud=aws"'
-
-    output, stderr = server_mod.subprocess_execute(cmd)
-    if stderr != '':
-        print(f'error: {stderr}')
-    else:
-        print('ok')
diff --git a/app/modules/provisioning/common.py b/app/modules/provisioning/common.py
deleted file mode 100644
index 6b727040..00000000
--- a/app/modules/provisioning/common.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.common as roxywi_common
-
-form = common.form
-
-
-def show_error(stderr: str, group: str, workspace: str, provider: str) -> None:
-    stderr = stderr.strip()
-    stderr = repr(stderr)
-    stderr = stderr.replace("'", "")
-    stderr = stderr.replace("\'", "")
-    sql.update_provisioning_server_status('Error', group, workspace, provider)
-    sql.update_provisioning_server_error(stderr, group, workspace, provider)
-    print('error: ' + stderr)
-
-
-def show_new_server(workspace: str, group: str, cloud: str) -> None:
-    user_params = roxywi_common.get_users_params()
-    new_server = sql.select_provisioned_servers(new=workspace, group=group, type=cloud)
-    params = sql.select_provisioning_params()
-    lang = roxywi_common.get_user_lang()
-    providers = sql.select_providers(group)
-
-    env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates'))
-    template = env.get_template('ajax/provisioning/provisioned_servers.html')
-    template = template.render(servers=new_server, groups=sql.select_groups(), user_group=group, providers=providers,
-                               role=user_params['role'], adding=1, params=params, lang=lang)
-    print(template)
diff --git a/app/modules/provisioning/do.py b/app/modules/provisioning/do.py
deleted file mode 100644
index 66673d73..00000000
--- a/app/modules/provisioning/do.py
+++ /dev/null
@@ -1,124 +0,0 @@
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.server.server as server_mod
-import modules.provisioning.common as prov_common
-
-form = common.form
-
-
-def validate() -> None:
-    if form.getvalue('dovalidate'):
-        workspace = form.getvalue('dovalidate')
-        group = form.getvalue('do_create_group')
-    else:
-        workspace = form.getvalue('doeditvalidate')
-        group = form.getvalue('do_edit_group')
-
-    cmd = f'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.do_module -var-file vars/{workspace}_{group}_do.tfvars'
-    output, stderr = server_mod.subprocess_execute(cmd)
-    if stderr != '':
-        print(f'error: {stderr}')
-    else:
-        print('ok')
-
-
-def new_workspace() -> None:
-    workspace = form.getvalue('doworkspace')
-    group = form.getvalue('do_create_group')
-    provider = form.getvalue('do_create_provider')
-    region = form.getvalue('do_create_regions')
-    size = form.getvalue('do_create_size')
-    oss = form.getvalue('do_create_oss')
-    ssh_name = form.getvalue('do_create_ssh_name')
-    ssh_ids = form.getvalue('do_create_ssh_ids')
-    backup = form.getvalue('do_create_backup')
-    privet_net = form.getvalue('do_create_private_net')
-    floating_ip = form.getvalue('do_create_floating_net')
-    monitoring = form.getvalue('do_create_monitoring')
-    firewall = form.getvalue('do_create_firewall')
-
-    cmd = f'cd scripts/terraform/ && sudo terraform workspace new {workspace}_{group}_do'
-    output, stderr = server_mod.subprocess_execute(cmd)
-
-    if stderr != '':
-        prov_common.show_error(stderr, group, workspace, provider)
-    else:
-        if sql.add_server_do(
-                region, size, privet_net, floating_ip, ssh_ids, ssh_name, workspace, oss, firewall, monitoring,
-                backup, provider, group, 'Creating'
-        ):
-            prov_common.show_new_server(workspace, group, 'do')
-
-
-def edit_workspace() -> None:
-    workspace = form.getvalue('doeditworkspace')
-    group = form.getvalue('do_edit_group')
-    provider = form.getvalue('do_edit_provider')
-    size = form.getvalue('do_edit_size')
-    oss = form.getvalue('do_edit_oss')
-    ssh_name = form.getvalue('do_edit_ssh_name')
-    ssh_ids = form.getvalue('do_edit_ssh_ids')
-    backup = form.getvalue('do_edit_backup')
-    privet_net = form.getvalue('do_edit_private_net')
-    floating_ip = form.getvalue('do_edit_floating_net')
-    monitoring = form.getvalue('do_edit_monitoring')
-    firewall = form.getvalue('do_edit_firewall')
-    server_id = form.getvalue('server_id')
-    try:
-        if sql.update_server_do(
-                size, privet_net, floating_ip, ssh_ids, ssh_name, oss, firewall, monitoring, backup, provider,
-                group, 'Creating', server_id
-        ):
-
-            cmd = f'cd scripts/terraform/ && sudo terraform workspace select {workspace}_{group}_do'
-            output, stderr = server_mod.subprocess_execute(cmd)
-
-            if stderr != '':
-                prov_common.show_error(stderr, group, workspace, provider)
-            else:
-                print('ok')
-    except Exception as e:
-        print(e)
-
-
-def create_vars() -> None:
-    if form.getvalue('dovars'):
-        dovars = form.getvalue('dovars')
-        group = form.getvalue('do_create_group')
-        provider = form.getvalue('do_create_provider')
-        region = form.getvalue('do_create_regions')
-        size = form.getvalue('do_create_size')
-        oss = form.getvalue('do_create_oss')
-        ssh_name = form.getvalue('do_create_ssh_name')
-        ssh_ids = form.getvalue('do_create_ssh_ids')
-        backup = form.getvalue('do_create_backup')
-        privet_net = form.getvalue('do_create_private_net')
-        floating_ip = form.getvalue('do_create_floating_net')
-        monitoring = form.getvalue('do_create_monitoring')
-        firewall = form.getvalue('do_create_firewall')
-    else:
-        dovars = form.getvalue('doeditvars')
-        group = form.getvalue('do_edit_group')
-        provider = form.getvalue('do_edit_provider')
-        region = form.getvalue('do_edit_regions')
-        size = form.getvalue('do_edit_size')
-        oss = form.getvalue('do_edit_oss')
-        ssh_name = form.getvalue('do_edit_ssh_name')
-        ssh_ids = form.getvalue('do_edit_ssh_ids')
-        backup = form.getvalue('do_edit_backup')
-        privet_net = form.getvalue('do_edit_private_net')
-        floating_ip = form.getvalue('do_edit_floating_net')
-        monitoring = form.getvalue('do_edit_monitoring')
-        firewall = form.getvalue('do_edit_firewall')
-
-    token = sql.select_do_provider(provider)
-
-    cmd = f'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={region} ' \
-          f'group={group} size={size} os={oss} floating_ip={floating_ip} ssh_ids={ssh_ids} server_name={dovars} ' \
-          f'token={token} backup={backup} monitoring={monitoring} privet_net={privet_net} firewall={firewall} ' \
-          f'floating_ip={floating_ip} ssh_name={ssh_name} cloud=do"'
-    output, stderr = server_mod.subprocess_execute(cmd)
-    if stderr != '':
-        print(f'error: {stderr}')
-    else:
-        print('ok')
diff --git a/app/modules/provisioning/gcore.py b/app/modules/provisioning/gcore.py
deleted file mode 100644
index 0e407d97..00000000
--- a/app/modules/provisioning/gcore.py
+++ /dev/null
@@ -1,141 +0,0 @@
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.server.server as server_mod
-import modules.provisioning.common as prov_common
-
-form = common.form
-
-
-def create_vars() -> None:
-    if form.getvalue('gcorevars'):
-        gcorevars = form.getvalue('gcorevars')
-        group = form.getvalue('gcore_create_group')
-        provider = form.getvalue('gcore_create_provider')
-        region = form.getvalue('gcore_create_regions')
-        project = form.getvalue('gcore_create_project')
-        size = form.getvalue('gcore_create_size')
-        oss = form.getvalue('gcore_create_oss')
-        ssh_name = form.getvalue('gcore_create_ssh_name')
-        volume_size = form.getvalue('gcore_create_volume_size')
-        volume_type = form.getvalue('gcore_create_volume_type')
-        delete_on_termination = form.getvalue('gcore_create_delete_on_termination')
-        network_name = form.getvalue('gcore_create_network_name')
-        firewall = form.getvalue('gcore_create_firewall')
-        network_type = form.getvalue('gcore_create_network_type')
-    elif form.getvalue('gcoreeditvars'):
-        gcorevars = form.getvalue('gcoreeditvars')
-        group = form.getvalue('gcore_edit_group')
-        provider = form.getvalue('gcore_edit_provider')
-        region = form.getvalue('gcore_edit_regions')
-        project = form.getvalue('gcore_edit_project')
-        size = form.getvalue('gcore_edit_size')
-        oss = form.getvalue('gcore_edit_oss')
-        ssh_name = form.getvalue('gcore_edit_ssh_name')
-        volume_size = form.getvalue('gcore_edit_volume_size')
-        volume_type = form.getvalue('gcore_edit_volume_type')
-        delete_on_termination = form.getvalue('gcore_edit_delete_on_termination')
-        network_name = form.getvalue('gcore_edit_network_name')
-        firewall = form.getvalue('gcore_edit_firewall')
-        network_type = form.getvalue('gcore_edit_network_type')
-
-    try:
-        gcore_user, gcore_pass = sql.select_gcore_provider(provider)
-    except Exception as e:
-        print(e)
-
-    cmd = 'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={} ' \
-          'group={} size={} os={} network_name={} volume_size={} server_name={} username={} ' \
-          'pass={} firewall={} network_type={} ssh_name={} delete_on_termination={} project={} volume_type={} ' \
-          'cloud=gcore"'.format(region, group, size, oss, network_name, volume_size, gcorevars, gcore_user, gcore_pass,
-                                firewall, network_type, ssh_name, delete_on_termination, project, volume_type)
-
-    output, stderr = server_mod.subprocess_execute(cmd)
-    if stderr != '':
-        print(f'error: {stderr}')
-    else:
-        print('ok')
-
-
-def validate() -> None:
-    if form.getvalue('gcorevalidate'):
-        workspace = form.getvalue('gcorevalidate')
-        group = form.getvalue('gcore_create_group')
-    else:
-        workspace = form.getvalue('gcoreeditvalidate')
-        group = form.getvalue('gcore_edit_group')
-
-    cmd = f'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.gcore_module -var-file vars/{workspace}_{group}_gcore.tfvars'
-    output, stderr = server_mod.subprocess_execute(cmd)
-    if stderr != '':
-        print(f'error: {stderr}')
-    else:
-        print('ok')
-
-
-def new_workspace() -> None:
-    workspace = form.getvalue('gcoreworkspace')
-    group = form.getvalue('gcore_create_group')
-    provider = form.getvalue('gcore_create_provider')
-    region = form.getvalue('gcore_create_regions')
-    project = form.getvalue('gcore_create_project')
-    size = form.getvalue('gcore_create_size')
-    oss = form.getvalue('gcore_create_oss')
-    ssh_name = form.getvalue('gcore_create_ssh_name')
-    volume_size = form.getvalue('gcore_create_volume_size')
-    volume_type = form.getvalue('gcore_create_volume_type')
-    delete_on_termination = form.getvalue('gcore_create_delete_on_termination')
-    network_type = form.getvalue('gcore_create_network_type')
-    firewall = form.getvalue('gcore_create_firewall')
-    network_name = form.getvalue('gcore_create_network_name')
-
-    cmd = f'cd scripts/terraform/ && sudo terraform workspace new {workspace}_{group}_gcore'
-    output, stderr = server_mod.subprocess_execute(cmd)
-
-    if stderr != '':
-        prov_common.show_error(stderr, group, workspace, provider)
-    else:
-        try:
-            if sql.add_server_gcore(
-                    project, region, size, network_type, network_name, volume_size, ssh_name, workspace, oss, firewall,
-                    provider, group, 'Creating', delete_on_termination, volume_type
-            ):
-                prov_common.show_new_server(workspace, group, 'gcore')
-        except Exception as e:
-            print(e)
-
-
-def edit_workspace() -> None:
-    workspace = form.getvalue('gcoreeditworkspace')
-    group = form.getvalue('gcore_edit_group')
-    provider = form.getvalue('gcore_edit_provider')
-    region = form.getvalue('gcore_edit_regions')
-    project = form.getvalue('gcore_edit_project')
-    size = form.getvalue('gcore_edit_size')
-    oss = form.getvalue('gcore_edit_oss')
-    ssh_name = form.getvalue('gcore_edit_ssh_name')
-    volume_size = form.getvalue('gcore_edit_volume_size')
-    volume_type = form.getvalue('gcore_edit_volume_type')
-    delete_on_termination = form.getvalue('gcore_edit_delete_on_termination')
-    network_type = form.getvalue('gcore_edit_network_type')
-    firewall = form.getvalue('gcore_edit_firewall')
-    network_name = form.getvalue('gcore_edit_network_name')
-    server_id = form.getvalue('server_id')
-
-    try:
-        if sql.update_server_gcore(
-                region, size, network_type, network_name, volume_size, ssh_name, workspace, oss, firewall,
-                provider, group, 'Editing', server_id, delete_on_termination, volume_type, project
-        ):
-
-            try:
-                cmd = f'cd scripts/terraform/ && sudo terraform workspace select {workspace}_{group}_gcore'
-                output, stderr = server_mod.subprocess_execute(cmd)
-            except Exception as e:
-                print('error: ' + str(e))
-
-            if stderr != '':
-                prov_common.show_error(stderr, group, workspace, provider)
-            else:
-                print('ok')
-    except Exception as e:
-        print(e)
diff --git a/app/modules/provisioning/provider.py b/app/modules/provisioning/provider.py
deleted file mode 100644
index 4d62badf..00000000
--- a/app/modules/provisioning/provider.py
+++ /dev/null
@@ -1,106 +0,0 @@
-import os
-import http.cookies
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.common as roxywi_common
-
-form = common.form
-
-
-def create_provider() -> None:
-    roxywi_common.check_user_group()
-    is_add = False
-    provider_name = common.checkAjaxInput(form.getvalue('new_provider_name'))
-    provider_group = common.checkAjaxInput(form.getvalue('new_provider_group'))
-    provider_token = common.checkAjaxInput(form.getvalue('new_provider_token'))
-    cloud = common.checkAjaxInput(form.getvalue('new_provider_cloud'))
-
-    if cloud == 'do':
-        if sql.add_provider_do(provider_name, provider_group, provider_token):
-            is_add = True
-
-    elif cloud == 'aws':
-        provider_secret = common.checkAjaxInput(form.getvalue('aws_new_secret'))
-
-        if sql.add_provider_aws(provider_name, provider_group, provider_token, provider_secret):
-            is_add = True
-
-    elif cloud == 'gcore':
-        provider_pass = common.checkAjaxInput(form.getvalue('gcore_new_pass'))
-
-        if sql.add_provider_gcore(provider_name, provider_group, provider_token, provider_pass):
-            is_add = True
-
-    if is_add:
-        cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-        user_uuid = cookie.get('uuid')
-        group_id = roxywi_common.get_user_group(id=1)
-        role_id = sql.get_user_role_by_uuid(user_uuid.value, group_id)
-        params = sql.select_provisioning_params()
-        providers = sql.select_providers(provider_group, key=provider_token)
-
-        if role_id == 1:
-            groups = sql.select_groups()
-        else:
-            groups = ''
-
-        lang = roxywi_common.get_user_lang()
-        env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-        template = env.get_template('ajax/provisioning/providers.html')
-        template = template.render(providers=providers, role=role_id, groups=groups, user_group=provider_group,
-                                   adding=1, params=params, lang=lang)
-        print(template)
-
-
-def delete_provider() -> None:
-    roxywi_common.check_user_group()
-    try:
-        if sql.delete_provider(common.checkAjaxInput(form.getvalue('providerdel'))):
-            print('Ok')
-            roxywi_common.logging('Roxy-WI server', 'Provider has been deleted', provisioning=1)
-    except Exception as e:
-        print(e)
-
-
-def edit_DO_provider(provider_id: int) -> None:
-    roxywi_common.check_user_group()
-    new_name = form.getvalue('edit_do_provider_name')
-    new_token = form.getvalue('edit_do_provider_token')
-
-    try:
-        if sql.update_do_provider(new_name, new_token, provider_id):
-            print('ok')
-            roxywi_common.logging('Roxy-WI server', f'Provider has been edited. New name is {new_name}', provisioning=1)
-    except Exception as e:
-        print(e)
-
-
-def edit_gcore_provider(provider_id: int) -> None:
-    roxywi_common.check_user_group()
-    new_name = form.getvalue('edit_gcore_provider_name')
-    new_user = form.getvalue('edit_gcore_provider_user')
-    new_pass = form.getvalue('edit_gcore_provider_pass')
-
-    try:
-        if sql.update_gcore_provider(new_name, new_user, new_pass, provider_id):
-            print('ok')
-            roxywi_common.logging('Roxy-WI server', f'Provider has been edited. New name is {new_name}', provisioning=1)
-    except Exception as e:
-        print(e)
-
-
-def edit_aws_provider(provider_id: int) -> None:
-    roxywi_common.check_user_group()
-    new_name = form.getvalue('edit_aws_provider_name')
-    new_key = form.getvalue('edit_aws_provider_key')
-    new_secret = form.getvalue('edit_aws_provider_secret')
-
-    try:
-        if sql.update_aws_provider(new_name, new_key, new_secret, provider_id):
-            print('ok')
-            roxywi_common.logging('Roxy-WI server', f'Provider has been edited. New name is {new_name}', provisioning=1)
-    except Exception as e:
-        print(e)
diff --git a/app/modules/provisioning/server.py b/app/modules/provisioning/server.py
deleted file mode 100644
index 85627881..00000000
--- a/app/modules/provisioning/server.py
+++ /dev/null
@@ -1,133 +0,0 @@
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.common as roxywi_common
-import modules.server.server as server_mod
-import modules.provisioning.common as prov_common
-
-form = common.form
-
-
-def init_server() -> None:
-    roxywi_common.check_user_group()
-    cmd = 'cd scripts/terraform/ && sudo terraform init -upgrade -no-color'
-    output, stderr = server_mod.subprocess_execute(cmd)
-    if stderr != '':
-        print(f'error: {stderr}')
-    else:
-        if "Terraform initialized in an empty directory" in output[0]:
-            print('error: There is not need module')
-        elif "mkdir .terraform: permission denied" in output[0]:
-            print('error: Cannot init. Check permission to folder')
-
-        print(output[0])
-
-
-def edit_server() -> None:
-    roxywi_common.check_user_group()
-    server_id = form.getvalue('editServerId')
-    user_group = form.getvalue('editGroup')
-    provider_name = form.getvalue('editProviderName')
-    params = sql.select_provisioning_params()
-    providers = sql.select_providers(int(user_group))
-    lang = roxywi_common.get_user_lang()
-    show_editing_server = {
-        'aws': sql.select_aws_server,
-        'do': sql.select_do_server,
-        'gcore': sql.select_gcore_server,
-    }
-    server = show_editing_server[provider_name](server_id=server_id)
-    env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates'))
-    template = env.get_template(f'ajax/provisioning/{provider_name}_edit_dialog.html')
-    template = template.render(server=server, providers=providers, params=params, lang=lang)
-    print(template)
-
-
-def create_server() -> None:
-    roxywi_common.check_user_group()
-    workspace = form.getvalue('provisioning_workspace')
-    group = form.getvalue('provisioning_group')
-    provider_id = form.getvalue('provisioning_provider_id')
-    action = form.getvalue('provisioning_action')
-    cloud = form.getvalue('provisioning_cloud')
-    state_name = ''
-
-    if cloud == 'aws':
-        state_name = 'aws_instance'
-    elif cloud == 'do':
-        state_name = 'digitalocean_droplet'
-    elif cloud == 'gcore':
-        state_name = 'gcore_instance'
-
-    tfvars = f'{workspace}_{group}_{cloud}.tfvars'
-    cmd = f'cd scripts/terraform/ && sudo terraform apply -auto-approve -no-color -input=false -target=module.{cloud}_module -var-file vars/{tfvars}'
-    output, stderr = server_mod.subprocess_execute(cmd)
-
-    if stderr != '':
-        prov_common.show_error(stderr, group, workspace, provider_id)
-    else:
-        if cloud == 'aws':
-            cmd = 'cd scripts/terraform/ && sudo terraform state show module.aws_module.aws_eip.floating_ip[0]|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"'
-            output, stderr = server_mod.subprocess_execute(cmd)
-            if stderr != '':
-                cmd = 'cd scripts/terraform/ && sudo terraform state show module.' + cloud + '_module.' + state_name + '.hapwi|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"'
-        else:
-            cmd = 'cd scripts/terraform/ && sudo terraform state show module.' + cloud + '_module.' + state_name + '.hapwi|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"'
-
-        output, stderr = server_mod.subprocess_execute(cmd)
-        ips = ''
-        for ip in output:
-            ips += ip
-            ips += ' '
-
-        if cloud == 'gcore':
-            ips = ips.split(' ')[0]
-
-        print(ips)
-        try:
-            sql.update_provisioning_server_status('Created', group, workspace, provider_id, update_ip=ips)
-        except Exception as e:
-            print(e)
-
-        if cloud == 'gcore':
-            cmd = 'cd scripts/terraform/ && sudo terraform state show module.gcore_module.gcore_instance.hapwi|grep "name"|grep -v -e "_name\|name_" |head -1 |awk -F"\\\"" \'{print $2}\''
-            output, stderr = server_mod.subprocess_execute(cmd)
-            print(':' + output[0])
-            try:
-                sql.update_provisioning_server_gcore_name(workspace, output[0], group, provider_id)
-            except Exception as e:
-                print(e)
-
-        roxywi_common.logging('Roxy-WI server', f'Server {workspace} has been {action}', provisioning=1)
-
-
-def destroy_server() -> None:
-    roxywi_common.check_user_group()
-    server_id = form.getvalue('provisiningdestroyserver')
-    workspace = form.getvalue('servername')
-    group = form.getvalue('group')
-    cloud_type = form.getvalue('type')
-    provider_id = form.getvalue('provider_id')
-    tf_workspace = f'{workspace}_{group}_{cloud_type}'
-    cmd = f'cd scripts/terraform/ && sudo terraform init -upgrade -no-color && sudo terraform workspace select {tf_workspace}'
-    output, stderr = server_mod.subprocess_execute(cmd)
-
-    if stderr != '':
-        prov_common.show_error(stderr, group, workspace, provider_id)
-    else:
-        cmd = f'cd scripts/terraform/ && sudo terraform destroy -auto-approve -no-color -target=module.{cloud_type}_module -var-file vars/{tf_workspace}.tfvars'
-        output, stderr = server_mod.subprocess_execute(cmd)
-
-        if stderr != '':
-            print(f'error: {stderr}')
-        else:
-            cmd = f'cd scripts/terraform/ && sudo terraform workspace select default && sudo terraform workspace delete -force {tf_workspace}'
-            output, stderr = server_mod.subprocess_execute(cmd)
-
-            print('ok')
-            roxywi_common.logging('Roxy-WI server', 'Server has been destroyed', provisioning=1)
-            try:
-                sql.delete_provisioned_servers(server_id)
-            except Exception as e:
-                print(e)
diff --git a/app/modules/roxywi/auth.py b/app/modules/roxywi/auth.py
index 5012ddff..e04a410d 100644
--- a/app/modules/roxywi/auth.py
+++ b/app/modules/roxywi/auth.py
@@ -1,14 +1,14 @@
 import os
 import http.cookies
 
+from flask import request, redirect, make_response, url_for
+
 import modules.db.sql as sql
 
 
-def check_login(user_uuid, token, **kwargs):
+def check_login(user_uuid, token, **kwargs) -> str:
 	if user_uuid is None:
-		print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
-
-	ref = os.environ.get("REQUEST_URI")
+		return 'login_page'
 
 	try:
 		sql.delete_old_uuid()
@@ -16,48 +16,85 @@ def check_login(user_uuid, token, **kwargs):
 		raise Exception(f'error: cannot connect to DB {e}')
 
 	if user_uuid is not None:
-		if sql.get_user_name_by_uuid(user_uuid.value) is None:
-			print(f'<meta http-equiv="refresh" content="0; url=login.py?ref={ref}">')
-			return False
+		if sql.get_user_name_by_uuid(user_uuid) is None:
+			return 'login_page'
 		if kwargs.get('service'):
 			required_service = str(kwargs.get('service'))
-			user_id = sql.get_user_id_by_uuid(user_uuid.value)
+			user_id = sql.get_user_id_by_uuid(user_uuid)
 			user_services = sql.select_user_services(user_id)
 			if required_service in user_services:
-				return True
+				return 'ok'
 			else:
-				print('<meta http-equiv="refresh" content="0; url=overview.py">')
-				return False
+				return 'index'
 
-		sql.update_last_act_user(user_uuid.value, token)
-	else:
-		print(f'<meta http-equiv="refresh" content="0; url=login.py?ref={ref}">')
-		return False
+		try:
+			ip = request.remote_addr
+		except Exception:
+			ip = ''
+
+		sql.update_last_act_user(user_uuid, token, ip)
+
+	return 'login_page'
 
 
 def is_admin(level=1, **kwargs):
 	if kwargs.get('role_id'):
 		role = kwargs.get('role_id')
 	else:
-		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-		user_id = cookie.get('uuid')
-		user_id = user_id.value
-		group_id = cookie.get('group')
-		group_id = int(group_id.value)
+		user_id = request.cookies.get('uuid')
+		group_id = request.cookies.get('group')
 
 		try:
 			role = sql.get_user_role_by_uuid(user_id, group_id)
 		except Exception:
 			role = 4
 			pass
-
 	try:
-		return True if role <= level else False
+		return True if int(role) <= int(level) else False
 	except Exception:
 		return False
 
 
 def page_for_admin(level=1) -> None:
 	if not is_admin(level=level):
-		print('<meta http-equiv="refresh" content="0; url=/">')
-		return
+		return redirect(url_for('index'))
+
+
+def check_in_ldap(user, password):
+	import ldap
+
+	server = sql.get_setting('ldap_server')
+	port = sql.get_setting('ldap_port')
+	ldap_class_search = sql.get_setting('ldap_class_search')
+	root_user = sql.get_setting('ldap_user')
+	root_password = sql.get_setting('ldap_password')
+	ldap_base = sql.get_setting('ldap_base')
+	ldap_search_field = sql.get_setting('ldap_search_field')
+	ldap_user_attribute = sql.get_setting('ldap_user_attribute')
+	ldap_type = sql.get_setting('ldap_type')
+
+	ldap_proto = 'ldap' if ldap_type == "0" else 'ldaps'
+
+	ldap_bind = ldap.initialize('{}://{}:{}/'.format(ldap_proto, server, port))
+	try:
+		ldap_bind.protocol_version = ldap.VERSION3
+		ldap_bind.set_option(ldap.OPT_REFERRALS, 0)
+
+		bind = ldap_bind.simple_bind_s(root_user, root_password)
+
+		criteria = "(&(objectClass=" + ldap_class_search + ")(" + ldap_user_attribute + "=" + user + "))"
+		attributes = [ldap_search_field]
+		result = ldap_bind.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes)
+
+		bind = ldap_bind.simple_bind_s(result[0][0], password)
+	except ldap.INVALID_CREDENTIALS:
+		return False
+	except ldap.SERVER_DOWN:
+		raise Exception('error: LDAP server is down')
+	except ldap.LDAPError as e:
+		if type(e.message) == dict and 'desc' in e.message:
+			raise Exception(f'error: {e.message["desc"]}')
+		else:
+			raise Exception (f'error: {e}')
+	else:
+		return True
diff --git a/app/modules/roxywi/common.py b/app/modules/roxywi/common.py
index 07827130..a71f41e4 100644
--- a/app/modules/roxywi/common.py
+++ b/app/modules/roxywi/common.py
@@ -4,6 +4,7 @@ import glob
 import http.cookies
 
 import distro
+from flask import request, redirect, make_response, url_for
 
 import modules.db.sql as sql
 import modules.common.common as common
@@ -24,18 +25,16 @@ def get_user_group(**kwargs) -> str:
 	user_group = ''
 
 	try:
-		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-		user_group_id = cookie.get('group')
-		user_group_id1 = user_group_id.value
-		groups = sql.select_groups(id=user_group_id1)
+		user_group_id = request.cookies.get('group')
+		groups = sql.select_groups(id=user_group_id)
 		for g in groups:
-			if g.group_id == int(user_group_id1):
+			if g.group_id == int(user_group_id):
 				if kwargs.get('id'):
 					user_group = g.group_id
 				else:
 					user_group = g.name
-	except Exception:
-		check_user_group()
+	except Exception as e:
+		raise Exception(f'error: {e}')
 
 	return user_group
 
@@ -44,27 +43,41 @@ def check_user_group(**kwargs):
 	if kwargs.get('token') is not None:
 		return True
 
+	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
+
 	if kwargs.get('user_uuid'):
 		group_id = kwargs.get('user_group_id')
 		user_uuid = kwargs.get('user_uuid')
 		user_id = sql.get_user_id_by_uuid(user_uuid)
 	else:
-		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 		user_uuid = cookie.get('uuid')
-		group = cookie.get('group')
-		group_id = group.value
-		user_id = sql.get_user_id_by_uuid(user_uuid.value)
+		group_id = cookie.get('group')
+		user_id = sql.get_user_id_by_uuid(user_uuid)
+
+	if sql.check_user_group(user_id, group_id):
+		return True
+	else:
+		logging('Roxy-WI server', ' has tried to actions in not his group ', roxywi=1, login=1)
+		return False
+
+
+def check_user_group_for_flask(**kwargs):
+	if kwargs.get('token') is not None:
+		return True
+
+	if kwargs.get('user_uuid'):
+		group_id = kwargs.get('user_group_id')
+		user_uuid = kwargs.get('user_uuid')
+		user_id = sql.get_user_id_by_uuid(user_uuid)
+	else:
+		user_uuid = request.cookies.get('uuid')
+		group_id = request.cookies.get('group')
+		user_id = sql.get_user_id_by_uuid(user_uuid)
 
 	if sql.check_user_group(user_id, group_id):
 		return True
 	else:
 		logging('Roxy-WI server', ' has tried to actions in not his group ', roxywi=1, login=1)
-		try:
-			ref = os.environ.get("REQUEST_URI").split('&')[0]
-		except Exception:
-			ref = os.environ.get("REQUEST_URI")
-		ref = common.checkAjaxInput(ref)
-		print(f'<meta http-equiv="refresh" content="0; url={ref}">')
 		return False
 
 
@@ -72,11 +85,10 @@ def get_user_id(**kwargs):
 	if kwargs.get('login'):
 		return sql.get_user_id_by_username(kwargs.get('login'))
 
-	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-	user_uuid = cookie.get('uuid')
+	user_uuid = request.cookies.get('uuid')
 
 	if user_uuid is not None:
-		user_id = sql.get_user_id_by_uuid(user_uuid.value)
+		user_id = sql.get_user_id_by_uuid(user_uuid)
 
 		return user_id
 
@@ -89,18 +101,10 @@ def check_is_server_in_group(server_ip: str) -> bool:
 			return True
 		else:
 			logging('Roxy-WI server', ' has tried to actions in not his group server ', roxywi=1, login=1)
-			try:
-				ref = os.environ.get("REQUEST_URI").split('&')[0]
-			except Exception:
-				ref = os.environ.get("REQUEST_URI")
-			ref = common.checkAjaxInput(ref)
-			print(f'<meta http-equiv="refresh" content="0; url={ref}">')
 			return False
 
 
-def get_files(folder=None, file_format='cfg') -> list:
-	if folder is None:
-		folder = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
+def get_files(folder, file_format, server_ip=None) -> list:
 	if file_format == 'log':
 		file = []
 	else:
@@ -120,7 +124,7 @@ def get_files(folder=None, file_format='cfg') -> list:
 	if file_format == 'cfg' or file_format == 'conf':
 		for file in files:
 			ip = file.split("-")
-			if serv == ip[0]:
+			if server_ip == ip[0]:
 				return_files.add(file)
 		return sorted(return_files, reverse=True)
 	else:
@@ -147,9 +151,8 @@ def logging(server_ip: str, action: str, **kwargs) -> None:
 		ip = ''
 
 	try:
-		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-		user_uuid = cookie.get('uuid')
-		login = sql.get_user_name_by_uuid(user_uuid.value)
+		user_uuid = request.cookies.get('uuid')
+		login = sql.get_user_name_by_uuid(user_uuid)
 	except Exception:
 		login_name = kwargs.get('login')
 		try:
@@ -219,9 +222,17 @@ def get_dick_permit(**kwargs):
 	else:
 		token = ''
 
-	if check_user_group(token=token):
+	if not kwargs.get('group_id'):
 		try:
-			servers = sql.get_dick_permit(**kwargs)
+			group_id = get_user_group(id=1)
+		except Exception as e:
+			return str(e)
+	else:
+		group_id = kwargs.get('group_id')
+
+	if check_user_group_for_flask(token=token):
+		try:
+			servers = sql.get_dick_permit(group_id, **kwargs)
 		except Exception as e:
 			raise Exception(e)
 		else:
@@ -231,33 +242,30 @@ def get_dick_permit(**kwargs):
 
 
 def get_users_params(**kwargs):
-	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-
 	try:
-		user_uuid = cookie.get('uuid')
-		user = sql.get_user_name_by_uuid(user_uuid.value)
+		user_uuid = request.cookies.get('uuid')
+		user = sql.get_user_name_by_uuid(user_uuid)
 	except Exception:
-		print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
+		make_response(redirect(url_for('login_page')))
 		return
 
 	try:
-		group_id = cookie.get('group')
-		group_id = int(group_id.value)
+		group_id = int(request.cookies.get('group'))
 	except Exception:
-		print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
+		make_response(redirect(url_for('login_page')))
 		return
 
 	try:
-		role = sql.get_user_role_by_uuid(user_uuid.value, group_id)
+		role = sql.get_user_role_by_uuid(user_uuid, group_id)
 	except Exception:
-		print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
+		make_response(redirect(url_for('login_page')))
 		return
 	try:
-		user_id = sql.get_user_id_by_uuid(user_uuid.value)
+		user_id = sql.get_user_id_by_uuid(user_uuid)
 		user_services = sql.select_user_services(user_id)
-		token = sql.get_token(user_uuid.value)
+		token = sql.get_token(user_uuid)
 	except Exception:
-		print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
+		make_response(redirect(url_for('login_page')))
 		return
 
 	if kwargs.get('virt') and kwargs.get('haproxy'):
@@ -273,7 +281,7 @@ def get_users_params(**kwargs):
 	else:
 		servers = get_dick_permit()
 
-	user_lang = get_user_lang()
+	user_lang = get_user_lang_for_flask()
 
 	user_params = {
 		'user': user,
@@ -297,6 +305,21 @@ def get_user_lang() -> str:
 	except Exception:
 		return 'en'
 
+	if user_lang is None:
+		user_lang = 'en'
+
+	return user_lang
+
+
+def get_user_lang_for_flask() -> str:
+	try:
+		user_lang = request.cookies.get('lang')
+	except Exception:
+		return 'en'
+
+	if user_lang is None:
+		user_lang = 'en'
+
 	return user_lang
 
 
@@ -312,3 +335,13 @@ def return_unsubscribed_user_status() -> dict:
 	user_subscription = {'user_status': 0, 'user_plan': 0}
 
 	return user_subscription
+
+
+def return_user_subscription():
+	try:
+		user_subscription = return_user_status()
+	except Exception as e:
+		user_subscription = return_unsubscribed_user_status()
+		roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
+
+	return user_subscription
diff --git a/app/modules/roxywi/group.py b/app/modules/roxywi/group.py
index 460b186e..33aa7a0f 100644
--- a/app/modules/roxywi/group.py
+++ b/app/modules/roxywi/group.py
@@ -2,19 +2,19 @@ import modules.db.sql as sql
 import modules.roxywi.common as roxywi_common
 
 
-def update_group(group_id: int, group_name: str, desc: str) -> None:
-    print(group_name)
+def update_group(group_id: int, group_name: str, desc: str) -> str:
     if group_name == '':
-        print(roxywi_common.return_error_message())
+        return roxywi_common.return_error_message()
     else:
         try:
             sql.update_group(group_name, desc, group_id)
             roxywi_common.logging('Roxy-WI server', f'The {group_name} has been updated', roxywi=1, login=1)
+            return 'ok'
         except Exception as e:
-            print(f'error: {e}')
+            return f'error: {e}'
 
 
-def delete_group(group_id: int) -> None:
+def delete_group(group_id: int) -> str:
     group = sql.select_groups(id=group_id)
     group_name = ''
 
@@ -22,5 +22,5 @@ def delete_group(group_id: int) -> None:
         group_name = g.name
 
     if sql.delete_group(group_id):
-        print("Ok")
         roxywi_common.logging('Roxy-WI server', f'The {group_name} has been deleted', roxywi=1, login=1)
+        return 'ok'
diff --git a/app/modules/roxywi/logs.py b/app/modules/roxywi/logs.py
index 3490484b..d2e6aae9 100644
--- a/app/modules/roxywi/logs.py
+++ b/app/modules/roxywi/logs.py
@@ -54,33 +54,29 @@ def show_log(stdout, **kwargs):
 
 
 def show_roxy_log(
-		serv, rows='10', waf='0', grep=None, hour='00',
-		minute='00', hour1='24', minute1='00', service='haproxy', **kwargs
+		serv, rows='10', waf='0', grep=None, exgrep=None, hour='00',
+		minute='00', hour1='24', minute1='00', service='haproxy', log_file='123', **kwargs
 ) -> str:
-	exgrep = form.getvalue('exgrep')
-	log_file = form.getvalue('file')
 	date = checkAjaxInput(hour) + ':' + checkAjaxInput(minute)
 	date1 = checkAjaxInput(hour1) + ':' + checkAjaxInput(minute1)
 	rows = checkAjaxInput(rows)
 	waf = checkAjaxInput(waf)
 	cmd = ''
 	awk_column = 3
+	grep_act = ''
+	exgrep_act = ''
 
-	if grep is not None:
+	if grep:
 		grep_act = '|egrep "%s"' % checkAjaxInput(grep)
-	else:
-		grep_act = ''
 
-	if exgrep is not None:
+	if exgrep:
 		exgrep_act = '|egrep -v "%s"' % checkAjaxInput(exgrep)
-	else:
-		exgrep_act = ''
 
 	if log_file is not None:
 		log_file = checkAjaxInput(log_file)
-		if '..' in log_file: return 'error: nice try'
+		if '..' in log_file: raise Exception('error: nice try')
 	else:
-		if '..' in serv: return 'error: nice try'
+		if '..' in serv: raise Exception('error: nice try')
 
 	if service in ('nginx', 'haproxy', 'apache', 'keepalived'):
 		syslog_server_enable = sql.get_setting('syslog_server_enable')
@@ -102,9 +98,10 @@ def show_roxy_log(
 			else:
 				local_path_logs = sql.get_setting('haproxy_path_logs')
 				commands = ["sudo cat %s/%s| awk '$3>\"%s:00\" && $3<\"%s:00\"' |tail -%s %s %s" % (local_path_logs, log_file, date, date1, rows, grep_act, exgrep_act)]
+
 			syslog_server = serv
 		else:
-			if '..' in serv: return 'error: nice try'
+			if '..' in serv: raise Exception('error: nice try')
 
 			commands = ["sudo cat /var/log/%s/syslog.log | sed '/ %s:00/,/ %s:00/! d' |tail -%s %s %s %s" % (serv, date, date1, rows, grep_act, grep, exgrep_act)]
 			syslog_server = sql.get_setting('syslog_server')
@@ -112,6 +109,7 @@ def show_roxy_log(
 		if waf == "1":
 			local_path_logs = '/var/log/waf.log'
 			commands = ["sudo cat %s |tail -%s %s %s" % (local_path_logs, rows, grep_act, exgrep_act)]
+
 		if kwargs.get('html') == 0:
 			a = server_mod.ssh_command(syslog_server, commands)
 			return show_log(a, html=0, grep=grep)
diff --git a/app/modules/roxywi/metrics.py b/app/modules/roxywi/metrics.py
index af15fa1d..dcaeeac5 100644
--- a/app/modules/roxywi/metrics.py
+++ b/app/modules/roxywi/metrics.py
@@ -1,12 +1,10 @@
-import json
-
 import psutil
 
 import modules.db.sql as sql
 import modules.server.server as server_mod
 
 
-def show_ram_metrics(metrics_type: str) -> None:
+def show_ram_metrics(metrics_type: str) -> dict:
     metrics = {'chartData': {}}
     rams = ''
 
@@ -27,10 +25,10 @@ def show_ram_metrics(metrics_type: str) -> None:
 
     metrics['chartData']['rams'] = rams
 
-    print(json.dumps(metrics))
+    return metrics
 
 
-def show_cpu_metrics(metrics_type: str) -> None:
+def show_cpu_metrics(metrics_type: str) -> dict:
     metrics = {'chartData': {}}
     cpus = ''
 
@@ -54,10 +52,10 @@ def show_cpu_metrics(metrics_type: str) -> None:
 
     metrics['chartData']['cpus'] = cpus
 
-    print(json.dumps(metrics))
+    return metrics
 
 
-def haproxy_metrics(server_ip: str, hostname: str, time_range: str) -> None:
+def haproxy_metrics(server_ip: str, hostname: str, time_range: str) -> dict:
     metric = sql.select_metrics(server_ip, 'haproxy', time_range=time_range)
     metrics = {'chartData': {}}
     metrics['chartData']['labels'] = {}
@@ -82,10 +80,10 @@ def haproxy_metrics(server_ip: str, hostname: str, time_range: str) -> None:
     metrics['chartData']['sess_rate'] = sess_rate
     metrics['chartData']['server'] = hostname + ' (' + server + ')'
 
-    print(json.dumps(metrics))
+    return metrics
 
 
-def haproxy_http_metrics(server_ip: str, hostname: str, time_range: str) -> None:
+def haproxy_http_metrics(server_ip: str, hostname: str, time_range: str) -> dict:
     metric = sql.select_metrics(server_ip, 'http_metrics', time_range=time_range)
     metrics = {'chartData': {}}
     metrics['chartData']['labels'] = {}
@@ -113,10 +111,10 @@ def haproxy_http_metrics(server_ip: str, hostname: str, time_range: str) -> None
     metrics['chartData']['http_5xx'] = http_5xx
     metrics['chartData']['server'] = f'{hostname} ({server})'
 
-    print(json.dumps(metrics))
+    return metrics
 
 
-def service_metrics(server_ip: str, hostname: str, service: str, time_range: str) -> None:
+def service_metrics(server_ip: str, hostname: str, service: str, time_range: str) -> dict:
     metric = sql.select_metrics(server_ip, service, time_range=time_range)
 
     metrics = {'chartData': {}}
@@ -134,4 +132,4 @@ def service_metrics(server_ip: str, hostname: str, service: str, time_range: str
     metrics['chartData']['curr_con'] = curr_con
     metrics['chartData']['server'] = f'{hostname} ({server_ip})'
 
-    print(json.dumps(metrics))
+    return metrics
diff --git a/app/modules/roxywi/nettools.py b/app/modules/roxywi/nettools.py
index 740fd90d..1889c751 100644
--- a/app/modules/roxywi/nettools.py
+++ b/app/modules/roxywi/nettools.py
@@ -1,20 +1,13 @@
-import modules.common.common as common
 import modules.server.server as server_mod
 
-form = common.form
 
-
-def ping_from_server() -> None:
-    server_from = common.checkAjaxInput(form.getvalue('nettools_icmp_server_from'))
-    server_to = common.checkAjaxInput(form.getvalue('nettools_icmp_server_to'))
-    server_to = common.is_ip_or_dns(server_to)
-    action = common.checkAjaxInput(form.getvalue('nettools_action'))
+def ping_from_server(server_from: str, server_to: str, action: str) -> str:
     stderr = ''
     action_for_sending = ''
+    output1 = ''
 
     if server_to == '':
-        print('warning: enter a correct IP or DNS name')
-        return
+        return 'warning: enter a correct IP or DNS name'
 
     if action == 'nettools_ping':
         action_for_sending = 'ping -c 4 -W 1 -s 56 -O '
@@ -30,35 +23,32 @@ def ping_from_server() -> None:
         output = server_mod.ssh_command(server_from, action_for_sending, raw=1, timeout=15)
 
     if stderr != '':
-        print(f'error: {stderr}')
-        return
+        return f'error: {stderr}'
     for i in output:
         if i == ' ' or i == '':
             continue
         i = i.strip()
         if 'PING' in i:
-            print('<span style="color: var(--link-dark-blue); display: block; margin-top: -20px;">')
+            output1 += '<span style="color: var(--link-dark-blue); display: block; margin-top: -5px;">'
         elif 'no reply' in i or 'no answer yet' in i or 'Too many hops' in i or '100% packet loss' in i:
-            print('<span style="color: var(--red-color);">')
+            output1 += '<span style="color: var(--red-color);">'
         elif 'ms' in i and '100% packet loss' not in i:
-            print('<span style="color: var(--green-color);">')
+            output1 += '<span style="color: var(--green-color);">'
         else:
-            print('<span>')
+            output1 += '<span>'
 
-        print(i + '</span><br />')
+        output1 += i + '</span><br />'
+
+    return output1
 
 
-def telnet_from_server() -> None:
-    server_from = common.checkAjaxInput(form.getvalue('nettools_telnet_server_from'))
-    server_to = common.checkAjaxInput(form.getvalue('nettools_telnet_server_to'))
-    server_to = common.is_ip_or_dns(server_to)
-    port_to = common.checkAjaxInput(form.getvalue('nettools_telnet_port_to'))
+def telnet_from_server(server_from: str, server_to: str, port_to: str) -> str:
     count_string = 0
     stderr = ''
+    output1 = ''
 
     if server_to == '':
-        print('warning: enter a correct IP or DNS name')
-        return
+        return 'warning: enter a correct IP or DNS name'
 
     if server_from == 'localhost':
         action_for_sending = f'echo "exit"|nc {server_to} {port_to} -t -w 1s'
@@ -68,33 +58,27 @@ def telnet_from_server() -> None:
         output = server_mod.ssh_command(server_from, action_for_sending, raw=1)
 
     if stderr != '':
-        print(f'error: <b>{stderr[5:]}</b>')
-        return
+        return f'error: <b>{stderr[5:]}</b>'
 
     for i in output:
         if i == ' ':
             continue
         i = i.strip()
         if i == 'Ncat: Connection timed out.':
-            print(f'error: <b>{i[5:]}</b>')
-            break
-        print(i + '<br>')
+            return f'error: <b>{i[5:]}</b>'
+        output1 += i + '<br>'
         count_string += 1
         if count_string > 1:
             break
+    return output1
 
-
-def nslookup_from_server() -> None:
-    server_from = common.checkAjaxInput(form.getvalue('nettools_nslookup_server_from'))
-    dns_name = common.checkAjaxInput(form.getvalue('nettools_nslookup_name'))
-    dns_name = common.is_ip_or_dns(dns_name)
-    record_type = common.checkAjaxInput(form.getvalue('nettools_nslookup_record_type'))
+def nslookup_from_server(server_from: str, dns_name: str, record_type: str) -> str:
     count_string = 0
     stderr = ''
+    output1 = ''
 
     if dns_name == '':
-        print('warning: enter a correct DNS name')
-        return
+        return 'warning: enter a correct DNS name'
 
     action_for_sending = f'dig {dns_name} {record_type} |grep -e "SERVER\|{dns_name}"'
 
@@ -105,23 +89,21 @@ def nslookup_from_server() -> None:
         output = server_mod.ssh_command(server_from, action_for_sending, raw=1)
 
     if stderr != '':
-        print('error: ' + stderr[5:-1])
-        return
+        return 'error: ' + stderr[5:-1]
 
-    print(
-        f'<b style="display: block; margin-top:10px;">The <i style="color: var(--blue-color)">{dns_name}</i> domain has the following records:</b>')
+    output1 += f'<b style="display: block; margin-top:10px;">The <i style="color: var(--blue-color)">{dns_name}</i> domain has the following records:</b>'
     for i in output:
         if 'dig: command not found.' in i:
-            print('error: Install bind-utils before using NSLookup')
-            break
+            return 'error: Install bind-utils before using NSLookup'
         if ';' in i and ';; SERVER:' not in i:
             continue
         if 'SOA' in i and record_type != 'SOA':
-            print('<b style="color: red">There are not any records for this type')
-            break
+            return '<b style="color: red">There are not any records for this type'
         if ';; SERVER:' in i:
             i = i[10:]
-            print('<br><b>From NS server:</b><br>')
+            output1 += '<br><b>From NS server:</b><br>'
         i = i.strip()
-        print('<i>' + i + '</i><br>')
+        output1 += '<i>' + i + '</i><br>'
         count_string += 1
+
+    return output1
diff --git a/app/modules/roxywi/overview.py b/app/modules/roxywi/overview.py
index 55c3f143..ac25b718 100644
--- a/app/modules/roxywi/overview.py
+++ b/app/modules/roxywi/overview.py
@@ -1,7 +1,8 @@
 import os
-import http.cookies
 
+import psutil
 import requests
+from flask import render_template, request
 from jinja2 import Environment, FileSystemLoader
 
 import modules.db.sql as sql
@@ -12,11 +13,8 @@ import modules.server.server as server_mod
 import modules.service.common as service_common
 
 
-def user_ovw() -> None:
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/show_users_ovw.html')
-
-    lang = roxywi_common.get_user_lang()
+def user_owv():
+    lang = roxywi_common.get_user_lang_for_flask()
     roles = sql.select_roles()
     user_params = roxywi_common.get_users_params()
     users_groups = sql.select_user_groups_with_names(1, all=1)
@@ -27,109 +25,77 @@ def user_ovw() -> None:
     else:
         users = sql.select_users()
 
-    template = template.render(users=users, users_groups=users_groups, lang=lang, roles=roles)
-    print(template)
+    return render_template('ajax/show_users_ovw.html', users=users, users_groups=users_groups, lang=lang, roles=roles)
 
 
 def show_sub_ovw() -> None:
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    lang = roxywi_common.get_user_lang()
-    template = env.get_template('ajax/show_sub_ovw.html')
-    template = template.render(sub=sql.select_user_all(), lang=lang)
-    print(template)
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    return render_template('ajax/show_sub_ovw.html', sub=sql.select_user_all(), lang=lang)
 
 
 def show_overview(serv) -> None:
-    import asyncio
+    servers = []
+    user_uuid = request.cookies.get('uuid')
+    group_id = request.cookies.get('group')
+    lang = roxywi_common.get_user_lang_for_flask()
+    role = sql.get_user_role_by_uuid(user_uuid, group_id)
+    server = [server for server in sql.select_servers(server=serv)]
+    user_id = sql.get_user_id_by_uuid(user_uuid)
+    user_services = sql.select_user_services(user_id)
 
-    async def async_get_overview(serv1, serv2, user_uuid, server_id):
-        user_id = sql.get_user_id_by_uuid(user_uuid)
-        user_services = sql.select_user_services(user_id)
+    haproxy = sql.select_haproxy(serv) if '1' in user_services else 0
+    nginx = sql.select_nginx(serv) if '2' in user_services else 0
+    keepalived = sql.select_keepalived(serv) if '3' in user_services else 0
+    apache = sql.select_apache(serv) if '4' in user_services else 0
 
-        haproxy = sql.select_haproxy(serv) if '1' in user_services else 0
-        nginx = sql.select_nginx(serv) if '2' in user_services else 0
-        keepalived = sql.select_keepalived(serv) if '3' in user_services else 0
-        apache = sql.select_apache(serv) if '4' in user_services else 0
+    waf = sql.select_waf_servers(server[0][2])
+    haproxy_process = ''
+    keepalived_process = ''
+    nginx_process = ''
+    apache_process = ''
+    waf_process = ''
 
-        waf = sql.select_waf_servers(serv2)
-        haproxy_process = ''
-        keepalived_process = ''
-        nginx_process = ''
-        apache_process = ''
-        waf_process = ''
+    try:
+        waf_len = len(waf)
+    except Exception:
+        waf_len = 0
 
+    if haproxy:
+        cmd = f'echo "show info" |nc {server[0][2]} {sql.get_setting("haproxy_sock_port")} -w 1|grep -e "Process_num"'
+        haproxy_process = service_common.server_status(server_mod.subprocess_execute(cmd))
+
+    if nginx:
+        nginx_cmd = f'echo "something" |nc {server[0][2]} {sql.get_setting("nginx_stats_port")} -w 1'
+        nginx_process = service_common.server_status(server_mod.subprocess_execute(nginx_cmd))
+
+    if apache:
+        apache_cmd = f'echo "something" |nc {server[0][2]} {sql.get_setting("apache_stats_port")} -w 1'
+        apache_process = service_common.server_status(server_mod.subprocess_execute(apache_cmd))
+
+    if keepalived:
+        command = ["ps ax |grep keepalived|grep -v grep|wc -l|tr -d '\n'"]
         try:
-            waf_len = len(waf)
-        except Exception:
-            waf_len = 0
+            keepalived_process = server_mod.ssh_command(server[0][2], command)
+        except Exception as e:
+            raise Exception(f'error: {e} for server {server[0][2]}')
 
-        if haproxy:
-            cmd = f'echo "show info" |nc {serv2} {sql.get_setting("haproxy_sock_port")} -w 1|grep -e "Process_num"'
-            haproxy_process = service_common.server_status(server_mod.subprocess_execute(cmd))
+    if waf_len >= 1:
+        command = ["ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l"]
+        try:
+            waf_process = server_mod.ssh_command(server[0][2], command)
+        except Exception as e:
+            raise Exception(f'error: {e} for server {server[0][2]}')
 
-        if nginx:
-            nginx_cmd = f'echo "something" |nc {serv2} {sql.get_setting("nginx_stats_port")} -w 1'
-            nginx_process = service_common.server_status(server_mod.subprocess_execute(nginx_cmd))
+    server_status = (
+        server[0][1], server[0][2], haproxy, haproxy_process, waf_process, waf, keepalived, keepalived_process, nginx,
+        nginx_process, server[0][0], apache, apache_process
+    )
 
-        if apache:
-            apache_cmd = f'echo "something" |nc {serv2} {sql.get_setting("apache_stats_port")} -w 1'
-            apache_process = service_common.server_status(server_mod.subprocess_execute(apache_cmd))
+    servers.append(server_status)
+    servers_sorted = sorted(servers, key=common.get_key)
 
-        if keepalived:
-            command = ["ps ax |grep keepalived|grep -v grep|wc -l|tr -d '\n'"]
-            try:
-                keepalived_process = server_mod.ssh_command(serv2, command)
-            except Exception as e:
-                print(f'error: {e} for server {serv2}')
-                return
-
-        if waf_len >= 1:
-            command = ["ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l"]
-            try:
-                waf_process = server_mod.ssh_command(serv2, command)
-            except Exception as e:
-                print(f'error: {e} for server {serv2}')
-                return
-
-        server_status = (serv1,
-                         serv2,
-                         haproxy,
-                         haproxy_process,
-                         waf_process,
-                         waf,
-                         keepalived,
-                         keepalived_process,
-                         nginx,
-                         nginx_process,
-                         server_id,
-                         apache,
-                         apache_process)
-        return server_status
-
-    async def get_runner_overview():
-        env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
-                          extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'])
-
-        servers = []
-        template = env.get_template('ajax/overview.html')
-        cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-        user_uuid = cookie.get('uuid')
-        group_id = cookie.get('group')
-        group_id = int(group_id.value)
-        lang = roxywi_common.get_user_lang()
-        role = sql.get_user_role_by_uuid(user_uuid.value, group_id)
-        futures = [async_get_overview(server[1], server[2], user_uuid.value, server[0]) for server in
-                   sql.select_servers(server=serv)]
-        for i, future in enumerate(asyncio.as_completed(futures)):
-            result = await future
-            servers.append(result)
-        servers_sorted = sorted(servers, key=common.get_key)
-        template = template.render(service_status=servers_sorted, role=role, lang=lang)
-        print(template)
-
-    ioloop = asyncio.get_event_loop()
-    ioloop.run_until_complete(get_runner_overview())
-    ioloop.close()
+    return render_template('ajax/overview.html', service_status=servers_sorted, role=role, lang=lang)
 
 
 def show_haproxy_binout(server_ip: str) -> None:
@@ -151,14 +117,12 @@ def show_haproxy_binout(server_ip: str) -> None:
         server_ip, port)
     cout, stderr3 = server_mod.subprocess_execute(cmd)
     bin_bout.append(cout[0])
-    lang = roxywi_common.get_user_lang()
-    env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-    template = env.get_template('ajax/bin_bout.html')
-    template = template.render(bin_bout=bin_bout, serv=server_ip, service='haproxy', lang=lang)
-    print(template)
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    return render_template('ajax/bin_bout.html', bin_bout=bin_bout, serv=server_ip, service='haproxy', lang=lang)
 
 
-def show_nginx_connections(server_ip: str) -> None:
+def show_nginx_connections(server_ip: str) -> str:
     port = sql.get_setting('nginx_stats_port')
     user = sql.get_setting('nginx_stats_user')
     password = sql.get_setting('nginx_stats_password')
@@ -175,13 +139,10 @@ def show_nginx_connections(server_ip: str) -> None:
             if num == 2:
                 bin_bout.append(line.split(' ')[3])
 
-        lang = roxywi_common.get_user_lang()
-        env = Environment(loader=FileSystemLoader('templates'))
-        template = env.get_template('ajax/bin_bout.html')
-        template = template.render(bin_bout=bin_bout, serv=server_ip, service='nginx', lang=lang)
-        print(template)
+        lang = roxywi_common.get_user_lang_for_flask()
+        return render_template('ajax/bin_bout.html', bin_bout=bin_bout, serv=server_ip, service='nginx', lang=lang)
     else:
-        print('error: cannot connect to NGINX stat page')
+        return 'error: cannot connect to NGINX stat page'
 
 
 def show_apache_bytes(server_ip: str) -> None:
@@ -199,21 +160,13 @@ def show_apache_bytes(server_ip: str) -> None:
             if 'ReqPerSec' in line or 'BytesPerSec' in line:
                 bin_bout.append(line.split(' ')[1])
 
-        lang = roxywi_common.get_user_lang()
-        env = Environment(loader=FileSystemLoader('templates'))
-        template = env.get_template('ajax/bin_bout.html')
-        template = template.render(bin_bout=bin_bout, serv=server_ip, service='apache', lang=lang)
-        print(template)
+        lang = roxywi_common.get_user_lang_for_flask()
+        return render_template('ajax/bin_bout.html', bin_bout=bin_bout, serv=server_ip, service='apache', lang=lang)
     else:
-        print('error: cannot connect to Apache stat page')
+        return 'error: cannot connect to Apache stat page'
 
 
-def show_services_overview() -> None:
-    import psutil
-    from jinja2 import Environment, FileSystemLoader
-
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/show_services_ovw.html')
+def show_services_overview():
     user_params = roxywi_common.get_users_params()
     grafana = 0
     metrics_worker = 0
@@ -221,7 +174,7 @@ def show_services_overview() -> None:
     servers_group = []
     host = os.environ.get('HTTP_HOST', '')
     user_group = roxywi_common.get_user_group(id=1)
-    lang = roxywi_common.get_user_lang()
+    lang = roxywi_common.get_user_lang_for_flask()
 
     if (user_params['role'] == 2 or user_params['role'] == 3) and int(user_group) != 1:
         for s in user_params['servers']:
@@ -268,7 +221,8 @@ def show_services_overview() -> None:
     cmd = "systemctl is-active roxy-wi-socket"
     socket, stderr = server_mod.subprocess_execute(cmd)
 
-    rendered_template = template.render(
+    return render_template(
+        'ajax/show_services_ovw.html',
         role=user_params['role'], metrics_master=''.join(metrics_master), metrics_worker=metrics_worker,
         checker_master=''.join(checker_master), checker_worker=checker_worker, keep_alive=''.join(keep_alive),
         smon=''.join(smon), port_scanner=''.join(port_scanner), grafana=grafana, socket=''.join(socket),
@@ -279,14 +233,10 @@ def show_services_overview() -> None:
         keep_alive_log_id=roxy_logs.roxy_wi_log(log_id=1, file="keep_alive"),
         socket_log_id=roxy_logs.roxy_wi_log(log_id=1, file="socket"), error=stderr, lang=lang
     )
-    print(rendered_template)
-
 
 def keepalived_became_master(server_ip) -> None:
     commands = ["sudo kill -USR2 $(cat /var/run/keepalived.pid) && sudo grep 'Became master' /tmp/keepalived.stats |awk '{print $3}'"]
     became_master = server_mod.ssh_command(server_ip, commands)
-    lang = roxywi_common.get_user_lang()
-    env = Environment(loader=FileSystemLoader('templates'))
-    template = env.get_template('ajax/bin_bout.html')
-    template = template.render(bin_bout=became_master, serv=server_ip, service='keepalived', lang=lang)
-    print(template)
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    return render_template('ajax/bin_bout.html', bin_bout=became_master, serv=server_ip, service='keepalived', lang=lang)
diff --git a/app/modules/roxywi/roxy.py b/app/modules/roxywi/roxy.py
index e40ef724..bdad1de2 100644
--- a/app/modules/roxywi/roxy.py
+++ b/app/modules/roxywi/roxy.py
@@ -50,8 +50,8 @@ def update_roxy_wi(service):
 		cmd = f'sudo -S yum -y install {service} {restart_service}'
 
 	output, stderr = server_mod.subprocess_execute(cmd)
-	print(output)
-	print(stderr)
+	return output
+	# print(stderr)
 
 
 def check_ver():
@@ -68,6 +68,8 @@ def versions():
 			current_ver_without_dots += '00'
 		if len(current_ver_without_dots) == 3:
 			current_ver_without_dots += '0'
+		if len(current_ver_without_dots) == 7:
+			current_ver_without_dots += '0'
 		current_ver_without_dots = int(current_ver_without_dots)
 	except Exception:
 		current_ver = "Sorry cannot get current version"
@@ -82,6 +84,8 @@ def versions():
 			new_ver_without_dots += '00'
 		if len(new_ver_without_dots) == 3:
 			new_ver_without_dots += '0'
+		if len(new_ver_without_dots) == 7:
+			new_ver_without_dots += '0'
 		new_ver_without_dots = int(new_ver_without_dots)
 	except Exception as e:
 		new_ver = "Cannot get a new version"
@@ -192,21 +196,16 @@ def check_new_version(service):
 	return res
 
 
-def action_service(action: str, service: str) -> None:
-	if action not in ('start', 'stop', 'restart'):
-		print('error: wrong action')
-		return
-
+def action_service(action: str, service: str) -> str:
 	is_in_docker = is_docker()
 	cmd = f"sudo systemctl disable {service} --now"
 	if action in ("start", "restart"):
 		cmd = f"sudo systemctl {action} {service} --now"
 		if not sql.select_user_status():
-			print(
-				'warning: The service is disabled because you are not subscribed. Read <a href="https://roxy-wi.org/pricing" '
-				'title="Roxy-WI pricing" target="_blank">here</a> about subscriptions')
-			return 
+			return 'warning: The service is disabled because you are not subscribed. Read <a href="https://roxy-wi.org/pricing" ' \
+				   'title="Roxy-WI pricing" target="_blank">here</a> about subscriptions'
 	if is_in_docker:
 		cmd = f"sudo supervisorctl {action} {service}"
 	os.system(cmd)
 	roxywi_common.logging('Roxy-WI server', f' The service {service} has been {action}ed', roxywi=1, login=1)
+	return 'ok'
diff --git a/app/modules/roxywi/user.py b/app/modules/roxywi/user.py
index 7a81d526..af4fc29a 100644
--- a/app/modules/roxywi/user.py
+++ b/app/modules/roxywi/user.py
@@ -1,128 +1,89 @@
 import os
 
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template, request
 
 import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
 import modules.roxywi.common as roxywi_common
-import modules.alerting.alerting as alerting
-
-form = common.form
+import modules.tools.alerting as alerting
 
 
-def create_user(new_user: str, email: str, password: str, role: str, activeuser: int, group: int, **kwargs) -> bool:
-    if roxywi_common.check_user_group(token=kwargs.get('token')):
-
-        if roxywi_auth.is_admin(level=2, role_id=kwargs.get('role_id')):
-            try:
-                user_id = sql.add_user(new_user, email, password, role, activeuser, group)
-                sql.update_user_role(user_id, group, role)
-                roxywi_common.logging(f'a new user {new_user}', ' has been created ', roxywi=1, login=1)
-                try:
-                    sql.update_user_role(user_id, group, role)
-                except Exception as e:
-                    print(f'error: cannot update user role {e}')
-                try:
-                    if password == 'aduser':
-                        password = 'your domain password'
-                    message = f"A user has been created for you on Roxy-WI portal!\n\n" \
-                              f"Now you can login to https://{os.environ.get('HTTP_HOST', '')}\n\n" \
-                              f"Your credentials are:\n" \
-                              f"Login: {new_user}\n" \
-                              f"Password: {password}"
-                    alerting.send_email(email, 'A user has been created for you', message)
-                except Exception as e:
-                    roxywi_common.logging('error: Cannot send email for a new user', e, roxywi=1, login=1)
-            except Exception as e:
-                print(f'error: Cannot create a new user: {e}')
-                roxywi_common.logging('error: Cannot create a new user', e, roxywi=1, login=1)
-                return False
-        else:
-            print('error: dalsdm')
-            roxywi_common.logging(new_user, ' tried to privilege escalation', roxywi=1, login=1)
-            return False
-
-    return True
+def create_user(new_user: str, email: str, password: str, role: str, activeuser: int, group: int) -> bool:
+    try:
+        user_id = sql.add_user(new_user, email, password, role, activeuser, group)
+        sql.update_user_role(user_id, group, role)
+        roxywi_common.logging(f'a new user {new_user}', ' has been created ', roxywi=1, login=1)
+        try:
+            sql.update_user_role(user_id, group, role)
+        except Exception as e:
+            raise Exception(f'error: cannot update user role {e}')
+        try:
+            if password == 'aduser':
+                password = 'your domain password'
+            message = f"A user has been created for you on Roxy-WI portal!\n\n" \
+                      f"Now you can login to https://{os.environ.get('HTTP_HOST', '')}\n\n" \
+                      f"Your credentials are:\n" \
+                      f"Login: {new_user}\n" \
+                      f"Password: {password}"
+            alerting.send_email(email, 'A user has been created for you', message)
+        except Exception as e:
+            roxywi_common.logging('error: Cannot send email for a new user', e, roxywi=1, login=1)
+    except Exception as e:
+        roxywi_common.logging('error: Cannot create a new user', e, roxywi=1, login=1)
+        raise Exception(f'error: Cannot create a new user: {e}')
+    else:
+        return True
 
 
-def delete_user():
-    userdel = int(form.getvalue('userdel'))
-    if sql.is_user_super_admin(userdel):
+def delete_user(user_id: int) -> str:
+    if sql.is_user_super_admin(user_id):
         count_super_admin_users = sql.get_super_admin_count()
         if count_super_admin_users < 2:
             raise Exception('error: you cannot delete a last user with superAdmin role')
-    user = sql.select_users(id=userdel)
+    user = sql.select_users(id=user_id)
     username = ''
     for u in user:
         username = u.username
-    if sql.delete_user(userdel):
-        sql.delete_user_groups(userdel)
+    if sql.delete_user(user_id):
+        sql.delete_user_groups(user_id)
         roxywi_common.logging(username, ' has been deleted user ', roxywi=1, login=1)
-        print("Ok")
+        return "ok"
 
 
-def update_user():
-    email = form.getvalue('email')
-    new_user = form.getvalue('updateuser')
-    user_id = form.getvalue('id')
-    activeuser = form.getvalue('activeuser')
-    group_id = int(form.getvalue('usergroup'))
-
-    if roxywi_common.check_user_group():
-        if form.getvalue('role'):
-            role_id = int(form.getvalue('role'))
-            if roxywi_auth.is_admin(level=role_id):
-                try:
-                    sql.update_user(new_user, email, role_id, user_id, activeuser)
-                except Exception as e:
-                    print(e)
-                sql.update_user_role(user_id, group_id, role_id)
-                roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1)
-            else:
-                roxywi_common.logging(new_user, ' tried to privilege escalation', roxywi=1, login=1)
-        else:
-            try:
-                sql.update_user_from_admin_area(new_user, email, user_id, activeuser)
-            except Exception as e:
-                print(e)
-            roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1)
+def update_user(email, new_user, user_id, enabled, group_id, role_id):
+    try:
+        sql.update_user(new_user, email, role_id, user_id, enabled)
+    except Exception as e:
+        print(e)
+    sql.update_user_role(user_id, group_id, role_id)
+    roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1)
 
 
-def update_user_password():
-    password = form.getvalue('updatepassowrd')
+def update_user_password(password, uuid, user_id_from_get):
     username = ''
 
-    if form.getvalue('uuid'):
-        user_id = sql.get_user_id_by_uuid(form.getvalue('uuid'))
+    if uuid:
+        user_id = sql.get_user_id_by_uuid(uuid)
     else:
-        user_id = form.getvalue('id')
+        user_id = user_id_from_get
     user = sql.select_users(id=user_id)
     for u in user:
         username = u.username
     sql.update_user_password(password, user_id)
-    roxywi_common.logging('user ' + username, ' has changed password ', roxywi=1, login=1)
-    print("Ok")
+    roxywi_common.logging(f'user {username}', ' has changed password ', roxywi=1, login=1)
+    return 'ok'
 
 
-def get_user_services() -> None:
-    user_id = common.checkAjaxInput(form.getvalue('getuserservices'))
-    lang = roxywi_common.get_user_lang()
+def get_user_services(user_id: int) -> None:
+    lang = roxywi_common.get_user_lang_for_flask()
     services = sql.select_services()
 
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/show_user_services.html')
-    template = template.render(user_services=sql.select_user_services(user_id), id=user_id, services=services, lang=lang)
-    print(template)
+    return render_template(
+        'ajax/user_services.html', user_services=sql.select_user_services(user_id), id=user_id, services=services, lang=lang
+    )
 
 
-def change_user_services() -> None:
-    import json
-
-    user_id = common.checkAjaxInput(form.getvalue('changeUserServicesId'))
-    user = common.checkAjaxInput(form.getvalue('changeUserServicesUser'))
+def change_user_services(user: str, user_id: int, user_services: str) -> str:
     services = ''
-    user_services = json.loads(form.getvalue('jsonDatas'))
 
     for k, v in user_services.items():
         for k2, v2 in v.items():
@@ -131,55 +92,42 @@ def change_user_services() -> None:
     try:
         if sql.update_user_services(services=services, user_id=user_id):
             roxywi_common.logging('Roxy-WI server', f'Access to the services has been updated for user: {user}', roxywi=1, login=1)
+            return 'ok'
     except Exception as e:
-        print(e)
+        return f'error: Cannot save: {e}'
 
 
-def change_user_active_group() -> None:
-    group_id = common.checkAjaxInput(form.getvalue('changeUserCurrentGroupId'))
-    user_uuid = common.checkAjaxInput(form.getvalue('changeUserGroupsUser'))
-
+def change_user_active_group(group_id: int, user_uuid: str) -> str:
     try:
         if sql.update_user_current_groups(group_id, user_uuid):
-            print('Ok')
+            return 'Ok'
         else:
-            print('error: Cannot change group')
+            return 'error: Cannot change group'
     except Exception as e:
-        print(e)
+        return f'error: Cannot change the group: {e}'
 
 
-def get_user_active_group(user_id: str, group: str) -> None:
-    group_id = sql.get_user_id_by_uuid(user_id.value)
+def get_user_active_group(uuid: str, group: str) -> str:
+    group_id = sql.get_user_id_by_uuid(uuid)
     groups = sql.select_user_groups_with_names(group_id)
-    lang = roxywi_common.get_user_lang()
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/show_user_current_group.html')
-    template = template.render(groups=groups, group=group.value, id=group_id, lang=lang)
-    print(template)
+    lang = roxywi_common.get_user_lang_for_flask()
+    return render_template('ajax/user_current_group.html', groups=groups, group=group, id=group_id, lang=lang)
 
 
-def show_user_groups_and_roles() -> None:
-    user_id = common.checkAjaxInput(form.getvalue('user_id'))
+def show_user_groups_and_roles(user_id: int, lang: str) -> None:
     groups = sql.select_user_groups_with_names(user_id, user_not_in_group=1)
     roles = sql.select_roles()
-    lang = roxywi_common.get_user_lang()
     user_groups = sql.select_user_groups_with_names(user_id)
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/show_user_groups_and_roles.html')
-    template = template.render(groups=groups, user_groups=user_groups, roles=roles, lang=lang)
-    print(template)
+    return render_template('ajax/user_groups_and_roles.html', groups=groups, user_groups=user_groups, roles=roles, lang=lang)
 
 
-def save_user_group_and_role() -> None:
+def save_user_group_and_role(user: str, groups_and_roles: str) -> str:
     import json
 
-    user = common.checkAjaxInput(form.getvalue('changeUserGroupsUser'))
-    groups_and_roles = json.loads(form.getvalue('jsonDatas'))
-
     for k, v in groups_and_roles.items():
         user_id = int(k)
         if not sql.delete_user_groups(user_id):
-            print('error: cannot delete old groups')
+            return 'error: Cannot delete old groups'
         for k2, v2 in v.items():
             group_id = int(k2)
             role_id = int(v2['role_id'])
@@ -190,13 +138,12 @@ def save_user_group_and_role() -> None:
                 break
         else:
             roxywi_common.logging('Roxy-WI server', f'Groups and roles have been updated for user: {user}', roxywi=1, login=1)
-            print('ok')
+            return 'ok'
 
 
-def get_ldap_email() -> None:
+def get_ldap_email(username) -> str:
     import ldap
 
-    username = common.checkAjaxInput(form.getvalue('get_ldap_email'))
     server = sql.get_setting('ldap_server')
     port = sql.get_setting('ldap_port')
     user = sql.get_setting('ldap_user')
@@ -224,8 +171,8 @@ def get_ldap_email() -> None:
 
         results = [entry for dn, entry in result if isinstance(entry, dict)]
         try:
-            print('["' + results[0][ldap_search_field][0].decode("utf-8") + '","' + domain + '"]')
+            return '["' + results[0][ldap_search_field][0].decode("utf-8") + '","' + domain + '"]'
         except Exception:
-            print('error: user not found')
+            return 'error: user not found'
     finally:
         ldap_bind.unbind()
diff --git a/app/modules/roxywi/waf.py b/app/modules/roxywi/waf.py
index 323680af..a0225da0 100644
--- a/app/modules/roxywi/waf.py
+++ b/app/modules/roxywi/waf.py
@@ -1,7 +1,4 @@
-import os
-import http.cookies
-
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template, request
 
 import modules.db.sql as sql
 import modules.common.common as common
@@ -12,19 +9,10 @@ form = common.form
 
 
 def waf_overview(serv, waf_service) -> None:
-    env = Environment(
-        loader=FileSystemLoader('templates/'), autoescape=True,
-        extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']
-    )
-    template = env.get_template('ajax/overivewWaf.html')
-
     servers = sql.select_servers(server=serv)
-    cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-    user_id = cookie.get('uuid')
-    group_id = cookie.get('group')
-    group_id = int(group_id.value)
-
-    config_path = ''
+    user_id = request.cookies.get('uuid')
+    group_id = int(request.cookies.get('group'))
+    role = sql.get_user_role_by_uuid(user_id, group_id)
     returned_servers = []
     waf = ''
     metrics_en = 0
@@ -77,17 +65,13 @@ def waf_overview(serv, waf_service) -> None:
 
         returned_servers.append(server_status)
 
-    lang = roxywi_common.get_user_lang()
+    lang = roxywi_common.get_user_lang_for_flask()
     servers_sorted = sorted(returned_servers, key=common.get_key)
-    template = template.render(service_status=servers_sorted, role=sql.get_user_role_by_uuid(user_id.value, group_id),
-                               waf_service=waf_service, lang=lang)
-    print(template)
+
+    return render_template('ajax/overivewWaf.html', service_status=servers_sorted, role=role, waf_service=waf_service, lang=lang)
 
 
-def change_waf_mode() -> None:
-    waf_mode = common.checkAjaxInput(form.getvalue('change_waf_mode'))
-    server_hostname = form.getvalue('server_hostname')
-    service = common.checkAjaxInput(form.getvalue('service'))
+def change_waf_mode(waf_mode: str, server_hostname: str, service: str) -> str:
     serv = sql.select_server_by_name(server_hostname)
 
     if service == 'haproxy':
@@ -96,19 +80,22 @@ def change_waf_mode() -> None:
         config_dir = sql.get_setting('nginx_dir')
 
     commands = [f"sudo sed -i 's/^SecRuleEngine.*/SecRuleEngine {waf_mode}/' {config_dir}/waf/modsecurity.conf"]
-    server_mod.ssh_command(serv, commands)
+
+    try:
+        server_mod.ssh_command(serv, commands)
+    except Exception as e:
+        return str(e)
+
     roxywi_common.logging(serv, f'Has been changed WAF mod to {waf_mode}', roxywi=1, login=1)
 
+    return 'ok'
 
-def switch_waf_rule(serv) -> None:
-    enable = common.checkAjaxInput(form.getvalue('waf_en'))
-    rule_id = common.checkAjaxInput(form.getvalue('waf_rule_id'))
 
+def switch_waf_rule(serv: str, enable: int, rule_id: int) -> str:
     haproxy_path = sql.get_setting('haproxy_dir')
     rule_file = sql.select_waf_rule_by_id(rule_id)
     conf_file_path = haproxy_path + '/waf/modsecurity.conf'
     rule_file_path = f'Include {haproxy_path}/waf/rules/{rule_file}'
-    print(rule_file_path)
 
     if enable == '0':
         cmd = ["sudo sed -i 's!" + rule_file_path + "!#" + rule_file_path + "!' " + conf_file_path]
@@ -123,15 +110,14 @@ def switch_waf_rule(serv) -> None:
     except Exception:
         pass
 
-    print(server_mod.ssh_command(serv, cmd))
     sql.update_enable_waf_rules(rule_id, serv, enable)
+    return server_mod.ssh_command(serv, cmd)
 
 
-def create_waf_rule(serv) -> None:
-    service = common.checkAjaxInput(form.getvalue('service'))
-    new_waf_rule = common.checkAjaxInput(form.getvalue('new_waf_rule'))
-    new_rule_desc = common.checkAjaxInput(form.getvalue('new_rule_description'))
-    rule_file = common.checkAjaxInput(form.getvalue('new_rule_file'))
+def create_waf_rule(serv, service) -> str:
+    new_waf_rule = common.checkAjaxInput(request.form.get('new_waf_rule'))
+    new_rule_desc = common.checkAjaxInput(request.form.get('new_rule_description'))
+    rule_file = common.checkAjaxInput(request.form.get('new_rule_file'))
     rule_file = f'{rule_file}.conf'
     waf_path = ''
 
@@ -144,11 +130,13 @@ def create_waf_rule(serv) -> None:
     rule_file_path = f'{waf_path}waf/rules/{rule_file}'
 
     cmd = [f"sudo echo Include {rule_file_path} >> {conf_file_path} && sudo touch {rule_file_path}"]
-    print(server_mod.ssh_command(serv, cmd))
-    print(sql.insert_new_waf_rule(new_waf_rule, rule_file, new_rule_desc, service, serv))
+    server_mod.ssh_command(serv, cmd)
+    sql.insert_new_waf_rule(new_waf_rule, rule_file, new_rule_desc, service, serv)
 
     try:
         roxywi_common.logging('WAF', f' A new rule has been created {rule_file} on the server {serv}',
                               roxywi=1, login=1)
     except Exception:
         pass
+
+    return 'ok'
diff --git a/app/modules/server/__init__.py b/app/modules/server/__init__.py
index 37e2fc10..dedaf7a8 100644
--- a/app/modules/server/__init__.py
+++ b/app/modules/server/__init__.py
@@ -1 +1 @@
-NAME = 'roxy-wi-server-modules'
+NAME = 'roxy-wi-server-module'
diff --git a/app/modules/server/server.py b/app/modules/server/server.py
index b23bd326..8df3b459 100644
--- a/app/modules/server/server.py
+++ b/app/modules/server/server.py
@@ -1,6 +1,6 @@
 import json
 
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template, request
 
 import modules.db.sql as sql
 import modules.server.ssh as mod_ssh
@@ -38,8 +38,6 @@ def ssh_command(server_ip: str, commands: list, **kwargs):
 				try:
 					if kwargs.get('raw'):
 						return stdout.readlines()
-					if kwargs.get("ip") == "1":
-						show_ip(stdout)
 					elif kwargs.get("show_log") == "1":
 						import modules.roxywi.logs as roxywi_logs
 
@@ -103,14 +101,6 @@ def get_remote_files(server_ip: str, config_dir: str, file_format: str):
 	return config_files
 
 
-def show_ip(stdout):
-	for line in stdout:
-		if "Permission denied" in line:
-			print(f'error: {line}')
-		else:
-			print(line)
-
-
 def get_system_info(server_ip: str) -> str:
 	server_ip = common.is_ip_or_dns(server_ip)
 	if server_ip == '':
@@ -123,7 +113,7 @@ def get_system_info(server_ip: str) -> str:
 	try:
 		sys_info_returned = ssh_command(server_ip, command, timeout=5)
 	except Exception as e:
-		raise e
+		raise Exception(e)
 
 	if 'not found' in sys_info_returned:
 		raise Exception(f'You should install lshw on the server {server_ip}. Update System info after installation.')
@@ -131,7 +121,7 @@ def get_system_info(server_ip: str) -> str:
 	try:
 		os_info = ssh_command(server_ip, command1)
 	except Exception as e:
-		raise e
+		raise Exception(e)
 
 	os_info = os_info.strip()
 	system_info = json.loads(sys_info_returned)
@@ -346,85 +336,54 @@ def get_system_info(server_ip: str) -> str:
 		raise e
 
 
-def show_system_info() -> None:
-	server_ip = form.getvalue('server_ip')
-	server_ip = common.is_ip_or_dns(server_ip)
-	server_id = form.getvalue('server_id')
-
-	if server_ip == '':
-		print('error: IP or DNS name is not valid')
-		return
-
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
-					  extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
-	env.globals['string_to_dict'] = common.string_to_dict
-	template = env.get_template('ajax/show_system_info.html')
+def show_system_info(server_ip: str, server_id: int) -> str:
 	if sql.is_system_info(server_id):
 		try:
 			get_system_info(server_ip)
+		except Exception as e:
+			return f'123 {e}'
+		try:
 			system_info = sql.select_one_system_info(server_id)
 
-			template = template.render(system_info=system_info, server_ip=server_ip, server_id=server_id)
-			print(template)
+			return render_template('ajax/show_system_info.html', system_info=system_info, server_ip=server_ip, server_id=server_id)
 		except Exception as e:
-			print(f'Cannot update server info: {e}')
+			return f'Cannot update server info: {e}'
 	else:
 		system_info = sql.select_one_system_info(server_id)
 
-		template = template.render(system_info=system_info, server_ip=server_ip, server_id=server_id)
-		print(template)
+		return render_template('ajax/show_system_info.html', system_info=system_info, server_ip=server_ip, server_id=server_id)
 
 
-def update_system_info() -> None:
-	server_ip = form.getvalue('server_ip')
-	server_ip = common.is_ip_or_dns(server_ip)
-	server_id = form.getvalue('server_id')
-
-	if server_ip == '':
-		print('error: IP or DNS name is not valid')
-		return
-
+def update_system_info(server_ip: str, server_id: int) -> str:
 	sql.delete_system_info(server_id)
 
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True,
-					  extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"])
-	env.globals['string_to_dict'] = common.string_to_dict
-	template = env.get_template('ajax/show_system_info.html')
-
 	try:
 		get_system_info(server_ip)
 		system_info = sql.select_one_system_info(server_id)
 
-		template = template.render(system_info=system_info, server_ip=server_ip, server_id=server_id)
-		print(template)
+		return render_template('ajax/show_system_info.html', system_info=system_info, server_ip=server_ip, server_id=server_id)
 	except Exception as e:
-		print(f'error: Cannot update server info: {e}')
+		return f'error: Cannot update server info: {e}'
 
 
-def show_firewalld_rules() -> None:
-	serv = common.checkAjaxInput(form.getvalue('viewFirewallRules'))
-
+def show_firewalld_rules(server_ip) -> str:
+	input_chain2 = []
 	cmd = ["sudo iptables -L INPUT -n --line-numbers|sed 's/  */ /g'|grep -v -E 'Chain|target'"]
 	cmd1 = ["sudo iptables -L IN_public_allow -n --line-numbers|sed 's/  */ /g'|grep -v -E 'Chain|target'"]
 	cmd2 = ["sudo iptables -L OUTPUT -n --line-numbers|sed 's/  */ /g'|grep -v -E 'Chain|target'"]
 
-	input_chain = ssh_command(serv, cmd, raw=1)
+	input_chain = ssh_command(server_ip, cmd, raw=1)
 
-	input_chain2 = []
 	for each_line in input_chain:
 		input_chain2.append(each_line.strip('\n'))
 
 	if 'error:' in input_chain:
-		print(input_chain)
-		return
+		return input_chain
 
-	in_public_allow = ssh_command(serv, cmd1, raw=1)
-	output_chain = ssh_command(serv, cmd2, raw=1)
-	lang = roxywi_common.get_user_lang()
-	env = Environment(loader=FileSystemLoader('templates'))
-	template = env.get_template('ajax/firewall_rules.html')
-	template = template.render(input_chain=input_chain2, IN_public_allow=in_public_allow, output_chain=output_chain, lang=lang)
-	print(template)
+	in_public_allow = ssh_command(server_ip, cmd1, raw=1)
+	output_chain = ssh_command(server_ip, cmd2, raw=1)
+	lang = roxywi_common.get_user_lang_for_flask()
+	return render_template('ajax/firewall_rules.html', input_chain=input_chain2, IN_public_allow=in_public_allow, output_chain=output_chain, lang=lang)
 
 
 def create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, haproxy, nginx, apache, firewall, **kwargs) -> bool:
@@ -437,7 +396,7 @@ def create_server(hostname, ip, group, typeip, enable, master, cred, port, desc,
 		return False
 
 
-def update_server_after_creating(hostname: str, ip: str, scan_server: int) -> None:
+def update_server_after_creating(hostname: str, ip: str, scan_server: int) -> str:
 	try:
 		try:
 			sql.insert_new_checker_setting_for_server(ip)
@@ -481,8 +440,10 @@ def update_server_after_creating(hostname: str, ip: str, scan_server: int) -> No
 		roxywi_common.logging(f'Cannot get information from {hostname}', str(e), roxywi=1, login=1)
 		raise Exception(f'error: Cannot get information from {hostname} {e}')
 
+	return 'ok'
 
-def delete_server(server_id: int) -> None:
+
+def delete_server(server_id: int) -> str:
 	server = sql.select_servers(id=server_id)
 	server_ip = ''
 	hostname = ''
@@ -492,11 +453,9 @@ def delete_server(server_id: int) -> None:
 		server_ip = s[2]
 
 	if sql.check_exists_backup(server_ip):
-		print('warning: Delete the backup first')
-		return
+		return 'warning: Delete the backup first'
 	if sql.check_exists_s3_backup(server_ip):
-		print('warning: Delete the S3 backup first')
-		return
+		return 'warning: Delete the S3 backup first'
 	if sql.delete_server(server_id):
 		sql.delete_waf_server(server_id)
 		sql.delete_port_scanner_settings(server_id)
@@ -504,34 +463,25 @@ def delete_server(server_id: int) -> None:
 		sql.delete_action_history(server_id)
 		sql.delete_system_info(server_id)
 		sql.delete_service_settings(server_id)
-		print("Ok")
 		roxywi_common.logging(server_ip, f'The server {hostname} has been deleted', roxywi=1, login=1)
+		return 'Ok'
 
 
-def server_is_up(server_ip: str) -> None:
+def server_is_up(server_ip: str) -> str:
 	cmd = [f'if ping -c 1 -W 1 {server_ip} >> /dev/null; then echo up; else echo down; fi']
 	server_status, stderr = subprocess_execute(cmd)
-	print(server_status)
+	return server_status[0]
 
 
-def show_server_services() -> None:
-	server_id = common.checkAjaxInput(form.getvalue('server_id'))
+def show_server_services(server_id: int) -> None:
 	server = sql.select_servers(id=server_id)
-	env = Environment(loader=FileSystemLoader('templates'))
-	template = env.get_template('ajax/show_server_services.html')
-	lang = roxywi_common.get_user_lang()
-	template = template.render(server=server, lang=lang)
-	print(template)
+	lang = roxywi_common.get_user_lang_for_flask()
+	return render_template('ajax/show_server_services.html', server=server, lang=lang)
 
 
-def change_server_services() -> None:
-	import json
-
-	server_id = common.checkAjaxInput(form.getvalue('changeServerServicesId'))
-	server_name = common.checkAjaxInput(form.getvalue('changeServerServicesServer'))
+def change_server_services(server_id: int, server_name: str, server_services: str) -> str:
 	services = sql.select_services()
 	services_status = {}
-	server_services = json.loads(form.getvalue('jsonDatas'))
 
 	for k, v in server_services.items():
 		for service in services:
@@ -541,5 +491,6 @@ def change_server_services() -> None:
 	try:
 		if sql.update_server_services(server_id, services_status[1], services_status[2], services_status[4], services_status[3]):
 			roxywi_common.logging('Roxy-WI server', f'Active services have been updated for {server_name}', roxywi=1, login=1)
+			return 'ok'
 	except Exception as e:
-		print(e)
+		return f'error: {e}'
diff --git a/app/modules/server/ssh.py b/app/modules/server/ssh.py
index a4a74d8a..fa2469be 100644
--- a/app/modules/server/ssh.py
+++ b/app/modules/server/ssh.py
@@ -1,6 +1,7 @@
 import os
 
 import paramiko
+from flask import render_template, request
 
 import modules.db.sql as sql
 import modules.common.common as common
@@ -16,7 +17,6 @@ get_config = roxy_wi_tools.GetConfigVar()
 def return_ssh_keys_path(server_ip: str, **kwargs) -> dict:
 	lib_path = get_config.get_config_var('main', 'lib_path')
 	ssh_settings = {}
-
 	if kwargs.get('id'):
 		sshs = sql.select_ssh(id=kwargs.get('id'))
 	else:
@@ -29,8 +29,11 @@ def return_ssh_keys_path(server_ip: str, **kwargs) -> dict:
 		ssh_key = f'{lib_path}/keys/{ssh.name}.pem' if ssh.enable == 1 else ''
 		ssh_settings.setdefault('key', ssh_key)
 
-	ssh_port = [str(server[10]) for server in sql.select_servers(server=server_ip)]
-	ssh_settings.setdefault('port', ssh_port[0])
+	try:
+		ssh_port = [str(server[10]) for server in sql.select_servers(server=server_ip)]
+		ssh_settings.setdefault('port', ssh_port[0])
+	except Exception as e:
+		raise Exception(f'error: Cannot get SSH settings: {e}')
 
 	return ssh_settings
 
@@ -48,29 +51,24 @@ def ssh_connect(server_ip):
 	return ssh
 
 
-def create_ssh_cred() -> None:
-	from jinja2 import Environment, FileSystemLoader
-
-	name = common.checkAjaxInput(form.getvalue('new_ssh'))
-	enable = common.checkAjaxInput(form.getvalue('ssh_enable'))
-	group = common.checkAjaxInput(form.getvalue('new_group'))
+def create_ssh_cred() -> str:
+	name = common.checkAjaxInput(request.form.get('new_ssh'))
+	enable = common.checkAjaxInput(request.form.get('ssh_enable'))
+	group = common.checkAjaxInput(request.form.get('new_group'))
 	group_name = sql.get_group_name_by_id(group)
-	username = common.checkAjaxInput(form.getvalue('ssh_user'))
-	password = common.checkAjaxInput(form.getvalue('ssh_pass'))
-	page = common.checkAjaxInput(form.getvalue('page'))
+	username = common.checkAjaxInput(request.form.get('ssh_user'))
+	password = common.checkAjaxInput(request.form.get('ssh_pass'))
+	page = common.checkAjaxInput(request.form.get('page'))
 	page = page.split("#")[0]
-	lang = roxywi_common.get_user_lang()
+	lang = roxywi_common.get_user_lang_for_flask()
 	name = f'{name}_{group_name}'
 
 	if username is None or name is None:
-		print(error_mess)
+		return error_mess
 	else:
 		if sql.insert_new_ssh(name, enable, group, username, password):
-			env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-			template = env.get_template('ajax/new_ssh.html')
-			output_from_parsed_template = template.render(groups=sql.select_groups(), sshs=sql.select_ssh(name=name), page=page, lang=lang)
-			print(output_from_parsed_template)
 			roxywi_common.logging('Roxy-WI server', f'New SSH credentials {name} has been created', roxywi=1, login=1)
+			return render_template('ajax/new_ssh.html', groups=sql.select_groups(), sshs=sql.select_ssh(name=name), page=page, lang=lang)
 
 
 def create_ssh_cread_api(name: str, enable: str, group: str, username: str, password: str) -> bool:
@@ -90,7 +88,7 @@ def create_ssh_cread_api(name: str, enable: str, group: str, username: str, pass
 			return True
 
 
-def upload_ssh_key(name: str, user_group: str, key: str) -> bool:
+def upload_ssh_key(name: str, user_group: str, key: str) -> str:
 	if '..' in name:
 		raise Exception('error: nice try')
 
@@ -125,28 +123,27 @@ def upload_ssh_key(name: str, user_group: str, key: str) -> bool:
 	except Exception as e:
 		raise Exception(f'error: Cannot save SSH key file: {e}')
 	else:
-		print(f'success: SSH key has been saved into: {ssh_keys}')
+		try:
+			os.chmod(ssh_keys, 0o600)
+		except IOError as e:
+			roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
+			raise Exception(f'error: something went wrong: {e}')
 
-	try:
-		os.chmod(ssh_keys, 0o600)
-	except IOError as e:
-		roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
-		raise Exception(f'error: something went wrong: {e}')
-
-	roxywi_common.logging("Roxy-WI server", f"A new SSH cert has been uploaded {ssh_keys}", roxywi=1, login=1)
+		roxywi_common.logging("Roxy-WI server", f"A new SSH cert has been uploaded {ssh_keys}", roxywi=1, login=1)
+		return f'success: SSH key has been saved into: {ssh_keys}'
 
 
-def update_ssh_key() -> None:
-	ssh_id = common.checkAjaxInput(form.getvalue('id'))
-	name = common.checkAjaxInput(form.getvalue('name'))
-	enable = common.checkAjaxInput(form.getvalue('ssh_enable'))
-	group = common.checkAjaxInput(form.getvalue('group'))
-	username = common.checkAjaxInput(form.getvalue('ssh_user'))
-	password = common.checkAjaxInput(form.getvalue('ssh_pass'))
+def update_ssh_key() -> str:
+	ssh_id = common.checkAjaxInput(request.form.get('id'))
+	name = common.checkAjaxInput(request.form.get('name'))
+	enable = common.checkAjaxInput(request.form.get('ssh_enable'))
+	group = common.checkAjaxInput(request.form.get('group'))
+	username = common.checkAjaxInput(request.form.get('ssh_user'))
+	password = common.checkAjaxInput(request.form.get('ssh_pass'))
 	new_ssh_key_name = ''
 
 	if username is None:
-		print(error_mess)
+		return error_mess
 	else:
 		lib_path = get_config.get_config_var('main', 'lib_path')
 
@@ -162,15 +159,16 @@ def update_ssh_key() -> None:
 		sql.update_ssh(ssh_id, name, enable, group, username, password)
 		roxywi_common.logging('Roxy-WI server', f'The SSH credentials {name} has been updated ', roxywi=1, login=1)
 
+		return 'ok'
 
-def delete_ssh_key() -> None:
+
+def delete_ssh_key(ssh_id) -> str:
 	lib_path = get_config.get_config_var('main', 'lib_path')
-	sshdel = common.checkAjaxInput(form.getvalue('sshdel'))
 	name = ''
 	ssh_enable = 0
 	ssh_key_name = ''
 
-	for sshs in sql.select_ssh(id=sshdel):
+	for sshs in sql.select_ssh(id=ssh_id):
 		ssh_enable = sshs.enable
 		name = sshs.name
 		ssh_key_name = f'{lib_path}/keys/{sshs.name}.pem'
@@ -180,6 +178,6 @@ def delete_ssh_key() -> None:
 			os.remove(ssh_key_name)
 		except Exception:
 			pass
-	if sql.delete_ssh(sshdel):
-		print("Ok")
+	if sql.delete_ssh(ssh_id):
 		roxywi_common.logging('Roxy-WI server', f'The SSH credentials {name} has deleted', roxywi=1, login=1)
+		return 'ok'
diff --git a/app/modules/service/action.py b/app/modules/service/action.py
index ec36f909..2aab9cca 100644
--- a/app/modules/service/action.py
+++ b/app/modules/service/action.py
@@ -5,12 +5,21 @@ import modules.roxywi.common as roxywi_common
 import modules.service.common as service_common
 
 
-def action_haproxy(server_ip: str, action: str) -> None:
-    haproxy_service_name = "haproxy"
+def common_action(server_ip: str, action: str, service: str) -> str:
+    action_functions = {
+        'haproxy': action_haproxy,
+        'nginx': action_nginx,
+        'keepalived': action_keepalived,
+        'apache': action_apache,
+        'waf_haproxy': action_haproxy_waf,
+        'waf_nginx': action_nginx_waf
+    }
 
-    if action not in ('start', 'stop', 'reload', 'restart'):
-        print('error: wrong action')
-        return
+    return action_functions[service](server_ip, action)
+
+
+def action_haproxy(server_ip: str, action: str) -> str:
+    haproxy_service_name = "haproxy"
 
     service_common.is_restarted(server_ip, action)
 
@@ -31,16 +40,12 @@ def action_haproxy(server_ip: str, action: str) -> None:
             commands = [f"sudo systemctl {action} {haproxy_service_name}"]
         server_mod.ssh_command(server_ip, commands, timeout=5)
         roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='haproxy')
-        print(f"success: HAProxy has been {action}")
+        return f"success: HAProxy has been {action}"
     else:
-        print("error: Bad config, check please")
+        return "error: Bad config, check please"
 
 
-def action_nginx(server_ip: str, action: str) -> None:
-    if action not in ('start', 'stop', 'reload', 'restart'):
-        print('error: wrong action')
-        return
-
+def action_nginx(server_ip: str, action: str) -> str:
     service_common.is_restarted(server_ip, action)
 
     if service_common.check_nginx_config(server_ip):
@@ -57,29 +62,21 @@ def action_nginx(server_ip: str, action: str) -> None:
             commands = [f"sudo systemctl {action} nginx"]
         server_mod.ssh_command(server_ip, commands, timeout=5)
         roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='nginx')
-        print(f"success: NGINX has been {action}")
+        return f"success: NGINX has been {action}"
     else:
-        print("error: Bad config, check please")
+        return "error: Bad config, check please"
 
 
-def action_keepalived(server_ip: str, action: str) -> None:
-    if action not in ('start', 'stop', 'reload', 'restart'):
-        print('error: wrong action')
-        return
-
+def action_keepalived(server_ip: str, action: str) -> str:
     service_common.is_restarted(server_ip, action)
 
     commands = [f"sudo systemctl {action} keepalived"]
     server_mod.ssh_command(server_ip, commands)
     roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='keepalived')
-    print(f"success: Keepalived has been {action}")
+    return f"success: Keepalived has been {action}"
 
 
-def action_apache(server_ip: str, action: str) -> None:
-    if action not in ('start', 'stop', 'reload', 'restart'):
-        print('error: wrong action')
-        return
-
+def action_apache(server_ip: str, action: str) -> str:
     service_common.is_restarted(server_ip, action)
 
     server_id = sql.select_server_id_by_ip(server_ip)
@@ -97,29 +94,22 @@ def action_apache(server_ip: str, action: str) -> None:
         commands = [f"sudo systemctl {action} {service_apache_name}"]
     server_mod.ssh_command(server_ip, commands, timeout=5)
     roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='apache')
-    print(f"success: Apache has been {action}")
+    return f"success: Apache has been {action}"
 
 
-def action_haproxy_waf(server_ip: str, action: str) -> None:
-    if action not in ('start', 'stop', 'reload', 'restart'):
-        print('error: wrong action')
-        return
-
+def action_haproxy_waf(server_ip: str, action: str) -> str:
     service_common.is_restarted(server_ip, action)
 
     roxywi_common.logging(server_ip, f'HAProxy WAF service has been {action}ed', roxywi=1, login=1, keep_history=1,
                   service='haproxy')
     commands = [f"sudo systemctl {action} waf"]
     server_mod.ssh_command(server_ip, commands)
+    return f"success: WAF has been {action}"
 
 
-def action_nginx_waf(server_ip: str, action: str) -> None:
+def action_nginx_waf(server_ip: str, action: str) -> str:
     config_dir = common.return_nice_path(sql.get_setting('nginx_dir'))
 
-    if action not in ('start', 'stop'):
-        print('error: wrong action')
-        return
-
     service_common.is_restarted(server_ip, action)
 
     waf_new_state = 'on' if action == 'start' else 'off'
@@ -131,12 +121,14 @@ def action_nginx_waf(server_ip: str, action: str) -> None:
                 f" && sudo systemctl reload nginx"]
     server_mod.ssh_command(server_ip, commands)
 
+    return f"success: Apache has been {action}"
 
-def check_service(server_ip: str, user_uuid: str, service: str) -> None:
+
+def check_service(server_ip: str, user_uuid: str, service: str) -> str:
     import socket
     from contextlib import closing
 
-    user_id = sql.get_user_id_by_uuid(user_uuid.value)
+    user_id = sql.get_user_id_by_uuid(user_uuid)
     user_services = sql.select_user_services(user_id)
 
     if '1' in user_services:
@@ -146,10 +138,9 @@ def check_service(server_ip: str, user_uuid: str, service: str) -> None:
             out = server_mod.subprocess_execute(cmd)
             for k in out[0]:
                 if "Name" in k:
-                    print('up')
-                    break
+                    return 'up'
             else:
-                print('down')
+                return 'down'
     if '2' in user_services:
         if service == 'nginx':
             nginx_stats_port = sql.get_setting('nginx_stats_port')
@@ -159,11 +150,11 @@ def check_service(server_ip: str, user_uuid: str, service: str) -> None:
 
                 try:
                     if sock.connect_ex((server_ip, nginx_stats_port)) == 0:
-                        print('up')
+                        return 'up'
                     else:
-                        print('down')
-                except Exception:
-                    print('down')
+                        return 'down'
+                except Exception as e:
+                    return 'down' + str(e)
     if '4' in user_services:
         if service == 'apache':
             apache_stats_port = sql.get_setting('apache_stats_port')
@@ -173,8 +164,8 @@ def check_service(server_ip: str, user_uuid: str, service: str) -> None:
 
                 try:
                     if sock.connect_ex((server_ip, apache_stats_port)) == 0:
-                        print('up')
+                        return 'up'
                     else:
-                        print('down')
+                        return 'down'
                 except Exception as e:
-                    print('down' + str(e))
+                    return 'down' + str(e)
diff --git a/app/modules/service/backup.py b/app/modules/service/backup.py
index 0bca4f43..6b9328c1 100644
--- a/app/modules/service/backup.py
+++ b/app/modules/service/backup.py
@@ -1,6 +1,6 @@
 import os
 
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template
 
 import modules.db.sql as sql
 import modules.server.ssh as ssh_mod
@@ -9,9 +9,10 @@ import modules.roxywi.common as roxywi_common
 import modules.service.installation as installation_mod
 
 
-def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, description) -> None:
+def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, description) -> str:
     script = 'backup.sh'
-    ssh_settings = ssh_mod.return_ssh_keys_path('localhost', id=cred)
+    ssh_settings = ssh_mod.return_ssh_keys_path(rserver, id=cred)
+    full_path = '/var/www/haproxy-wi/app'
 
     if deljob:
         time = ''
@@ -22,54 +23,53 @@ def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, descri
     else:
         deljob = ''
         if sql.check_exists_backup(serv):
-            print(f'warning: Backup job for {serv} already exists')
-            return None
+            return f'warning: Backup job for {serv} already exists'
 
-    os.system(f"cp scripts/{script} .")
+    os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
 
     commands = [
-        f"chmod +x {script} && ./{script} HOST={rserver} SERVER={serv} TYPE={backup_type} SSH_PORT={ssh_settings['port']} "
+        f"chmod +x {full_path}/{script} && {full_path}/{script} HOST={rserver} SERVER={serv} TYPE={backup_type} SSH_PORT={ssh_settings['port']} "
         f"TIME={time} RPATH={rpath} DELJOB={deljob} USER={ssh_settings['user']} KEY={ssh_settings['key']}"
     ]
 
     output, error = server_mod.subprocess_execute(commands[0])
 
+    try:
+        os.remove(f'{full_path}/{script}')
+    except Exception:
+        pass
+
     for line in output:
         if any(s in line for s in ("Traceback", "FAILED")):
             try:
-                print(f'error: {line}')
-                break
+                return f'error: {line}'
             except Exception:
-                print(f'error: {output}')
-                break
+                return f'error: {output}'
     else:
         if not deljob and not update:
             if sql.insert_backup_job(serv, rserver, rpath, backup_type, time, cred, description):
-                env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
-                template = env.get_template('new_backup.html')
-                template = template.render(
-                    backups=sql.select_backups(server=serv, rserver=rserver), sshs=sql.select_ssh()
+                roxywi_common.logging('backup ', f' a new backup job for server {serv} has been created', roxywi=1,
+                                      login=1)
+                return render_template(
+                    'ajax/new_backup.html',backups=sql.select_backups(server=serv, rserver=rserver), sshs=sql.select_ssh()
                 )
-                print(template)
-                print('success: Backup job has been created')
-                roxywi_common.logging('backup ', f' a new backup job for server {serv} has been created', roxywi=1, login=1)
+
             else:
-                print('error: Cannot add the job into DB')
+                raise Exception('error: Cannot add the job into DB')
         elif deljob:
             sql.delete_backups(deljob)
-            print('Ok')
             roxywi_common.logging('backup ', f' a backup job for server {serv} has been deleted', roxywi=1, login=1)
+            return 'ok'
         elif update:
             sql.update_backup(serv, rserver, rpath, backup_type, time, cred, description, update)
-            print('Ok')
             roxywi_common.logging('backup ', f' a backup job for server {serv} has been updated', roxywi=1, login=1)
-
-    os.remove(script)
+            return 'ok'
 
 
-def s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description) -> None:
+def s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description) -> str:
     script = 's3_backup.sh'
     tag = 'add'
+    full_path = '/var/www/haproxy-wi/app'
 
     if deljob:
         time = ''
@@ -80,36 +80,38 @@ def s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, d
         if sql.check_exists_s3_backup(server):
             raise Exception(f'error: Backup job for {server} already exists')
 
-    os.system(f"cp scripts/{script} .")
+    os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
 
     commands = [
-        f"chmod +x {script} && ./{script} SERVER={server} S3_SERVER={s3_server} BUCKET={bucket} SECRET_KEY={secret_key} ACCESS_KEY={access_key} TIME={time} TAG={tag}"
+        f"chmod +x {full_path}/{script} && {full_path}/{script} SERVER={server} S3_SERVER={s3_server} BUCKET={bucket} "
+        f"SECRET_KEY={secret_key} ACCESS_KEY={access_key} TIME={time} TAG={tag}"
     ]
 
     return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-    if not deljob and not update:
+    try:
+        os.remove(f'{full_path}/{script}')
+    except Exception:
+        pass
+
+    if not deljob:
         try:
-            if installation_mod.show_installation_output(return_out['error'], return_out['output'], 'S3 backup', rc=return_out['rc'], api=1):
+            if installation_mod.show_installation_output(return_out['error'], return_out['output'], 'S3 backup', rc=return_out['rc']):
                 try:
                     sql.insert_s3_backup_job(server, s3_server, bucket, secret_key, access_key, time, description)
                 except Exception as e:
                     raise Exception(f'error: {e}')
         except Exception as e:
             raise Exception(e)
-        env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
-        template = env.get_template('new_s3_backup.html')
-        template = template.render(backups=sql.select_s3_backups(server=server, s3_server=s3_server, bucket=bucket))
-        print(template)
-        print('success: Backup job has been created')
         roxywi_common.logging('backup ', f' a new S3 backup job for server {server} has been created', roxywi=1, login=1)
+        return render_template('ajax/new_s3_backup.html', backups=sql.select_s3_backups(server=server, s3_server=s3_server, bucket=bucket))
     elif deljob:
         sql.delete_s3_backups(deljob)
-        print('Ok')
         roxywi_common.logging('backup ', f' a S3 backup job for server {server} has been deleted', roxywi=1, login=1)
+        return 'ok'
 
 
-def git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description) -> None:
+def git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description) -> str:
     servers = roxywi_common.get_dick_permit()
     proxy = sql.get_setting('proxy')
     services = sql.select_services()
@@ -119,8 +121,9 @@ def git_backup(server_id, service_id, git_init, repo, branch, period, cred, delj
     script = 'git_backup.sh'
     proxy_serv = ''
     ssh_settings = ssh_mod.return_ssh_keys_path('localhost', id=int(cred))
+    full_path = '/var/www/haproxy-wi/app'
 
-    os.system(f"cp scripts/{script} .")
+    os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
 
     if proxy is not None and proxy != '' and proxy != 'None':
         proxy_serv = proxy
@@ -131,21 +134,24 @@ def git_backup(server_id, service_id, git_init, repo, branch, period, cred, delj
         branch = 'main'
 
     commands = [
-        f"chmod +x {script} && ./{script} HOST={server_ip} DELJOB={deljob} SERVICE={service_name} INIT={git_init} "
+        f"chmod +x {full_path}/{script} && {full_path}/{script} HOST={server_ip} DELJOB={deljob} SERVICE={service_name} INIT={git_init} "
         f"SSH_PORT={ssh_settings['port']} PERIOD={period} REPO={repo} BRANCH={branch} CONFIG_DIR={service_config_dir} "
         f"PROXY={proxy_serv} USER={ssh_settings['user']} KEY={ssh_settings['key']}"
     ]
 
     output, error = server_mod.subprocess_execute(commands[0])
 
+    try:
+        os.remove(f'{full_path}/{script}')
+    except Exception:
+        pass
+
     for line in output:
         if any(s in line for s in ("Traceback", "FAILED")):
             try:
-                print('error: ' + line)
-                break
+                return 'error: ' + line
             except Exception:
-                print('error: ' + output)
-                break
+                return 'error: ' + output
     else:
         if deljob == '0':
             if sql.insert_new_git(
@@ -155,16 +161,12 @@ def git_backup(server_id, service_id, git_init, repo, branch, period, cred, delj
                 gits = sql.select_gits(server_id=server_id, service_id=service_id)
                 sshs = sql.select_ssh()
 
-                lang = roxywi_common.get_user_lang()
-                env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
-                template = env.get_template('new_git.html')
-                template = template.render(gits=gits, sshs=sshs, servers=servers, services=services, new_add=1, lang=lang)
-                print(template)
-                print('success: Git job has been created')
+                lang = roxywi_common.get_user_lang_for_flask()
                 roxywi_common.logging(
-                    server_ip, ' A new git job has been created', roxywi=1, login=1, keep_history=1, service=service_name
+                    server_ip, ' A new git job has been created', roxywi=1, login=1, keep_history=1,
+                    service=service_name
                 )
+                return render_template('ajax/new_git.html', gits=gits, sshs=sshs, servers=servers, services=services, new_add=1, lang=lang)
         else:
             if sql.delete_git(form.getvalue('git_backup')):
-                print('Ok')
-    os.remove(script)
+                return 'ok'
diff --git a/app/modules/service/common.py b/app/modules/service/common.py
index a9d7c732..f574e31a 100644
--- a/app/modules/service/common.py
+++ b/app/modules/service/common.py
@@ -1,5 +1,7 @@
 import os
-import http.cookies
+
+import requests
+from flask import render_template, request
 
 import modules.db.sql as sql
 import modules.server.ssh as mod_ssh
@@ -7,6 +9,7 @@ import modules.common.common as common
 import modules.server.server as server_mod
 import modules.roxywi.common as roxywi_common
 import modules.roxy_wi_tools as roxy_wi_tools
+import modules.config.section as section_mod
 
 time_zone = sql.get_setting('time_zone')
 get_date = roxy_wi_tools.GetDate(time_zone)
@@ -25,11 +28,10 @@ def check_haproxy_version(server_ip):
 
 
 def is_restarted(server_ip: str, action: str) -> None:
-	cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-	user_uuid = cookie.get('uuid')
-	group_id = cookie.get('group')
-	group_id = int(group_id.value)
-	user_role = sql.get_user_role_by_uuid(user_uuid.value, group_id)
+	user_uuid = request.cookies.get('uuid')
+	group_id = request.cookies.get('group')
+	group_id = int(group_id)
+	user_role = sql.get_user_role_by_uuid(user_uuid, group_id)
 
 	if sql.is_serv_protected(server_ip) and int(user_role) > 2:
 		print(f'error: This server is protected. You cannot {action} it')
@@ -42,26 +44,22 @@ def is_not_allowed_to_restart(server_id: int, service: str) -> None:
 	else:
 		is_restart = 0
 
-	try:
-		if int(is_restart) == 1:
-			print('warning: this service is not allowed to be restarted')
-			return
-	except Exception:
-		pass
+	if int(is_restart) == 1:
+		raise Exception('warning: This service is not allowed to be restarted')
 
 
 def get_exp_version(server_ip: str, service_name: str) -> str:
 	server_ip = common.is_ip_or_dns(server_ip)
-	if service_name == 'haproxy_exporter':
+	if service_name == 'haproxy':
 		commands = ["/opt/prometheus/exporters/haproxy_exporter --version 2>&1 |head -1|awk '{print $3}'"]
-	elif service_name == 'nginx_exporter':
+	elif service_name == 'nginx':
 		commands = ["/opt/prometheus/exporters/nginx_exporter 2>&1 |head -1 |awk -F\"=\" '{print $2}'|awk '{print $1}'"]
-	elif service_name == 'node_exporter':
+	elif service_name == 'node':
 		commands = ["node_exporter --version 2>&1 |head -1|awk '{print $3}'"]
-	elif service_name == 'apache_exporter':
+	elif service_name == 'apache':
 		commands = ["/opt/prometheus/exporters/apache_exporter --version 2>&1 |head -1|awk '{print $3}'"]
-	elif service_name == 'keepalived_exporter':
-		commands = ["systemctl list-units --full -all |grep keepalived_exporter"]
+	elif service_name == 'keepalived':
+		commands = ["keepalived_exporter --version 2>&1 |head -1|awk '{print $2}'"]
 
 	ver = server_mod.ssh_command(server_ip, commands)
 
@@ -137,21 +135,16 @@ def check_nginx_config(server_ip):
 
 
 def overview_backends(server_ip: str, service: str) -> None:
-	from jinja2 import Environment, FileSystemLoader
-
 	import modules.config.config as config_mod
-	import modules.config.section as section_mod
-	import modules.roxywi.common as roxywi_common
 
-	env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-	template = env.get_template('ajax/haproxyservers_backends.html')
+	lang = roxywi_common.get_user_lang_for_flask()
 	format_file = 'cfg'
 
 	if service == 'haproxy':
 		configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
 		format_file = 'cfg'
 	elif service == 'keepalived':
-		configs_dir = get_config.get_config_var('configs', 'kp_save_configs_dir')
+		configs_dir = get_config.get_config_var('configs', 'keepalived_save_configs_dir')
 		format_file = 'conf'
 
 	if service != 'nginx' and service != 'apache':
@@ -180,11 +173,10 @@ def overview_backends(server_ip: str, service: str) -> None:
 	else:
 		sections = section_mod.get_remote_sections(server_ip, service)
 
-	template = template.render(backends=sections, serv=server_ip, service=service)
-	print(template)
+	return render_template('ajax/haproxyservers_backends.html', backends=sections, serv=server_ip, service=service, lang=lang)
 
 
-def get_overview_last_edit(server_ip: str, service: str) -> None:
+def get_overview_last_edit(server_ip: str, service: str) -> str:
 	if service == 'nginx':
 		config_path = sql.get_setting('nginx_config_path')
 	elif service == 'keepalived':
@@ -193,65 +185,12 @@ def get_overview_last_edit(server_ip: str, service: str) -> None:
 		config_path = sql.get_setting('haproxy_config_path')
 	commands = ["ls -l %s |awk '{ print $6\" \"$7\" \"$8}'" % config_path]
 	try:
-		print(server_mod.ssh_command(server_ip, commands))
+		return server_mod.ssh_command(server_ip, commands)
 	except Exception as e:
-		print(f'error: Cannot get last date {e} for server {server_ip}')
+		return f'error: Cannot get last date {e} for server {server_ip}'
 
 
-def overview_service(server_ip: str, server_id: int, name: str, service: str) -> None:
-	import asyncio
-	from jinja2 import Environment, FileSystemLoader
-
-	user_params = roxywi_common.get_users_params()
-
-	async def async_get_overviewServers(serv1, serv2, service):
-		if service == 'haproxy':
-			cmd = 'echo "show info" |nc %s %s -w 1|grep -e "node\|Nbproc\|Maxco\|MB\|Nbthread"' % (
-				serv2, sql.get_setting('haproxy_sock_port'))
-			out = server_mod.subprocess_execute(cmd)
-			return_out = ""
-
-			for k in out:
-				if "Ncat:" not in k:
-					for r in k:
-						return_out += r
-						return_out += "<br />"
-				else:
-					return_out = "Cannot connect to HAProxy"
-		else:
-			return_out = ''
-
-		server_status = (serv1, serv2, return_out)
-		return server_status
-
-	async def get_runner_overviewServers(**kwargs):
-		env = Environment(loader=FileSystemLoader('templates/'), extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'])
-		template = env.get_template('ajax/overviewServers.html')
-
-		servers = []
-		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-		user_id = cookie.get('uuid')
-		group_id = cookie.get('group')
-		group_id = int(group_id.value)
-		role = sql.get_user_role_by_uuid(user_id.value, group_id)
-		futures = [async_get_overviewServers(kwargs.get('server1'), kwargs.get('server2'), kwargs.get('service'))]
-
-		for i, future in enumerate(asyncio.as_completed(futures)):
-			result = await future
-			servers.append(result)
-		servers_sorted = sorted(servers, key=common.get_key)
-		template = template.render(service_status=servers_sorted, role=role, id=kwargs.get('id'), service_page=service, lang=user_params['lang'])
-		print(template)
-
-	ioloop = asyncio.get_event_loop()
-	ioloop.run_until_complete(get_runner_overviewServers(server1=name, server2=server_ip, id=server_id, service=service))
-	ioloop.close()
-
-
-def get_stat_page(server_ip: str, service: str) -> None:
-	import requests
-	from jinja2 import Environment, FileSystemLoader
-
+def get_stat_page(server_ip: str, service: str) -> str:
 	if service in ('nginx', 'apache'):
 		stats_user = sql.get_setting(f'{service}_stats_user')
 		stats_pass = sql.get_setting(f'{service}_stats_password')
@@ -265,24 +204,21 @@ def get_stat_page(server_ip: str, service: str) -> None:
 	try:
 		response = requests.get(f'http://{server_ip}:{stats_port}/{stats_page}', auth=(stats_user, stats_pass))
 	except requests.exceptions.ConnectTimeout:
-		print('error: Oops. Connection timeout occurred!')
+		return 'error: Oops. Connection timeout occurred!'
 	except requests.exceptions.ReadTimeout:
-		print('error: Oops. Read timeout occurred')
+		return 'error: Oops. Read timeout occurred'
 	except requests.exceptions.HTTPError as errh:
-		print("error: Http Error:", errh)
+		return f'error: Http Error: {errh}'
 	except requests.exceptions.ConnectionError as errc:
-		print('error: Error Connecting: %s' % errc)
+		return f'error: Error Connecting: {errc}'
 	except requests.exceptions.Timeout as errt:
-		print("error: Timeout Error:", errt)
+		return f'error: Timeout Error: {errt}'
 	except requests.exceptions.RequestException as err:
-		print("error: OOps: Something Else", err)
+		return f'error: OOps: Something Else {err}'
 
 	data = response.content
 	if service == 'nginx':
-		lang = roxywi_common.get_user_lang()
-		env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-		template = env.get_template('ajax/nginx_stats.html')
-
+		lang = roxywi_common.get_user_lang_for_flask()
 		servers_with_status = list()
 		h = ()
 		out1 = []
@@ -291,20 +227,14 @@ def get_stat_page(server_ip: str, service: str) -> None:
 		h = (out1,)
 		servers_with_status.append(h)
 
-		template = template.render(out=servers_with_status, lang=lang)
-		print(template)
+		return render_template('ajax/nginx_stats.html', out=servers_with_status, lang=lang)
 	else:
-		print(data.decode('utf-8'))
+		return data.decode('utf-8')
 
 
 def show_service_version(server_ip: str, service: str) -> None:
-	if service not in ('nginx', 'apache', 'haproxy'):
-		print('warning: wrong service')
-		return None
-
 	if service == 'haproxy':
-		print(check_haproxy_version(server_ip))
-		return None
+		return check_haproxy_version(server_ip)
 
 	server_id = sql.select_server_id_by_ip(server_ip)
 	service_name = service
@@ -321,4 +251,4 @@ def show_service_version(server_ip: str, service: str) -> None:
 			cmd = [f'docker exec -it {container_name}  /usr/sbin/{service_name} -v 2>&1|head -1|awk -F":" \'{{print $2}}\'']
 	else:
 		cmd = [f'sudo /usr/sbin/{service_name} -v|head -1|awk -F":" \'{{print $2}}\'']
-	print(server_mod.ssh_command(server_ip, cmd))
+	return server_mod.ssh_command(server_ip, cmd)
diff --git a/app/modules/service/exporter_installation.py b/app/modules/service/exporter_installation.py
index 690fe3d1..76fb1278 100644
--- a/app/modules/service/exporter_installation.py
+++ b/app/modules/service/exporter_installation.py
@@ -1,18 +1,12 @@
 import os
 
 import modules.db.sql as sql
-import modules.common.common as common
 import modules.server.server as server_mod
-from modules.service.installation import show_installation_output
+from modules.service.installation import show_installation_output, show_success_installation
 from modules.server.ssh import return_ssh_keys_path
 
-form = common.form
 
-
-def haproxy_exp_installation():
-    serv = form.getvalue('haproxy_exp_install')
-    ver = form.getvalue('exporter_v')
-    ext_prom = form.getvalue('ext_prom')
+def haproxy_exp_installation(serv, ver, ext_prom):
     script = "install_haproxy_exporter.sh"
     stats_port = sql.get_setting('stats_port')
     server_state_file = sql.get_setting('server_state_file')
@@ -21,8 +15,13 @@ def haproxy_exp_installation():
     stat_page = sql.get_setting('stats_page')
     proxy = sql.get_setting('proxy')
     ssh_settings = return_ssh_keys_path(serv)
+    full_path = '/var/www/haproxy-wi/app'
+    service = 'HAProxy exporter'
 
-    os.system(f"cp scripts/{script} .")
+    try:
+        os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
+    except Exception as e:
+        raise Exception(f'error: {e}')
 
     if proxy is not None and proxy != '' and proxy != 'None':
         proxy_serv = proxy
@@ -30,26 +29,27 @@ def haproxy_exp_installation():
         proxy_serv = ''
 
     commands = [
-        f"chmod +x {script} &&  ./{script} PROXY={proxy_serv} STAT_PORT={stats_port} STAT_FILE={server_state_file}"
+        f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} STAT_PORT={stats_port} STAT_FILE={server_state_file}"
         f" SSH_PORT={ssh_settings['port']} STAT_PAGE={stat_page} VER={ver} EXP_PROM={ext_prom} STATS_USER={stats_user}"
         f" STATS_PASS='{stats_password}' HOST={serv} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
     ]
 
     return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-    show_installation_output(return_out['error'], return_out['output'], 'HAProxy exporter', rc=return_out['rc'])
-    os.remove(script)
+    try:
+        show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
+    except Exception as e:
+        raise Exception(f'error: read output: {e}')
+
+    try:
+        os.remove(f'{full_path}/{script}')
+    except Exception:
+        pass
+
+    return show_success_installation(service)
 
 
-def nginx_apache_exp_installation():
-    if form.getvalue('nginx_exp_install'):
-        service = 'nginx'
-    elif form.getvalue('apache_exp_install'):
-        service = 'apache'
-
-    serv = common.is_ip_or_dns(form.getvalue('serv'))
-    ver = common.checkAjaxInput(form.getvalue('exporter_v'))
-    ext_prom = common.checkAjaxInput(form.getvalue('ext_prom'))
+def nginx_apache_exp_installation(serv, service, ver, ext_prom):
     script = f"install_{service}_exporter.sh"
     stats_user = sql.get_setting(f'{service}_stats_user')
     stats_password = sql.get_setting(f'{service}_stats_password')
@@ -58,44 +58,69 @@ def nginx_apache_exp_installation():
     proxy = sql.get_setting('proxy')
     proxy_serv = ''
     ssh_settings = return_ssh_keys_path(serv)
+    full_path = '/var/www/haproxy-wi/app'
+    service = f'{service.title()} exporter'
 
-    os.system(f"cp scripts/{script} .")
+    try:
+        os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
+    except Exception as e:
+        raise Exception(f'error: {e}')
 
     if proxy is not None and proxy != '' and proxy != 'None':
         proxy_serv = proxy
 
     commands = [
-        f"chmod +x {script} && ./{script} PROXY={proxy_serv} STAT_PORT={stats_port} SSH_PORT={ssh_settings['port']} STAT_PAGE={stats_page}" 
+        f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} STAT_PORT={stats_port} SSH_PORT={ssh_settings['port']} STAT_PAGE={stats_page}" 
         f" STATS_USER={stats_user} STATS_PASS='{stats_password}' HOST={serv} VER={ver} EXP_PROM={ext_prom} USER={ssh_settings['user']} "
         f" PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
     ]
 
     return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-    show_installation_output(return_out['error'], return_out['output'], f'{service.title()} exporter', rc=return_out['rc'])
-    os.remove(script)
+    try:
+        show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
+    except Exception as e:
+        raise Exception(f'error: read output: {e}')
+
+    try:
+        os.remove(f'{full_path}/{script}')
+    except Exception:
+        pass
+
+    return show_success_installation(service)
 
 
-def node_keepalived_exp_installation(service: str) -> None:
-    serv = common.is_ip_or_dns(form.getvalue(f'{service}_exp_install'))
-    ver = common.checkAjaxInput(form.getvalue('exporter_v'))
-    ext_prom = common.checkAjaxInput(form.getvalue('ext_prom'))
+def node_keepalived_exp_installation(service: str, serv: str, ver: str, ext_prom: int) -> None:
     script = f"install_{service}_exporter.sh"
     proxy = sql.get_setting('proxy')
     proxy_serv = ''
     ssh_settings = return_ssh_keys_path(serv)
+    full_path = '/var/www/haproxy-wi/app'
+    service = 'Node exporter'
 
-    os.system(f"cp scripts/{script} .")
+    try:
+        os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
+    except Exception as e:
+        raise Exception(f'error: {e}')
 
     if proxy is not None and proxy != '' and proxy != 'None':
         proxy_serv = proxy
 
     commands = [
-        f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} VER={ver} EXP_PROM={ext_prom} "
+        f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} VER={ver} EXP_PROM={ext_prom} "
         f"HOST={serv} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
     ]
 
     return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-    show_installation_output(return_out['error'], return_out['output'], 'Node exporter', rc=return_out['rc'])
-    os.remove(script)
+    try:
+        show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
+    except Exception as e:
+        raise Exception(f'error: read output: {e}')
+
+    try:
+        os.remove(f'{full_path}/{script}')
+    except Exception:
+        pass
+
+    return show_success_installation(service)
diff --git a/app/modules/service/haproxy.py b/app/modules/service/haproxy.py
index 24180e9a..97988819 100644
--- a/app/modules/service/haproxy.py
+++ b/app/modules/service/haproxy.py
@@ -1,6 +1,8 @@
 import os
 import requests
 
+from flask import request
+
 import modules.db.sql as sql
 import modules.common.common as common
 import modules.server.server as server_mod
@@ -11,7 +13,6 @@ import modules.roxy_wi_tools as roxy_wi_tools
 time_zone = sql.get_setting('time_zone')
 get_date = roxy_wi_tools.GetDate(time_zone)
 get_config = roxy_wi_tools.GetConfigVar()
-form = common.form
 
 
 def stat_page_action(serv: str) -> None:
@@ -21,9 +22,9 @@ def stat_page_action(serv: str) -> None:
     stats_page = sql.get_setting('stats_page')
 
     postdata = {
-        'action': form.getvalue('action'),
-        's': form.getvalue('s'),
-        'b': form.getvalue('b')
+        'action': request.form.get('action'),
+        's': request.form.get('s'),
+        'b': request.form.get('b')
     }
 
     headers = {
@@ -33,10 +34,11 @@ def stat_page_action(serv: str) -> None:
         'Accept-Encoding': 'gzip, deflate'
     }
 
-    requests.post(f'http://{serv}:{stats_port}/{stats_page}', headers=headers, data=postdata, auth=(haproxy_user, haproxy_pass))
+    data = requests.post(f'http://{serv}:{stats_port}/{stats_page}', headers=headers, data=postdata, auth=(haproxy_user, haproxy_pass))
+    return data.content
 
 
-def show_map(serv: str) -> None:
+def show_map(serv: str) -> str:
     import networkx as nx
     import matplotlib
 
@@ -47,17 +49,16 @@ def show_map(serv: str) -> None:
     hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
     date = get_date.return_date('config')
     cfg = f'{hap_configs_dir}{serv}-{date}.cfg'
-
-    print(f'<center><h4 style="margin-bottom: 0;">Map from {serv}</h4>')
+    output = f'<center><h4 style="margin-bottom: 0;">Map from {serv}</h4>'
 
     error = config_mod.get_config(serv, cfg)
     if error:
-        print(error)
+        return f'error: Cannot read import config file {error}'
+
     try:
         conf = open(cfg, "r")
-    except IOError:
-        print('error: Cannot read import config file')
-        return
+    except IOError as e:
+        return f'error: Cannot read import config file {e}'
 
     G = nx.DiGraph()
     node = ""
@@ -239,25 +240,22 @@ def show_map(serv: str) -> None:
         nx.draw_networkx_edge_labels(G, pos, alpha=0.4, label_pos=0.5, font_color="#5d9ceb", edge_labels=edge_labels,
                                      font_size=8)
 
-        plt.savefig("map.png")
+        plt.savefig(f"/var/www/haproxy-wi/app/map.png")
         plt.show()
     except Exception as e:
-        print(str(e))
+        return f'error: Cannot create a map: {e}'
 
-    os.system(
-        f"rm -f {os.path.dirname(os.getcwd())}/map*.png && mv map.png {os.path.dirname(os.getcwd())}/map{date}.png")
-    print(f'<img src="/map{date}.png" alt="map"></center>')
+    output += f'<img src="/map.png" alt="map"></center>'
+    return output
 
 
-def runtime_command(serv: str) -> None:
+def runtime_command(serv: str, enable: str, backend: str, save: str) -> str:
     server_state_file = sql.get_setting('server_state_file')
     haproxy_sock = sql.get_setting('haproxy_sock')
-    enable = common.checkAjaxInput(form.getvalue('servaction'))
-    backend = common.checkAjaxInput(form.getvalue('servbackend'))
 
     cmd = f'echo "{enable} {backend}" |sudo socat stdio {haproxy_sock}'
 
-    if form.getvalue('save') == "on":
+    if save == "on":
         save_command = f'echo "show servers state" | sudo socat {haproxy_sock} stdio > {server_state_file}'
         command = [cmd + ';' + save_command]
     else:
@@ -266,10 +264,11 @@ def runtime_command(serv: str) -> None:
     if enable != "show":
         roxywi_common.logging(serv, f'Has been {enable}ed {backend}', login=1, keep_history=1, service='haproxy')
         print(
-            f'<center><h3>You {enable} {backend} on HAProxy {serv}. <a href="statsview.py?serv={serv}" '
-            f'title="View stat" target="_blank">Look it</a> or <a href="runtimeapi.py" '
+            f'<center><h3>You {enable} {backend} on HAProxy {serv}. <a href="/app/stats/haproxy/{serv}" '
+            f'title="View stat" target="_blank">Look it</a> or <a href="/app/runtimeapi" '
             f'title="Runtime API">Edit something else</a></h3><br />')
 
-    print(server_mod.ssh_command(serv, command, show_log="1"))
-    action = f'runtimeapi.py {enable} {backend}'
+    action = f'runtimeapi {enable} {backend}'
     roxywi_common.logging(serv, action)
+
+    return server_mod.ssh_command(serv, command, show_log="1")
diff --git a/app/modules/service/installation.py b/app/modules/service/installation.py
index 6d31ff0f..8f5a93b3 100644
--- a/app/modules/service/installation.py
+++ b/app/modules/service/installation.py
@@ -1,6 +1,8 @@
 import os
 import json
 
+from flask import render_template
+
 import modules.db.sql as sql
 import modules.service.common as service_common
 import modules.common.common as common
@@ -8,10 +10,8 @@ import modules.server.server as server_mod
 import modules.roxywi.common as roxywi_common
 from modules.server.ssh import return_ssh_keys_path
 
-form = common.form
 
-
-def show_installation_output(error: str, output: str, service: str, rc=0, api=0):
+def show_installation_output(error: str, output: str, service: str, rc=0):
 	if error and "WARNING" not in error:
 		roxywi_common.logging('Roxy-WI server', error, roxywi=1)
 		raise Exception('error: ' + error)
@@ -22,18 +22,16 @@ def show_installation_output(error: str, output: str, service: str, rc=0, api=0)
 					try:
 						correct_out = line.split('=>')
 						correct_out = json.loads(correct_out[1])
-						raise Exception(f'error: {correct_out["msg"]} for {service}')
 					except Exception:
 						raise Exception(f'error: {output} for {service}')
-		else:
-			if not api:
-				from jinja2 import Environment, FileSystemLoader
-				env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-				template = env.get_template('include/show_success_installation.html')
-				lang = roxywi_common.get_user_lang()
-				rendered_template = template.render(service=service, lang=lang)
-				print(rendered_template)
-			return True
+					else:
+						raise Exception(f'error: {correct_out["msg"]} for {service}')
+	return True
+
+
+def show_success_installation(service):
+	lang = roxywi_common.get_user_lang_for_flask()
+	return render_template('include/show_success_installation.html', service=service, lang=lang)
 
 
 def install_haproxy(server_ip: str, api=0, **kwargs):
@@ -81,11 +79,15 @@ def install_haproxy(server_ip: str, api=0, **kwargs):
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-	if show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'], api=api):
-		try:
-			sql.update_haproxy(server_ip)
-		except Exception as e:
-			print(e)
+	try:
+		show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(e)
+
+	try:
+		sql.update_haproxy(server_ip)
+	except Exception as e:
+		return str(e)
 
 	if docker == '1':
 		server_id = sql.select_server_id_by_ip(server_ip)
@@ -97,6 +99,9 @@ def install_haproxy(server_ip: str, api=0, **kwargs):
 	except Exception:
 		pass
 
+	if not api:
+		return show_success_installation(service)
+
 
 def waf_install(server_ip: str):
 	script = "waf.sh"
@@ -106,28 +111,35 @@ def waf_install(server_ip: str):
 	service = ' WAF'
 	proxy_serv = ''
 	ssh_settings = return_ssh_keys_path(server_ip)
+	full_path = '/var/www/haproxy-wi/app'
 
-	os.system(f"cp scripts/{script} .")
+	os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
 
 	commands = [
-		f"chmod +x {script} && ./{script} PROXY={proxy_serv} HAPROXY_PATH={haproxy_dir} VERSION='{ver}' "
+		f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} HAPROXY_PATH={haproxy_dir} VERSION='{ver}' "
 		f"SSH_PORT={ssh_settings['port']} HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' "
 		f"KEY={ssh_settings['key']}"
 	]
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-	if show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']):
-		try:
-			sql.insert_waf_metrics_enable(server_ip, "0")
-			sql.insert_waf_rules(server_ip)
-		except Exception as e:
-			print(e)
+	try:
+		show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(e)
 
-	os.remove(script)
+	try:
+		sql.insert_waf_metrics_enable(server_ip, "0")
+		sql.insert_waf_rules(server_ip)
+	except Exception as e:
+		return str(e)
+
+	os.remove(f'{full_path}/{script}')
+
+	return show_success_installation(service)
 
 
 def waf_nginx_install(server_ip: str):
@@ -137,30 +149,37 @@ def waf_nginx_install(server_ip: str):
 	service = ' WAF'
 	proxy_serv = ''
 	ssh_settings = return_ssh_keys_path(server_ip)
+	full_path = '/var/www/haproxy-wi/app'
 
-	os.system(f"cp scripts/{script} .")
+	os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
 
 	commands = [
-		f"chmod +x {script} && ./{script} PROXY={proxy_serv} NGINX_PATH={nginx_dir} SSH_PORT={ssh_settings['port']} "
+		f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} NGINX_PATH={nginx_dir} SSH_PORT={ssh_settings['port']} "
 		f"HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
 	]
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-	if show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']):
-		try:
-			sql.insert_nginx_waf_rules(server_ip)
-			sql.insert_waf_nginx_server(server_ip)
-		except Exception as e:
-			print(e)
+	try:
+		show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(e)
 
-	os.remove(script)
+	try:
+		sql.insert_nginx_waf_rules(server_ip)
+		sql.insert_waf_nginx_server(server_ip)
+	except Exception as e:
+		return str(e)
+
+	os.remove(f'{full_path}/{script}')
+
+	return show_success_installation(service)
 
 
-def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs) -> None:
+def install_service(server_ip: str, service: str, docker: str, syn_flood_protect: int, api=0, **kwargs) -> str:
 	script = f"install_{service}.sh"
 	stats_user = sql.get_setting(f'{service}_stats_user')
 	stats_password = sql.get_setting(f'{service}_stats_password')
@@ -183,8 +202,6 @@ def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs)
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
 
-	syn_flood_protect = '1' if form.getvalue('syn_flood') == "1" else ''
-
 	if service == 'apache':
 		correct_service_name = service_common.get_correct_apache_service_name(server_ip=server_ip, server_id=None)
 		if service_dir == '/etc/httpd' and correct_service_name == 'apache2':
@@ -206,17 +223,21 @@ def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs)
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-	if show_installation_output(return_out['error'], return_out['output'], service_name, rc=return_out['rc'], api=api):
-		if service == 'nginx':
-			try:
-				sql.update_nginx(server_ip)
-			except Exception as e:
-				print(e)
-		elif service == 'apache':
-			try:
-				sql.update_apache(server_ip)
-			except Exception as e:
-				print(e)
+	try:
+		show_installation_output(return_out['error'], return_out['output'], service_name, rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(e)
+		
+	if service == 'nginx':
+		try:
+			sql.update_nginx(server_ip)
+		except Exception as e:
+			return str(e)
+	elif service == 'apache':
+		try:
+			sql.update_apache(server_ip)
+		except Exception as e:
+			return str(e)
 
 	if docker == '1':
 		server_id = sql.select_server_id_by_ip(server_ip)
@@ -225,38 +246,47 @@ def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs)
 
 	os.remove(f'{full_path}/{script}')
 
+	if not api:
+		return show_success_installation(service)
 
-def geoip_installation():
-	serv = common.is_ip_or_dns(form.getvalue('geoip_install'))
-	geoip_update = common.checkAjaxInput(form.getvalue('geoip_update'))
-	service = form.getvalue('geoip_service')
+
+def geoip_installation(serv, geoip_update, service):
 	proxy = sql.get_setting('proxy')
 	maxmind_key = sql.get_setting('maxmind_key')
 	proxy_serv = ''
 	ssh_settings = return_ssh_keys_path(serv)
+	full_path = '/var/www/haproxy-wi/app'
 
 	if service in ('haproxy', 'nginx'):
 		service_dir = common.return_nice_path(sql.get_setting(f'{service}_dir'))
 		script = f'install_{service}_geoip.sh'
 	else:
-		print('warning: select a server and service first')
-		return
+		raise Exception('warning: select a server and service first')
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
 
-	os.system(f"cp scripts/{script} .")
+	try:
+		os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
+	except Exception as e:
+		raise Exception(f'error: {e}')
 
 	commands = [
-		f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} UPDATE={geoip_update} "
+		f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} UPDATE={geoip_update} "
 		f"maxmind_key={maxmind_key} service_dir={service_dir} HOST={serv} USER={ssh_settings['user']} "
 		f"PASS={ssh_settings['password']} KEY={ssh_settings['key']}"
 	]
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-	show_installation_output(return_out['error'], return_out['output'], 'GeoLite2 Database', rc=return_out['rc'])
-	os.remove(script)
+	try:
+		show_installation_output(return_out['error'], return_out['output'], 'GeoLite2 Database', rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(e)
+
+	os.remove(f'{full_path}/{script}')
+
+	return show_success_installation('GeoLite2 Database')
 
 
 def grafana_install():
@@ -264,44 +294,43 @@ def grafana_install():
 	proxy = sql.get_setting('proxy')
 	proxy_serv = ''
 	host = os.environ.get('HTTP_HOST', '')
+	full_path = '/var/www/haproxy-wi/app'
 
-	os.system(f"cp scripts/{script} .")
+	try:
+		os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
+	except Exception as e:
+		raise Exception(f'error: {e}')
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
 
-	cmd = f"chmod +x {script} && ./{script} PROXY={proxy_serv}"
+	cmd = f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv}"
 	output, error = server_mod.subprocess_execute(cmd)
 
 	if error:
 		roxywi_common.logging('Roxy-WI server', error, roxywi=1)
-		print(
-			f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000<br>')
 	else:
 		for line in output:
 			if any(s in line for s in ("Traceback", "FAILED")):
 				try:
-					print(line)
-					break
+					return line
 				except Exception:
-					print(output)
-					break
-		else:
-			print(
-				f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000<br>')
+					return output
 
-	os.remove(script)
+	os.remove(f'{full_path}/{script}')
+
+	return f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000<br>'
 
 
 def keepalived_master_install(master: str, eth: str, eth_slave: str, vrrp_ip: str, virt_server: int, syn_flood: int,
-							  return_to_master: int, haproxy: int, nginx: int, router_id: int, api=0) -> None:
+							  return_to_master: int, haproxy: int, nginx: int, router_id: int, api=0) -> str:
 	script = "install_keepalived.sh"
 	proxy = sql.get_setting('proxy')
 	keepalived_path_logs = sql.get_setting('keepalived_path_logs')
 	proxy_serv = ''
 	ssh_settings = return_ssh_keys_path(master)
 	full_path = '/var/www/haproxy-wi/app'
-
+	service = 'master Keepalived'
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
@@ -320,36 +349,44 @@ def keepalived_master_install(master: str, eth: str, eth_slave: str, vrrp_ip: st
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-	if show_installation_output(return_out['error'], return_out['output'], 'master Keepalived', rc=return_out['rc'], api=api):
-		try:
-			sql.update_keepalived(master)
-		except Exception as e:
-			raise Exception(e)
+	try:
+		show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(f'error: read output: {e}')
 
-		if virt_server:
-			group_id = sql.get_group_id_by_server_ip(master)
-			cred_id = sql.get_cred_id_by_server_ip(master)
-			hostname = sql.get_hostname_by_server_ip(master)
-			firewall = 1 if server_mod.is_service_active(master, 'firewalld') else 0
-			sql.add_server(
-				hostname + '-VIP', vrrp_ip, group_id, '1', '1', '0', cred_id, ssh_settings['port'], f'VRRP IP for {master}',
-				haproxy, nginx, '0', firewall
-			)
+	try:
+		sql.update_keepalived(master)
+	except Exception as e:
+		raise Exception(e)
+
+	if virt_server:
+		group_id = sql.get_group_id_by_server_ip(master)
+		cred_id = sql.get_cred_id_by_server_ip(master)
+		hostname = sql.get_hostname_by_server_ip(master)
+		firewall = 1 if server_mod.is_service_active(master, 'firewalld') else 0
+		sql.add_server(
+			hostname + '-VIP', vrrp_ip, group_id, '1', '1', '0', cred_id, ssh_settings['port'], f'VRRP IP for {master}',
+			haproxy, nginx, '0', firewall
+		)
 
 	try:
 		os.remove(f'{full_path}/{script}')
 	except Exception:
 		pass
 
+	if not api:
+		return show_success_installation(service)
+
 
 def keepalived_slave_install(master: str, slave: str, eth: str, eth_slave: str, vrrp_ip: str, syn_flood: int,
-							 haproxy: int, nginx: int, router_id: int, api=0) -> None:
+							 haproxy: int, nginx: int, router_id: int, api=0) -> str:
 	script = "install_keepalived.sh"
 	proxy = sql.get_setting('proxy')
 	keepalived_path_logs = sql.get_setting('keepalived_path_logs')
 	proxy_serv = ''
 	ssh_settings = return_ssh_keys_path(slave)
 	full_path = '/var/www/haproxy-wi/app'
+	service = 'slave Keepalived'
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
@@ -371,43 +408,40 @@ def keepalived_slave_install(master: str, slave: str, eth: str, eth_slave: str,
 		raise Exception(f'error: {e}')
 
 	try:
-		show_installation_output(return_out['error'], return_out['output'], 'slave Keepalived', rc=return_out['rc'], api=api)
+		show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'])
 	except Exception as e:
-		raise Exception(f'{e}')
+		raise Exception(f'error: read output: {e}')
 
 	try:
 		sql.update_server_master(master, slave)
 		sql.update_keepalived(slave)
 	except Exception as e:
-		print(e)
+		raise Exception(f'{e}')
 
 	try:
 		os.remove(f'{full_path}/{script}')
 	except Exception:
 		pass
 
+	if not api:
+		return show_success_installation(service)
 
-def keepalived_masteradd():
-	master = form.getvalue('masteradd')
-	eth = form.getvalue('interfaceadd')
-	slave_eth = form.getvalue('slave_interfaceadd')
-	vrrp_ip = form.getvalue('vrrpipadd')
-	router_id = form.getvalue('router_id')
-	kp = form.getvalue('kp')
-	return_to_master = form.getvalue('return_to_master')
+
+def keepalived_masteradd(master, eth, slave_eth, vrrp_ip, router_id, return_to_master, kp):
 	script = "install_keepalived.sh"
 	proxy = sql.get_setting('proxy')
 	keepalived_path_logs = sql.get_setting('keepalived_path_logs')
 	proxy_serv = ''
 	ssh_settings = return_ssh_keys_path(master)
+	full_path = '/var/www/haproxy-wi/app'
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
 
-	os.system(f"cp scripts/{script} .")
+	os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
 
 	commands = [
-		f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} "
+		f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} "
 		f"keepalived_path_logs={keepalived_path_logs} RETURN_TO_MASTER={return_to_master} IP={vrrp_ip} MASTER=MASTER "
 		f"RESTART={kp} ADD_VRRP=1 HOST={master} router_id={router_id} USER={ssh_settings['user']} "
 		f"PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
@@ -415,34 +449,42 @@ def keepalived_masteradd():
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
 
-	show_installation_output(return_out['error'], return_out['output'], 'master VRRP address', rc=return_out['rc'])
-	os.remove(script)
+	try:
+		show_installation_output(return_out['error'], return_out['output'], 'master VRRP address', rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(e)
+
+	os.remove(f'{full_path}/{script}')
+
+	return show_success_installation('slave VRRP address')
 
 
-def keepalived_slaveadd():
-	slave = form.getvalue('slaveadd')
-	eth = form.getvalue('interfaceadd')
-	slave_eth = form.getvalue('slave_interfaceadd')
-	vrrp_ip = form.getvalue('vrrpipadd')
-	router_id = form.getvalue('router_id')
-	kp = form.getvalue('kp')
+def keepalived_slaveadd(slave, eth, slave_eth, vrrp_ip, router_id, kp):
 	script = "install_keepalived.sh"
 	proxy = sql.get_setting('proxy')
 	keepalived_path_logs = sql.get_setting('keepalived_path_logs')
 	proxy_serv = ''
 	ssh_settings = return_ssh_keys_path(slave)
+	full_path = '/var/www/haproxy-wi/app'
 
 	if proxy is not None and proxy != '' and proxy != 'None':
 		proxy_serv = proxy
 
-	os.system(f"cp scripts/{script} .")
+	os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}")
 
 	commands = [
-		f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} "
+		f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} "
 		f"keepalived_path_logs={keepalived_path_logs} IP={vrrp_ip} MASTER=BACKUP RESTART={kp} ADD_VRRP=1 HOST={slave} "
 		f"router_id={router_id} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
 	]
 
 	return_out = server_mod.subprocess_execute_with_rc(commands[0])
-	show_installation_output(return_out['error'], return_out['output'], 'slave VRRP address', rc=return_out['rc'])
-	os.remove(script)
+
+	try:
+		show_installation_output(return_out['error'], return_out['output'], 'slave VRRP address', rc=return_out['rc'])
+	except Exception as e:
+		raise Exception(e)
+
+	os.remove(f'{full_path}/{script}')
+
+	return show_success_installation('slave VRRP address')
diff --git a/app/modules/alerting/alerting.py b/app/modules/tools/alerting.py
similarity index 86%
rename from app/modules/alerting/alerting.py
rename to app/modules/tools/alerting.py
index ce4da670..2b0fac13 100644
--- a/app/modules/alerting/alerting.py
+++ b/app/modules/tools/alerting.py
@@ -3,7 +3,7 @@ import json
 import http.cookies
 
 import pika
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template
 
 import modules.db.sql as sql
 import modules.common.common as common
@@ -257,23 +257,25 @@ def pd_send_mess(mess, level, server_ip=None, service_id=None, alert_type=None,
 		raise Exception(f'error: {e}')
 
 
-def check_rabbit_alert() -> None:
+def check_rabbit_alert() -> str:
 	try:
 		cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
 		user_group_id = cookie.get('group')
 		user_group_id1 = user_group_id.value
 	except Exception as e:
-		print(f'error: Cannot send a message {e}')
-		return
+		return f'error: Cannot send a message {e}'
+
 
 	try:
 		json_for_sending = {"user_group": user_group_id1, "message": 'info: Test message'}
 		send_message_to_rabbit(json.dumps(json_for_sending))
 	except Exception as e:
-		print(f'error: Cannot send a message {e}')
+		return f'error: Cannot send a message {e}'
+	else:
+		return 'ok'
 
 
-def check_email_alert() -> None:
+def check_email_alert() -> str:
 	subject = 'test message'
 	message = 'Test message from Roxy-WI'
 
@@ -282,108 +284,104 @@ def check_email_alert() -> None:
 		user_uuid = cookie.get('uuid')
 		user_uuid_value = user_uuid.value
 	except Exception as e:
-		print(f'error: Cannot send a message {e}')
-		return
+		return f'error: Cannot send a message {e}'
 
 	try:
 		user_email = sql.select_user_email_by_uuid(user_uuid_value)
 	except Exception as e:
-		print(f'error: Cannot get a user email: {e}')
-		return
+		return f'error: Cannot get a user email: {e}'
 
 	try:
 		send_email(user_email, subject, message)
 	except Exception as e:
-		print(f'error: Cannot send a message {e}')
-		return
+		return f'error: Cannot send a message {e}'
+
+	return 'ok'
 
 
-def add_telegram_channel(token: str, channel: str, group: str, page: str) -> None:
+def add_telegram_channel(token: str, channel: str, group: str, page: str) -> str:
 	if token is None or channel is None or group is None:
-		print(error_mess)
+		return error_mess
 	else:
 		if sql.insert_new_telegram(token, channel, group):
-			lang = roxywi_common.get_user_lang()
+			lang = roxywi_common.get_user_lang_for_flask()
 			channels = sql.select_telegram(token=token)
 			groups = sql.select_groups()
-			env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-			template = env.get_template('ajax/new_receiver.html')
-			parsed_template = template.render(groups=groups, lang=lang, channels=channels, page=page, receiver='telegram')
-			print(parsed_template)
 			roxywi_common.logging('Roxy-WI server', f'A new Telegram channel {channel} has been created ', roxywi=1, login=1)
 
+			return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='telegram')
 
-def add_slack_channel(token: str, channel: str, group: str, page: str) -> None:
+
+def add_slack_channel(token: str, channel: str, group: str, page: str) -> str:
 	if token is None or channel is None or group is None:
-		print(error_mess)
+		return error_mess
 	else:
 		if sql.insert_new_slack(token, channel, group):
-			lang = roxywi_common.get_user_lang()
+			lang = roxywi_common.get_user_lang_for_flask()
 			channels = sql.select_slack(token=token)
 			groups = sql.select_groups()
-			env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-			template = env.get_template('ajax/new_receiver.html')
-			parsed_template = template.render(groups=groups, lang=lang, channels=channels, page=page, receiver='slack')
-			print(parsed_template)
 			roxywi_common.logging('Roxy-WI server', f'A new Slack channel {channel} has been created ', roxywi=1, login=1)
+			return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='slack')
 
 
-def add_pd_channel(token: str, channel: str, group: str, page: str) -> None:
+def add_pd_channel(token: str, channel: str, group: str, page: str) -> str:
 	if token is None or channel is None or group is None:
-		print(error_mess)
+		return error_mess
 	else:
 		if sql.insert_new_pd(token, channel, group):
-			lang = roxywi_common.get_user_lang()
-			env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-			template = env.get_template('ajax/new_receiver.html')
-			parsed_template = template.render(groups=sql.select_groups(), lang=lang, channels=sql.select_pd(token=token), page=page, receiver='pd')
-			print(parsed_template)
+			lang = roxywi_common.get_user_lang_for_flask()
+			channels = sql.select_slack(token=token)
+			groups = sql.select_groups()
 			roxywi_common.logging('Roxy-WI server', f'A new PagerDuty channel {channel} has been created ', roxywi=1, login=1)
+			return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='pd')
 
 
-def delete_telegram_channel(channel_id) -> None:
+def delete_telegram_channel(channel_id) -> str:
 	telegram = sql.select_telegram(id=channel_id)
 	channel_name = ''
 	for t in telegram:
 		channel_name = t.token
 	if sql.delete_telegram(channel_id):
-		print("Ok")
 		roxywi_common.logging('Roxy-WI server', f'The Telegram channel {channel_name} has been deleted ', roxywi=1, login=1)
+		return 'ok'
 
 
-def delete_slack_channel(channel_id) -> None:
+def delete_slack_channel(channel_id) -> str:
 	slack = sql.select_slack(id=channel_id)
 	channel_name = ''
 	for t in slack:
 		channel_name = t.chanel_name
 	if sql.delete_slack(channel_id):
-		print("Ok")
 		roxywi_common.logging('Roxy-WI server', f'The Slack channel {channel_name} has been deleted ', roxywi=1, login=1)
+		return 'ok'
 
 
-def delete_pd_channel(channel_id) -> None:
+def delete_pd_channel(channel_id) -> str:
 	pd = sql.select_pd(id=channel_id)
 	channel_name = ''
 	for t in pd:
 		channel_name = t.chanel_name
 	if sql.delete_pd(channel_id):
-		print("Ok")
 		roxywi_common.logging('Roxy-WI server', f'The PageDuty channel {channel_name} has been deleted ', roxywi=1, login=1)
+		return 'ok'
 
 
-def update_telegram(token: str, channel: str, group: str, user_id: int) -> None:
+def update_telegram(token: str, channel: str, group: str, user_id: int) -> str:
 	sql.update_telegram(token, channel, group, user_id)
 	roxywi_common.logging('group ' + group, f'The Telegram token has been updated for channel: {channel}', roxywi=1, login=1)
+	return 'ok'
 
 
-def update_slack(token: str, channel: str, group: str, user_id: int) -> None:
+def update_slack(token: str, channel: str, group: str, user_id: int) -> str:
 	sql.update_slack(token, channel, group, user_id)
 	roxywi_common.logging(f'group {group}', f'The Slack token has been updated for channel: {channel}', roxywi=1, login=1)
+	return 'ok'
 
 
-def update_pd(token: str, channel: str, group: str, user_id: int) -> None:
+def update_pd(token: str, channel: str, group: str, user_id: int) -> str:
 	sql.update_pd(token, channel, group, user_id)
 	roxywi_common.logging(f'group {group}', f'The PagerDuty token has been updated for channel: {channel}', roxywi=1, login=1)
+	return 'ok'
 
 
 def delete_receiver_channel(channel_id: int, receiver_name: str) -> None:
@@ -392,16 +390,20 @@ def delete_receiver_channel(channel_id: int, receiver_name: str) -> None:
 		"slack": delete_slack_channel,
 		"pd": delete_pd_channel,
 	}
-	delete_functions[receiver_name](channel_id)
+	return delete_functions[receiver_name](channel_id)
 
 
-def add_receiver_channel(receiver_name: str, token: str, channel: str, group: id, page: str) -> None:
+def add_receiver_channel(receiver_name: str, token: str, channel: str, group: id, page: str) -> str:
 	add_functions = {
 		"telegram": add_telegram_channel,
 		"slack": add_slack_channel,
 		"pd": add_pd_channel,
 	}
-	add_functions[receiver_name](token, channel, group, page)
+
+	try:
+		return add_functions[receiver_name](token, channel, group, page)
+	except Exception as e:
+		return f'error: Cannot add new receiver: {e}'
 
 
 def update_receiver_channel(receiver_name: str, token: str, channel: str, group: id, user_id: int) -> None:
@@ -410,10 +412,10 @@ def update_receiver_channel(receiver_name: str, token: str, channel: str, group:
 		"slack": update_slack,
 		"pd": update_pd,
 	}
-	update_functions[receiver_name](token, channel, group, user_id)
+	return update_functions[receiver_name](token, channel, group, user_id)
 
 
-def check_receiver(channel_id: int, receiver_name: str) -> None:
+def check_receiver(channel_id: int, receiver_name: str) -> str:
 	functions = {
 		"telegram": telegram_send_mess,
 		"slack": slack_send_mess,
@@ -427,6 +429,6 @@ def check_receiver(channel_id: int, receiver_name: str) -> None:
 		level = 'info'
 
 	try:
-		functions[receiver_name](mess, level, channel_id=channel_id)
+		return functions[receiver_name](mess, level, channel_id=channel_id)
 	except Exception as e:
-		print(e)
+		return f'error: Cannot send message: {e}'
diff --git a/app/modules/tools/checker.py b/app/modules/tools/checker.py
index 211a2989..e5573cba 100644
--- a/app/modules/tools/checker.py
+++ b/app/modules/tools/checker.py
@@ -1,4 +1,4 @@
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template
 
 import modules.db.sql as sql
 import modules.common.common as common
@@ -9,12 +9,9 @@ form = common.form
 
 
 def load_checker() -> None:
-    page = form.getvalue('page')
     groups = sql.select_groups()
     services = roxywi_mod.get_services_status()
     lang = roxywi_common.get_user_lang()
-    env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-    template = env.get_template('ajax/load_telegram.html')
     keepalived_settings = ''
     haproxy_settings = ''
     apache_settings = ''
@@ -33,47 +30,36 @@ def load_checker() -> None:
         user_subscription = roxywi_common.return_unsubscribed_user_status()
         roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
 
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
     if user_subscription['user_status']:
         haproxy_settings = sql.select_checker_settings(1)
         nginx_settings = sql.select_checker_settings(2)
         keepalived_settings = sql.select_checker_settings(3)
         apache_settings = sql.select_checker_settings(4)
-        if page == 'servers.py':
-            user_group = roxywi_common.get_user_group(id=1)
-            telegrams = sql.get_user_telegram_by_group(user_group)
-            slacks = sql.get_user_slack_by_group(user_group)
-            pds = sql.get_user_pd_by_group(user_group)
-            haproxy_servers = roxywi_common.get_dick_permit(haproxy=1, only_group=1)
-            nginx_servers = roxywi_common.get_dick_permit(nginx=1, only_group=1)
-            apache_servers = roxywi_common.get_dick_permit(apache=1, only_group=1)
-            keepalived_servers = roxywi_common.get_dick_permit(keepalived=1, only_group=1)
-        else:
-            telegrams = sql.select_telegram()
-            slacks = sql.select_slack()
-            pds = sql.select_pd()
-            haproxy_servers = roxywi_common.get_dick_permit(haproxy=1)
-            nginx_servers = roxywi_common.get_dick_permit(nginx=1)
-            apache_servers = roxywi_common.get_dick_permit(apache=1)
-            keepalived_servers = roxywi_common.get_dick_permit(keepalived=1)
+        user_group = roxywi_common.get_user_group(id=1)
+        telegrams = sql.get_user_telegram_by_group(user_group)
+        slacks = sql.get_user_slack_by_group(user_group)
+        pds = sql.get_user_pd_by_group(user_group)
+        haproxy_servers = roxywi_common.get_dick_permit(haproxy=1, only_group=1)
+        nginx_servers = roxywi_common.get_dick_permit(nginx=1, only_group=1)
+        apache_servers = roxywi_common.get_dick_permit(apache=1, only_group=1)
+        keepalived_servers = roxywi_common.get_dick_permit(keepalived=1, only_group=1)
 
-    template = template.render(services=services, telegrams=telegrams, pds=pds, groups=groups, slacks=slacks,
-                               user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
-                               haproxy_servers=haproxy_servers, nginx_servers=nginx_servers, apache_servers=apache_servers,
-                               keepalived_servers=keepalived_servers, haproxy_settings=haproxy_settings, nginx_settings=nginx_settings,
-                               keepalived_settings=keepalived_settings, apache_settings=apache_settings, page=page, lang=lang)
-    print(template)
+    return render_template(
+        'ajax/load_telegram.html', services=services, telegrams=telegrams, pds=pds, groups=groups, slacks=slacks,
+        user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], haproxy_servers=haproxy_servers,
+        nginx_servers=nginx_servers, apache_servers=apache_servers, keepalived_servers=keepalived_servers, haproxy_settings=haproxy_settings,
+        nginx_settings=nginx_settings, keepalived_settings=keepalived_settings, apache_settings=apache_settings,
+        role=user_params['role'], lang=user_params['lang']
+    )
 
 
-def update_haproxy_settings() -> None:
-    setting_id = int(form.getvalue('updateHaproxyCheckerSettings'))
-    email = int(form.getvalue('email'))
-    service_alert = int(form.getvalue('server'))
-    backend_alert = int(form.getvalue('backend'))
-    maxconn_alert = int(form.getvalue('maxconn'))
-    telegram_id = int(form.getvalue('telegram_id'))
-    slack_id = int(form.getvalue('slack_id'))
-    pd_id = int(form.getvalue('pd_id'))
-
+def update_haproxy_settings(setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id) -> None:
     if sql.update_haproxy_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert,
                                            maxconn_alert, setting_id):
         print('ok')
@@ -81,15 +67,7 @@ def update_haproxy_settings() -> None:
         print('error: Cannot update Checker settings')
 
 
-def update_keepalived_settings() -> None:
-    setting_id = int(form.getvalue('updateKeepalivedCheckerSettings'))
-    email = int(form.getvalue('email'))
-    service_alert = int(form.getvalue('server'))
-    backend_alert = int(form.getvalue('backend'))
-    telegram_id = int(form.getvalue('telegram_id'))
-    slack_id = int(form.getvalue('slack_id'))
-    pd_id = int(form.getvalue('pd_id'))
-
+def update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id) -> None:
     if sql.update_keepalived_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert,
                                               setting_id):
         print('ok')
@@ -97,14 +75,7 @@ def update_keepalived_settings() -> None:
         print('error: Cannot update Checker settings')
 
 
-def update_service_settings() -> None:
-    setting_id = int(form.getvalue('updateServiceCheckerSettings'))
-    email = int(form.getvalue('email'))
-    service_alert = int(form.getvalue('server'))
-    telegram_id = int(form.getvalue('telegram_id'))
-    slack_id = int(form.getvalue('slack_id'))
-    pd_id = int(form.getvalue('pd_id'))
-
+def update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id) -> None:
     if sql.update_service_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, setting_id):
         print('ok')
     else:
diff --git a/app/modules/tools/smon.py b/app/modules/tools/smon.py
index e815a117..70664324 100644
--- a/app/modules/tools/smon.py
+++ b/app/modules/tools/smon.py
@@ -1,31 +1,24 @@
-import json
-
-from jinja2 import Environment, FileSystemLoader
+from flask import render_template
 
 import modules.db.sql as sql
-import modules.common.common as common
 import modules.roxywi.common as roxywi_common
-
-form = common.form
+import modules.server.server as server_mod
 
 
 def create_smon(name: str, hostname: str, port: int, enable: int, url: str, body: str, group: int, desc: str, telegram: int,
                 slack: int, pd: int, packet_size: int, check_type: int, resolver: str, record_type: str, user_group: int,
-                http_method: str, show_new=1) -> None:
+                http_method: str, show_new=1) -> bool:
     if check_type == 'tcp':
         try:
             port = int(port)
         except Exception:
-            print('SMON error: port must be a number')
-            return None
+            raise Exception('SMON error: port must be a number')
         if port > 65535 or port < 0:
-            print('SMON error: port must be 0-65535')
-            return None
+            raise Exception('SMON error: port must be 0-65535')
 
     if check_type == 'ping':
         if int(packet_size) < 16:
-            print('SMON error: a packet size cannot be less than 16')
-            return None
+            raise Exception('SMON error: a packet size cannot be less than 16')
 
     last_id = sql.insert_smon(name, enable, group, desc, telegram, slack, pd, user_group, check_type)
 
@@ -38,59 +31,31 @@ def create_smon(name: str, hostname: str, port: int, enable: int, url: str, body
     elif check_type == 'dns':
         sql.insert_smon_dns(last_id, hostname, port, resolver, record_type)
 
-    if last_id and show_new:
-        lang = roxywi_common.get_user_lang()
-        smon = sql.select_smon_by_id(last_id)
-        pds = sql.get_user_pd_by_group(user_group)
-        slacks = sql.get_user_slack_by_group(user_group)
-        telegrams = sql.get_user_telegram_by_group(user_group)
-        smon_service = sql.select_smon_check_by_id(last_id, check_type)
-        env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-        template = env.get_template('ajax/smon/show_new_smon.html')
-        template = template.render(smon=smon, telegrams=telegrams, slacks=slacks, pds=pds, lang=lang, check_type=check_type,
-                                   smon_service=smon_service)
-        print(template)
-
     if last_id:
         roxywi_common.logging('SMON', f' A new server {name} to SMON has been add ', roxywi=1, login=1)
 
+    if last_id and show_new:
+        return last_id
+    else:
+        return False
 
-def update_smon() -> None:
-    smon_id = common.checkAjaxInput(form.getvalue('id'))
-    name = common.checkAjaxInput(form.getvalue('updateSmonName'))
-    ip = common.checkAjaxInput(form.getvalue('updateSmonIp'))
-    port = common.checkAjaxInput(form.getvalue('updateSmonPort'))
-    en = common.checkAjaxInput(form.getvalue('updateSmonEn'))
-    url = common.checkAjaxInput(form.getvalue('updateSmonUrl'))
-    body = common.checkAjaxInput(form.getvalue('updateSmonBody'))
-    telegram = common.checkAjaxInput(form.getvalue('updateSmonTelegram'))
-    slack = common.checkAjaxInput(form.getvalue('updateSmonSlack'))
-    pd = common.checkAjaxInput(form.getvalue('updateSmonPD'))
-    group = common.checkAjaxInput(form.getvalue('updateSmonGroup'))
-    desc = common.checkAjaxInput(form.getvalue('updateSmonDesc'))
-    check_type = common.checkAjaxInput(form.getvalue('check_type'))
-    resolver = common.checkAjaxInput(form.getvalue('updateSmonResServer'))
-    record_type = common.checkAjaxInput(form.getvalue('updateSmonRecordType'))
-    packet_size = common.checkAjaxInput(form.getvalue('updateSmonPacket_size'))
-    http_method = common.checkAjaxInput(form.getvalue('updateSmon_http_method'))
+
+def update_smon(smon_id, name, ip, port, en, url, body, telegram, slack, pd, group, desc, check_type,
+                resolver, record_type, packet_size, http_method) -> str:
     is_edited = False
 
     if check_type == 'tcp':
         try:
             port = int(port)
         except Exception:
-            print('SMON error: port must number')
-            return None
+            raise Exception('SMON error: port must number')
         if port > 65535 or port < 0:
-            print('SMON error: port must be 0-65535')
-            return None
+            raise Exception('SMON error: port must be 0-65535')
 
     if check_type == 'ping':
         if int(packet_size) < 16:
-            print('SMON error: a packet size cannot be less than 16')
-            return None
+            raise Exception('SMON error: a packet size cannot be less than 16')
 
-    roxywi_common.check_user_group()
     try:
         if sql.update_smon(smon_id, name, telegram, slack, pd, group, desc, en):
             if check_type == 'http':
@@ -103,36 +68,29 @@ def update_smon() -> None:
                 is_edited = sql.update_smonDns(smon_id, ip, port, resolver, record_type)
 
             if is_edited:
-                print("Ok")
                 roxywi_common.logging('SMON', f' The SMON server {name} has been update ', roxywi=1, login=1)
+                return "Ok"
     except Exception as e:
-        print(e)
+        raise Exception(f'error: Cannot update the server: {e}')
 
 
-def show_smon() -> None:
+def show_smon(sort: str) -> str:
     user_group = roxywi_common.get_user_group(id=1)
-    lang = roxywi_common.get_user_lang()
-    sort = common.checkAjaxInput(form.getvalue('sort'))
-    env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-    template = env.get_template('ajax/smon/smon_dashboard.html')
-    template = template.render(smon=sql.smon_list(user_group), sort=sort, lang=lang, update=1)
-    print(template)
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    return render_template('ajax/smon/smon_dashboard.html', smon=sql.smon_list(user_group), sort=sort, lang=lang, update=1)
 
 
-def delete_smon() -> None:
-    user_group = roxywi_common.get_user_group(id=1)
-    smon_id = common.checkAjaxInput(form.getvalue('smondel'))
-
-    if roxywi_common.check_user_group():
-        try:
-            if sql.delete_smon(smon_id, user_group):
-                print('Ok')
-                roxywi_common.logging('SMON', ' The server from SMON has been delete ', roxywi=1, login=1)
-        except Exception as e:
-            print(e)
+def delete_smon(smon_id, user_group) -> str:
+    try:
+        if sql.delete_smon(smon_id, user_group):
+            roxywi_common.logging('SMON', ' The server from SMON has been delete ', roxywi=1, login=1)
+            return 'Ok'
+    except Exception as e:
+        raise Exception(f'error: Cannot delete the server {e}')
 
 
-def history_metrics(server_id: int, check_id: int) -> None:
+def history_metrics(server_id: int, check_id: int) -> dict:
     metric = sql.select_smon_history(server_id, check_id)
 
     metrics = {'chartData': {}}
@@ -147,23 +105,24 @@ def history_metrics(server_id: int, check_id: int) -> None:
     metrics['chartData']['labels'] = labels
     metrics['chartData']['curr_con'] = curr_con
 
-    print(json.dumps(metrics))
+    return metrics
 
 
 def history_statuses(dashboard_id: int, check_id: int) -> None:
-    env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-    template = env.get_template('ajax/smon/history_status.html')
     smon_statuses = sql.select_smon_history(dashboard_id, check_id)
 
-    rendered_template = template.render(smon_statuses=smon_statuses)
-    print(rendered_template)
+    return render_template('ajax/smon/history_status.html', smon_statuses=smon_statuses)
 
 
 def history_cur_status(dashboard_id: int, check_id: int) -> None:
-    env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-    template = env.get_template('ajax/smon/cur_status.html')
     cur_status = sql.get_last_smon_status_by_check(dashboard_id, check_id)
     smon = sql.select_one_smon(dashboard_id, check_id)
 
-    rendered_template = template.render(cur_status=cur_status, smon=smon)
-    print(rendered_template)
+    return render_template('ajax/smon/cur_status.html', cur_status=cur_status, smon=smon)
+
+
+def return_smon_status():
+    cmd = "systemctl is-active roxy-wi-smon"
+    smon_status, stderr = server_mod.subprocess_execute(cmd)
+
+    return smon_status, stderr
\ No newline at end of file
diff --git a/app/nettools.py b/app/nettools.py
deleted file mode 100644
index f927634c..00000000
--- a/app/nettools.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-import modules.common.common as common
-import modules.roxywi.roxy as roxywi_mod
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('nettools.html')
-form = common.form
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(virt=1)
-
-try:
-    roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception as e:
-    print(f'error {e}')
-    sys.exit()
-
-output_from_parsed_template = template.render(h2=1, autorefresh=0,
-                                              role=user_params['role'],
-                                              user=user_params['user'],
-                                              servers=user_params['servers'],
-                                              versions=roxywi_mod.versions(),
-                                              user_services=user_params['user_services'],
-                                              token=user_params['token'],
-                                              lang=user_params['lang'])
-print(output_from_parsed_template)
diff --git a/app/options.py b/app/options.py
deleted file mode 100644
index 9320da6a..00000000
--- a/app/options.py
+++ /dev/null
@@ -1,1567 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-import os
-import sys
-import http.cookies
-from uuid import UUID
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.server.ssh as ssh_mod
-import modules.common.common as common
-import modules.config.add as add_mod
-import modules.config.config as config_mod
-import modules.roxywi.common as roxywi_common
-import modules.roxy_wi_tools as roxy_wi_tools
-import modules.server.server as server_mod
-import modules.service.common as service_common
-import modules.service.installation as service_mod
-
-get_config = roxy_wi_tools.GetConfigVar()
-time_zone = sql.get_setting('time_zone')
-get_date = roxy_wi_tools.GetDate(time_zone)
-
-form = common.form
-serv = common.is_ip_or_dns(form.getvalue('serv'))
-service = common.checkAjaxInput(form.getvalue('service'))
-act = form.getvalue("act")
-token = form.getvalue("token")
-
-if any((
-        form.getvalue('new_metrics'), form.getvalue('new_http_metrics'), form.getvalue('new_waf_metrics'), form.getvalue('new_nginx_metrics'),
-        form.getvalue('new_apache_metrics'), form.getvalue('metrics_hapwi_ram'), form.getvalue('metrics_hapwi_cpu'), form.getvalue('getoption'),
-        form.getvalue('getsavedserver'), form.getvalue('smon_history_check'))
-):
-    print('Content-type: application/json\n')
-else:
-    print('Content-type: text/html\n')
-
-if act == "checkrestart":
-    servers = roxywi_common.get_dick_permit(ip=serv)
-    for server in servers:
-        if server != "":
-            print("ok")
-            sys.exit()
-    sys.exit()
-
-try:
-    uuid_obj = UUID(token, version=4)
-except ValueError:
-    print('error: Your token is not valid')
-    sys.exit()
-except Exception:
-    print('error: There is no token')
-    sys.exit()
-
-if not sql.check_token_exists(token):
-    print('error: Your token has been expired')
-    sys.exit()
-
-if form.getvalue('checkSshConnect') is not None and serv is not None:
-    try:
-        print(server_mod.ssh_command(serv, ["ls -1t"]))
-    except Exception as e:
-        print(e)
-
-if form.getvalue('getcerts') is not None and serv is not None:
-    add_mod.get_ssl_certs(serv)
-
-if form.getvalue('getcert') is not None and serv is not None:
-    cert_id = common.checkAjaxInput(form.getvalue('getcert'))
-    add_mod.get_ssl_cert(serv, cert_id)
-
-if form.getvalue('getcert_raw') is not None and serv is not None:
-    cert_id = common.checkAjaxInput(form.getvalue('getcert_raw'))
-    add_mod.get_ssl_raw_cert(serv, cert_id)
-
-if form.getvalue('delcert') is not None and serv is not None:
-    cert_id = common.checkAjaxInput(form.getvalue('delcert'))
-    add_mod.del_ssl_cert(serv, cert_id)
-
-if serv and form.getvalue('ssl_cert'):
-    ssl_name = common.checkAjaxInput(form.getvalue('ssl_name'))
-    ssl_cont = form.getvalue('ssl_cert')
-    add_mod.upload_ssl_cert(serv, ssl_name, ssl_cont)
-
-if form.getvalue('backend') is not None:
-    import modules.config.runtime as runtime
-    runtime.show_backends(serv)
-
-if form.getvalue('ip_select') is not None:
-    import modules.config.runtime as runtime
-    runtime.show_backends(serv)
-
-if form.getvalue('ipbackend') is not None and form.getvalue('backend_server') is None:
-    import modules.config.runtime as runtime
-
-    runtime.show_frontend_backend()
-
-if form.getvalue('ipbackend') is not None and form.getvalue('backend_server') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.show_server()
-
-if form.getvalue('backend_ip') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.change_ip_and_port()
-
-if form.getvalue('maxconn_select') is not None:
-    import modules.config.runtime as runtime
-    serv = common.checkAjaxInput(form.getvalue('maxconn_select'))
-    runtime.get_backends_from_config(serv, backends='frontend')
-
-if form.getvalue('maxconn_global') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.change_maxconn_global()
-
-if form.getvalue('maxconn_frontend') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.change_maxconn_frontend()
-
-if form.getvalue('maxconn_backend') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.change_maxconn_backend()
-
-if form.getvalue('table_serv_select') is not None:
-    import modules.config.runtime as runtime
-    print(runtime.get_all_stick_table())
-
-if form.getvalue('table_select') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.table_select()
-
-if form.getvalue('ip_for_delete') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.delete_ip_from_stick_table()
-
-if form.getvalue('table_for_clear') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.clear_stick_table()
-
-if form.getvalue('list_serv_select') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.list_of_lists()
-
-if form.getvalue('list_select_id') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.show_lists()
-
-if form.getvalue('list_id_for_delete') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.delete_ip_from_list()
-
-if form.getvalue('list_ip_for_add') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.add_ip_to_list()
-
-if form.getvalue('sessions_select') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.select_session()
-
-if form.getvalue('sessions_select_show') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.show_session()
-
-if form.getvalue('session_delete_id') is not None:
-    import modules.config.runtime as runtime
-
-    runtime.delete_session()
-
-if form.getvalue("change_pos") is not None:
-    pos = common.checkAjaxInput(form.getvalue('change_pos'))
-    server_id = common.checkAjaxInput(form.getvalue('pos_server_id'))
-    sql.update_server_pos(pos, server_id)
-
-if form.getvalue('show_ip') is not None and serv is not None:
-    commands = ['sudo hostname -i | tr " " "\n"|grep -v "%"']
-    server_mod.ssh_command(serv, commands, ip="1")
-
-if form.getvalue('showif'):
-    commands = ["sudo ip link|grep 'UP' |grep -v 'lo'| awk '{print $2}' |awk -F':' '{print $1}'"]
-    server_mod.ssh_command(serv, commands, ip="1")
-
-if form.getvalue('action_hap') is not None and serv is not None:
-    import modules.service.action as service_action
-
-    action = form.getvalue('action_hap')
-    service_action.action_haproxy(serv, action)
-
-if form.getvalue('action_nginx') is not None and serv is not None:
-    import modules.service.action as service_action
-
-    action = form.getvalue('action_nginx')
-    service_action.action_nginx(serv, action)
-
-if form.getvalue('action_keepalived') is not None and serv is not None:
-    import modules.service.action as service_action
-
-    action = form.getvalue('action_keepalived')
-    service_action.action_keepalived(serv, action)
-
-if form.getvalue('action_waf') is not None and serv is not None:
-    import modules.service.action as service_action
-
-    action = form.getvalue('action_waf')
-    service_action.action_haproxy_waf(serv, action)
-
-if form.getvalue('action_waf_nginx') is not None and serv is not None:
-    import modules.service.action as service_action
-
-    action = form.getvalue('action_waf_nginx')
-    service_action.action_nginx_waf(serv, action)
-
-if form.getvalue('action_apache') is not None and serv is not None:
-    import modules.service.action as service_action
-
-    action = form.getvalue('action_apache')
-    service_action.action_apache(serv, action)
-
-if form.getvalue('action_service') is not None:
-    import modules.roxywi.roxy as roxy
-
-    action = common.checkAjaxInput(form.getvalue('action_service'))
-    roxy.action_service(action, serv)
-
-if act == "overviewHapserverBackends":
-    service_common.overview_backends(serv, service)
-
-if form.getvalue('show_userlists'):
-    add_mod.show_userlist(serv)
-
-if act == "overviewHapservers":
-    service_common.get_overview_last_edit(serv, service)
-
-if act == "overview":
-    import modules.roxywi.overview as roxy_overview
-
-    roxy_overview.show_overview(serv)
-
-if act == "overviewwaf":
-    import modules.roxywi.waf as roxy_waf
-
-    waf_service = service
-    serv = common.checkAjaxInput(serv)
-    roxy_waf.waf_overview(serv, waf_service)
-
-if act == "overviewServers":
-    server_id = common.checkAjaxInput(form.getvalue('id'))
-    name = common.checkAjaxInput(form.getvalue('name'))
-
-    service_common.overview_service(serv, server_id, name, service)
-
-if act == "overviewServices":
-    import modules.roxywi.overview as roxy_overview
-
-    roxy_overview.show_services_overview()
-
-if form.getvalue('action'):
-    import modules.service.haproxy as service_haproxy
-
-    service_haproxy.stat_page_action(serv)
-
-if serv is not None and act == "stats":
-    service_common.get_stat_page(serv, service)
-
-if serv is not None and any((form.getvalue('show_log'), form.getvalue('rows1'), form.getvalue('viewlogs'))):
-    import modules.roxywi.logs as roxywi_logs
-
-    waf = 0
-    rows = form.getvalue('show_log')
-    service = service
-
-    if form.getvalue('rows1'):
-        rows = form.getvalue('rows1')
-        service = 'apache_internal'
-    elif form.getvalue('show_log'):
-        waf = form.getvalue('waf')
-    elif form.getvalue('viewlogs'):
-        serv = form.getvalue('viewlogs')
-        rows = form.getvalue('rows')
-        service = 'internal'
-
-    grep = form.getvalue('grep')
-    hour = form.getvalue('hour')
-    minute = form.getvalue('minut')
-    hour1 = form.getvalue('hour1')
-    minute1 = form.getvalue('minut1')
-
-    if roxywi_common.check_user_group():
-        out = roxywi_logs.show_roxy_log(serv=serv, rows=rows, waf=waf, grep=grep, hour=hour, minute=minute, hour1=hour1,
-                                 minute1=minute1, service=service)
-        print(out)
-
-if serv is not None and act == "showMap":
-    import modules.service.haproxy as service_haproxy
-
-    service_haproxy.show_map(serv)
-
-if form.getvalue('servaction') is not None:
-    import modules.service.haproxy as service_haproxy
-
-    service_haproxy.runtime_command(serv)
-
-if act == "showCompareConfigs":
-    config_mod.show_compare_config(serv)
-
-if serv is not None and form.getvalue('right') is not None:
-    config_mod.compare_config()
-
-if serv is not None and act == "configShow":
-    config_mod.show_config(serv)
-
-if act == 'configShowFiles':
-    config_mod.show_config_files(serv)
-
-if act == 'showRemoteLogFiles':
-    log_path = sql.get_setting(f'{service}_path_logs')
-    return_files = server_mod.get_remote_files(serv, log_path, 'log')
-    if 'error: ' in return_files:
-        print(return_files)
-        sys.exit()
-
-    lang = roxywi_common.get_user_lang()
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/show_log_files.html')
-    template = template.render(serv=serv, return_files=return_files, path_dir=log_path, lang=lang)
-    print(template)
-
-if form.getvalue('master'):
-    master = form.getvalue('master')
-    eth = form.getvalue('interface')
-    eth_slave = form.getvalue('slave_interface')
-    vrrp_ip = form.getvalue('vrrpip')
-    syn_flood = form.getvalue('syn_flood')
-    virt_server = int(form.getvalue('virt_server'))
-    return_to_master = form.getvalue('return_to_master')
-    haproxy = form.getvalue('hap')
-    nginx = form.getvalue('nginx')
-    router_id = form.getvalue('router_id')
-
-    try:
-        service_mod.keepalived_master_install(master, eth, eth_slave, vrrp_ip, virt_server, syn_flood, return_to_master,
-                                              haproxy, nginx, router_id)
-    except Exception as e:
-        print(f'{e}')
-
-if form.getvalue('master_slave'):
-    master = form.getvalue('master_slave')
-    slave = form.getvalue('slave')
-    eth = form.getvalue('interface')
-    eth_slave = form.getvalue('slave_interface')
-    vrrp_ip = form.getvalue('vrrpip')
-    syn_flood = form.getvalue('syn_flood')
-    haproxy = form.getvalue('hap')
-    nginx = form.getvalue('nginx')
-    router_id = form.getvalue('router_id')
-
-    try:
-        service_mod.keepalived_slave_install(master, slave, eth, eth_slave, vrrp_ip, syn_flood, haproxy, nginx, router_id)
-    except Exception as e:
-        print(f'{e}')
-
-if form.getvalue('masteradd'):
-    try:
-        service_mod.keepalived_masteradd()
-    except Exception as e:
-        print(f'{e}')
-
-if form.getvalue('masteradd_slave'):
-    try:
-        service_mod.keepalived_slaveadd()
-    except Exception as e:
-        print(f'{e}')
-
-if form.getvalue('master_slave_hap'):
-    master = form.getvalue('master_slave_hap')
-    slave = form.getvalue('slave')
-    server = form.getvalue('server')
-    docker = form.getvalue('docker')
-
-    if server == 'master':
-        try:
-            service_mod.install_haproxy(master, server=server, docker=docker, m_or_s='master', master=master, slave=slave)
-        except Exception as e:
-            print(f'{e}')
-    elif server == 'slave':
-        try:
-            service_mod.install_haproxy(slave, server=server, docker=docker, m_or_s='slave', master=master, slave=slave)
-        except Exception as e:
-            print(f'{e}')
-
-if form.getvalue('master_slave_nginx'):
-    master = form.getvalue('master_slave_nginx')
-    slave = form.getvalue('slave')
-    server = form.getvalue('server')
-    docker = form.getvalue('docker')
-
-    if server == 'master':
-        try:
-            service_mod.install_service(master, 'nginx', docker, server=server)
-        except Exception as e:
-            print(f'{e}')
-    elif server == 'slave':
-        try:
-            service_mod.install_service(slave, 'nginx', docker, server=server)
-        except Exception as e:
-            print(f'{e}')
-
-if form.getvalue('install_grafana'):
-    try:
-        service_mod.grafana_install()
-    except Exception as e:
-        print(f'{e}')
-
-if form.getvalue('haproxy_exp_install'):
-    import modules.service.exporter_installation as exp_installation
-
-    exp_installation.haproxy_exp_installation()
-
-if form.getvalue('nginx_exp_install') or form.getvalue('apache_exp_install'):
-    import modules.service.exporter_installation as exp_installation
-
-    exp_installation.nginx_apache_exp_installation()
-
-if form.getvalue('node_exp_install'):
-    import modules.service.exporter_installation as exp_installation
-
-    service = 'node'
-    exp_installation.node_keepalived_exp_installation(service)
-
-if form.getvalue('keepalived_exp_install'):
-    import modules.service.exporter_installation as exp_installation
-
-    service = 'keepalived'
-    exp_installation.node_keepalived_exp_installation(service)
-
-if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupupdate'):
-    import modules.service.backup as backup_mod
-
-    server = common.is_ip_or_dns(form.getvalue('server'))
-    rpath = common.checkAjaxInput(form.getvalue('rpath'))
-    time = common.checkAjaxInput(form.getvalue('time'))
-    backup_type = common.checkAjaxInput(form.getvalue('type'))
-    rserver = common.checkAjaxInput(form.getvalue('rserver'))
-    cred = int(form.getvalue('cred'))
-    deljob = common.checkAjaxInput(form.getvalue('deljob'))
-    update = common.checkAjaxInput(form.getvalue('backupupdate'))
-    description = common.checkAjaxInput(form.getvalue('description'))
-
-    try:
-        backup_mod.backup(server, rpath, time, backup_type, rserver, cred, deljob, update, description)
-    except Exception as e:
-        print(e)
-
-if any((form.getvalue('s3_backup_server'), form.getvalue('dels3job'))):
-    import modules.service.backup as backup_mod
-
-    server = common.is_ip_or_dns(form.getvalue('s3_backup_server'))
-    s3_server = common.checkAjaxInput(form.getvalue('s3_server'))
-    bucket = common.checkAjaxInput(form.getvalue('s3_bucket'))
-    secret_key = common.checkAjaxInput(form.getvalue('s3_secret_key'))
-    access_key = common.checkAjaxInput(form.getvalue('s3_access_key'))
-    time = common.checkAjaxInput(form.getvalue('time'))
-    deljob = common.checkAjaxInput(form.getvalue('dels3job'))
-    description = common.checkAjaxInput(form.getvalue('description'))
-
-    backup_mod.s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description)
-
-if form.getvalue('git_backup'):
-    import modules.service.backup as backup_mod
-
-    server_id = form.getvalue('server')
-    service_id = form.getvalue('git_service')
-    git_init = form.getvalue('git_init')
-    repo = form.getvalue('git_repo')
-    branch = form.getvalue('git_branch')
-    period = form.getvalue('time')
-    cred = form.getvalue('cred')
-    deljob = form.getvalue('git_deljob')
-    description = form.getvalue('description')
-
-    backup_mod.git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description)
-
-if form.getvalue('install_service'):
-    server_ip = common.is_ip_or_dns(form.getvalue('install_service'))
-    docker = common.checkAjaxInput(form.getvalue('docker'))
-
-    if service in ('nginx', 'apache'):
-        try:
-            service_mod.install_service(server_ip, service, docker)
-        except Exception as e:
-            print(e)
-    else:
-        print('warning: wrong service')
-
-if form.getvalue('haproxyaddserv'):
-    try:
-        service_mod.install_haproxy(form.getvalue('haproxyaddserv'), syn_flood=form.getvalue('syn_flood'),
-                                    hapver=form.getvalue('hapver'), docker=form.getvalue('docker'))
-    except Exception as e:
-        print(e)
-
-if form.getvalue('installwaf'):
-    if service == 'haproxy':
-        try:
-            service_mod.waf_install(common.checkAjaxInput(form.getvalue('installwaf')))
-        except Exception as e:
-            print(e)
-    else:
-        try:
-            service_mod.waf_nginx_install(common.checkAjaxInput(form.getvalue('installwaf')))
-        except Exception as e:
-            print(e)
-
-if form.getvalue('geoip_install'):
-    try:
-        service_mod.geoip_installation()
-    except Exception as e:
-        print(e)
-
-if form.getvalue('update_roxy_wi'):
-    import modules.roxywi.roxy as roxy
-
-    service = form.getvalue('service')
-
-    try:
-        roxy.update_roxy_wi(service)
-    except Exception as e:
-        print(e)
-
-if form.getvalue('metrics_waf'):
-    metrics_waf = common.checkAjaxInput(form.getvalue('metrics_waf'))
-    sql.update_waf_metrics_enable(metrics_waf, form.getvalue('enable'))
-
-if form.getvalue('table_metrics'):
-    roxywi_common.check_user_group()
-    lang = roxywi_common.get_user_lang()
-    group_id = roxywi_common.get_user_group(id=1)
-    if service in ('nginx', 'apache'):
-        metrics = sql.select_service_table_metrics(service, group_id)
-    else:
-        metrics = sql.select_table_metrics(group_id)
-
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/table_metrics.html')
-
-    template = template.render(table_stat=metrics, service=service, lang=lang)
-    print(template)
-
-if form.getvalue('metrics_hapwi_ram'):
-    import modules.roxywi.metrics as metric
-    metrics_type = common.checkAjaxInput(form.getvalue('ip'))
-
-    metric.show_ram_metrics(metrics_type)
-
-if form.getvalue('metrics_hapwi_cpu'):
-    import modules.roxywi.metrics as metric
-
-    metrics_type = common.checkAjaxInput(form.getvalue('ip'))
-
-    metric.show_cpu_metrics(metrics_type)
-
-if form.getvalue('new_metrics'):
-    import modules.roxywi.metrics as metric
-
-    server_ip = common.is_ip_or_dns(form.getvalue('server'))
-    hostname = sql.get_hostname_by_server_ip(server_ip)
-    time_range = common.checkAjaxInput(form.getvalue('time_range'))
-
-    metric.haproxy_metrics(server_ip, hostname, time_range)
-
-if form.getvalue('new_http_metrics'):
-    import modules.roxywi.metrics as metric
-
-    server_ip = common.is_ip_or_dns(form.getvalue('server'))
-    hostname = sql.get_hostname_by_server_ip(server_ip)
-    time_range = common.checkAjaxInput(form.getvalue('time_range'))
-
-    metric.haproxy_http_metrics(server_ip, hostname, time_range)
-
-if any((form.getvalue('new_nginx_metrics'), form.getvalue('new_apache_metrics'), form.getvalue('new_waf_metrics'))):
-    import modules.roxywi.metrics as metric
-
-    server_ip = common.is_ip_or_dns(form.getvalue('server'))
-    hostname = sql.get_hostname_by_server_ip(server_ip)
-    time_range = common.checkAjaxInput(form.getvalue('time_range'))
-    service = ''
-
-    if form.getvalue('new_nginx_metrics'):
-        service = 'nginx'
-    elif form.getvalue('new_apache_metrics'):
-        service = 'apache'
-    elif form.getvalue('new_waf_metrics'):
-        service = 'waf'
-
-    metric.service_metrics(server_ip, hostname, service, time_range)
-
-if form.getvalue('get_hap_v'):
-    print(service_common.check_haproxy_version(serv))
-
-if form.getvalue('get_service_v'):
-    service = common.checkAjaxInput(form.getvalue('get_service_v'))
-    server_ip = common.is_ip_or_dns(serv)
-
-    service_common.show_service_version(server_ip, service)
-
-if form.getvalue('get_keepalived_v'):
-    cmd = ["sudo /usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}'"]
-    print(server_mod.ssh_command(serv, cmd))
-
-if form.getvalue('get_exporter_v'):
-    print(service_common.get_exp_version(serv, form.getvalue('get_exporter_v')))
-
-if form.getvalue('bwlists'):
-    color = common.checkAjaxInput(form.getvalue('color'))
-    group = common.checkAjaxInput(form.getvalue('group'))
-    bwlists = common.checkAjaxInput(form.getvalue('bwlists'))
-
-    add_mod.get_bwlist(color, group, bwlists)
-
-if form.getvalue('bwlists_create'):
-    list_name = common.checkAjaxInput(form.getvalue('bwlists_create'))
-    color = common.checkAjaxInput(form.getvalue('color'))
-    group = common.checkAjaxInput(form.getvalue('group'))
-
-    add_mod.create_bwlist(serv, list_name, color, group)
-
-if form.getvalue('bwlists_save'):
-    color = common.checkAjaxInput(form.getvalue('color'))
-    group = common.checkAjaxInput(form.getvalue('group'))
-    bwlists_save = common.checkAjaxInput(form.getvalue('bwlists_save'))
-    list_con = form.getvalue('bwlists_content')
-    action = common.checkAjaxInput(form.getvalue('bwlists_restart'))
-
-    add_mod.save_bwlist(bwlists_save, list_con, color, group, serv, action)
-
-if form.getvalue('bwlists_delete'):
-    color = common.checkAjaxInput(form.getvalue('color'))
-    list_name = common.checkAjaxInput(form.getvalue('bwlists_delete'))
-    group = common.checkAjaxInput( form.getvalue('group'))
-
-    add_mod.delete_bwlist(list_name, color, group, serv)
-
-if form.getvalue('get_lists'):
-    group = common.checkAjaxInput(form.getvalue('group'))
-    color = common.checkAjaxInput(form.getvalue('color'))
-    add_mod.get_bwlists_for_autocomplete(color, group)
-
-if form.getvalue('edit_map'):
-    group = common.checkAjaxInput(form.getvalue('group'))
-    map_name = common.checkAjaxInput(form.getvalue('edit_map'))
-
-    add_mod.edit_map(map_name, group)
-
-if form.getvalue('map_create'):
-    map_name = common.checkAjaxInput(form.getvalue('map_create'))
-    group = common.checkAjaxInput(form.getvalue('group'))
-
-    try:
-        add_mod.create_map(serv, map_name, group)
-    except Exception as e:
-        print(e)
-
-if form.getvalue('map_save'):
-    group = common.checkAjaxInput(form.getvalue('group'))
-    map_save = common.checkAjaxInput(form.getvalue('map_save'))
-    content = form.getvalue('content')
-    action = common.checkAjaxInput(form.getvalue('map_restart'))
-
-    add_mod.save_map(map_save, content, group, serv, action)
-
-if form.getvalue('map_delete'):
-    map_name = common.checkAjaxInput(form.getvalue('map_delete'))
-    group = common.checkAjaxInput( form.getvalue('group'))
-    server_id = common.checkAjaxInput( form.getvalue('serv'))
-
-    add_mod.delete_map(map_name, group, server_id)
-
-if form.getvalue('get_ldap_email'):
-    import modules.roxywi.user as roxywi_user
-
-    roxywi_user.get_ldap_email()
-
-if form.getvalue('change_waf_mode'):
-    import modules.roxywi.waf as roxy_waf
-
-    roxy_waf.change_waf_mode()
-
-error_mess = roxywi_common.return_error_message()
-
-if form.getvalue('newuser') is not None:
-    import modules.roxywi.user as roxywi_user
-
-    email = common.checkAjaxInput(form.getvalue('newemail'))
-    password = common.checkAjaxInput(form.getvalue('newpassword'))
-    role = common.checkAjaxInput(form.getvalue('newrole'))
-    new_user = common.checkAjaxInput(form.getvalue('newusername'))
-    page = common.checkAjaxInput(form.getvalue('page'))
-    activeuser = common.checkAjaxInput(form.getvalue('activeuser'))
-    group = common.checkAjaxInput(form.getvalue('newgroupuser'))
-    lang = roxywi_common.get_user_lang()
-
-    if roxywi_user.create_user(new_user, email, password, role, activeuser, group):
-        env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-        template = env.get_template('ajax/new_user.html')
-
-        template = template.render(users=sql.select_users(user=new_user),
-                                   groups=sql.select_groups(),
-                                   page=page,
-                                   roles=sql.select_roles(),
-                                   adding=1,
-                                   lang=lang)
-        print(template)
-
-if form.getvalue('userdel') is not None:
-    import modules.roxywi.user as roxywi_user
-
-    try:
-        roxywi_user.delete_user()
-    except Exception as e:
-        print(e)
-
-if form.getvalue('updateuser') is not None:
-    import modules.roxywi.user as roxywi_user
-
-    roxywi_user.update_user()
-
-if form.getvalue('updatepassowrd') is not None:
-    import modules.roxywi.user as roxywi_user
-
-    roxywi_user.update_user_password()
-
-if form.getvalue('newserver') is not None:
-    hostname = common.checkAjaxInput(form.getvalue('servername'))
-    ip = common.is_ip_or_dns(form.getvalue('newip'))
-    group = common.checkAjaxInput(form.getvalue('newservergroup'))
-    typeip = common.checkAjaxInput(form.getvalue('typeip'))
-    haproxy = common.checkAjaxInput(form.getvalue('haproxy'))
-    nginx = common.checkAjaxInput(form.getvalue('nginx'))
-    apache = common.checkAjaxInput(form.getvalue('apache'))
-    firewall = common.checkAjaxInput(form.getvalue('firewall'))
-    enable = common.checkAjaxInput(form.getvalue('enable'))
-    master = common.checkAjaxInput(form.getvalue('slave'))
-    cred = common.checkAjaxInput(form.getvalue('cred'))
-    page = common.checkAjaxInput(form.getvalue('page'))
-    page = page.split("#")[0]
-    port = common.checkAjaxInput(form.getvalue('newport'))
-    desc = common.checkAjaxInput(form.getvalue('desc'))
-    add_to_smon = common.checkAjaxInput(form.getvalue('add_to_smon'))
-    lang = roxywi_common.get_user_lang()
-
-    if ip == '':
-        print('error: IP or DNS name is not valid')
-        sys.exit()
-    try:
-        if server_mod.create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, haproxy, nginx, apache, firewall):
-            try:
-                user_subscription = roxywi_common.return_user_status()
-            except Exception as e:
-                user_subscription = roxywi_common.return_unsubscribed_user_status()
-                roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-            env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-            template = env.get_template('ajax/new_server.html')
-            template = template.render(groups=sql.select_groups(), servers=sql.select_servers(server=ip),
-                                       masters=sql.select_servers(get_master_servers=1), sshs=sql.select_ssh(group=group),
-                                       page=page, user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
-                                       adding=1,lang=lang)
-            print(template)
-            roxywi_common.logging(ip, f'A new server {hostname} has been created', roxywi=1, login=1, keep_history=1, service='server')
-
-            if add_to_smon:
-                import modules.tools.smon as smon_mod
-
-                user_group = roxywi_common.get_user_group(id=1)
-                smon_mod.create_smon(hostname, ip, 0, 1, 0, 0, hostname, desc, 0, 0, 0, 56, 'ping', 0, 0, user_group, 0)
-
-    except Exception as e:
-        print(f'error: {e}')
-
-if act == 'after_adding':
-    hostname = common.checkAjaxInput(form.getvalue('servername'))
-    ip = common.is_ip_or_dns(form.getvalue('newip'))
-    group = common.checkAjaxInput(form.getvalue('newservergroup'))
-    scan_server = common.checkAjaxInput(form.getvalue('scan_server'))
-
-    try:
-        server_mod.update_server_after_creating(hostname, ip, scan_server)
-    except Exception as e:
-        print(e)
-
-if form.getvalue('updatehapwiserver') is not None:
-    hapwi_id = form.getvalue('updatehapwiserver')
-    active = form.getvalue('active')
-    name = form.getvalue('name')
-    alert = form.getvalue('alert_en')
-    metrics = form.getvalue('metrics')
-    service = form.getvalue('service_name')
-    sql.update_hapwi_server(hapwi_id, alert, metrics, active, service)
-    server_ip = sql.select_server_ip_by_id(hapwi_id)
-    roxywi_common.logging(server_ip, f'The server {name} has been updated ', roxywi=1, login=1, keep_history=1, service=service)
-
-if form.getvalue('updateserver') is not None:
-    name = form.getvalue('updateserver')
-    group = form.getvalue('servergroup')
-    typeip = form.getvalue('typeip')
-    firewall = form.getvalue('firewall')
-    enable = form.getvalue('enable')
-    master = form.getvalue('slave')
-    serv_id = form.getvalue('id')
-    cred = form.getvalue('cred')
-    port = form.getvalue('port')
-    protected = form.getvalue('protected')
-    desc = form.getvalue('desc')
-
-    if name is None or port is None:
-        print(error_mess)
-    else:
-        sql.update_server(name, group, typeip, enable, master, serv_id, cred, port, desc, firewall, protected)
-        roxywi_common.logging(f'the server {name}', ' has been updated ', roxywi=1, login=1)
-        server_ip = sql.select_server_ip_by_id(serv_id)
-        roxywi_common.logging(server_ip, f'The server {name} has been update', roxywi=1, login=1, keep_history=1, service='server')
-
-if form.getvalue('serverdel') is not None:
-    server_id = common.checkAjaxInput(form.getvalue('serverdel'))
-
-    server_mod.delete_server(server_id)
-
-if form.getvalue('newgroup') is not None:
-    newgroup = common.checkAjaxInput(form.getvalue('groupname'))
-    desc = common.checkAjaxInput(form.getvalue('newdesc'))
-    if newgroup is None:
-        print(error_mess)
-    else:
-        try:
-            if sql.add_group(newgroup, desc):
-                env = Environment(loader=FileSystemLoader('templates/ajax/'), autoescape=True)
-                template = env.get_template('/new_group.html')
-
-                output_from_parsed_template = template.render(groups=sql.select_groups(group=newgroup))
-                print(output_from_parsed_template)
-                roxywi_common.logging('Roxy-WI server', f'A new group {newgroup} has been created', roxywi=1, login=1)
-        except Exception as e:
-            print(e)
-
-if form.getvalue('groupdel') is not None:
-    import modules.roxywi.group as group_mod
-
-    group_id = common.checkAjaxInput(form.getvalue('groupdel'))
-    group_mod.delete_group(group_id)
-
-
-if form.getvalue('updategroup') is not None:
-    import modules.roxywi.group as group_mod
-
-    name = common.checkAjaxInput(form.getvalue('updategroup'))
-    desc = common.checkAjaxInput(form.getvalue('descript'))
-    group_id = common.checkAjaxInput(form.getvalue('id'))
-    group_mod.update_group(group_id, name, desc)
-
-if form.getvalue('new_ssh'):
-    ssh_mod.create_ssh_cred()
-
-if form.getvalue('sshdel') is not None:
-    ssh_mod.delete_ssh_key()
-
-if form.getvalue('updatessh'):
-    ssh_mod.update_ssh_key()
-
-if form.getvalue('ssh_cert'):
-    user_group = roxywi_common.get_user_group()
-    name = common.checkAjaxInput(form.getvalue('name'))
-    key = form.getvalue('ssh_cert')
-
-    try:
-        ssh_mod.upload_ssh_key(name, user_group, key)
-    except Exception as e:
-        print(e)
-
-if form.getvalue('new_receiver'):
-    import modules.alerting.alerting as alerting
-
-    token = common.checkAjaxInput(form.getvalue('new_receiver'))
-    receiver_name = common.checkAjaxInput(form.getvalue('receiver_name'))
-    channel = common.checkAjaxInput(form.getvalue('chanel'))
-    group = common.checkAjaxInput(form.getvalue('group_receiver'))
-    page = common.checkAjaxInput(form.getvalue('page'))
-    page = page.split("#")[0]
-
-    alerting.add_receiver_channel(receiver_name, token, channel, group, page)
-
-if form.getvalue('receiver_del') is not None:
-    import modules.alerting.alerting as alerting
-
-    channel_id = common.checkAjaxInput(form.getvalue('receiver_del'))
-    receiver_name = common.checkAjaxInput(form.getvalue('receiver_name'))
-
-    alerting.delete_receiver_channel(channel_id, receiver_name)
-
-if form.getvalue('update_receiver_token') is not None:
-    import modules.alerting.alerting as alerting
-
-    receiver_name = common.checkAjaxInput(form.getvalue('receiver_name'))
-    token = common.checkAjaxInput(form.getvalue('update_receiver_token'))
-    channel = common.checkAjaxInput(form.getvalue('update_receiver_channel'))
-    group = common.checkAjaxInput(form.getvalue('update_receiver_group'))
-    user_id = common.checkAjaxInput(form.getvalue('id'))
-
-    alerting.update_receiver_channel(receiver_name, token, channel, group, user_id)
-
-if form.getvalue('updatesettings') is not None:
-    settings = common.checkAjaxInput(form.getvalue('updatesettings'))
-    val = common.checkAjaxInput(form.getvalue('val'))
-    user_group = roxywi_common.get_user_group(id=1)
-    if sql.update_setting(settings, val, user_group):
-        roxywi_common.logging('Roxy-WI server', f'The {settings} setting has been changed to: {val}', roxywi=1, login=1)
-        print("Ok")
-
-if form.getvalue('getuserservices'):
-    import modules.roxywi.user as roxy_user
-
-    roxy_user.get_user_services()
-
-if act == 'show_user_group_and_role':
-    import modules.roxywi.user as roxy_user
-
-    roxy_user.show_user_groups_and_roles()
-
-if act == 'save_user_group_and_role':
-    import modules.roxywi.user as roxy_user
-
-    roxy_user.save_user_group_and_role()
-
-if form.getvalue('changeUserServicesId') is not None:
-    import modules.roxywi.user as roxy_user
-
-    roxy_user.change_user_services()
-
-if form.getvalue('changeUserCurrentGroupId') is not None:
-    import modules.roxywi.user as roxy_user
-
-    roxy_user.change_user_active_group()
-
-if form.getvalue('getcurrentusergroup') is not None:
-    import modules.roxywi.user as roxy_user
-
-    cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-    user_id = cookie.get('uuid')
-    group = cookie.get('group')
-
-    roxy_user.get_user_active_group(user_id, group)
-
-if form.getvalue('newsmonname') is not None:
-    import modules.tools.smon as smon_mod
-
-    user_group = roxywi_common.get_user_group(id=1)
-    name = common.checkAjaxInput(form.getvalue('newsmonname'))
-    hostname = common.checkAjaxInput(form.getvalue('newsmon'))
-    port = common.checkAjaxInput(form.getvalue('newsmonport'))
-    enable = common.checkAjaxInput(form.getvalue('newsmonenable'))
-    url = common.checkAjaxInput(form.getvalue('newsmonurl'))
-    body = common.checkAjaxInput(form.getvalue('newsmonbody'))
-    group = common.checkAjaxInput(form.getvalue('newsmongroup'))
-    desc = common.checkAjaxInput(form.getvalue('newsmondescription'))
-    telegram = common.checkAjaxInput(form.getvalue('newsmontelegram'))
-    slack = common.checkAjaxInput(form.getvalue('newsmonslack'))
-    pd = common.checkAjaxInput(form.getvalue('newsmonpd'))
-    check_type = common.checkAjaxInput(form.getvalue('newsmonchecktype'))
-    resolver = common.checkAjaxInput(form.getvalue('newsmonresserver'))
-    record_type = common.checkAjaxInput(form.getvalue('newsmondns_record_type'))
-    packet_size = common.checkAjaxInput(form.getvalue('newsmonpacket_size'))
-    http_method = common.checkAjaxInput(form.getvalue('newsmon_http_method'))
-
-    smon_mod.create_smon(name, hostname, port, enable, url, body, group, desc, telegram, slack, pd, packet_size,
-                         check_type, resolver, record_type, user_group, http_method)
-
-if form.getvalue('smondel') is not None:
-    import modules.tools.smon as smon_mod
-
-    smon_mod.delete_smon()
-
-if form.getvalue('showsmon') is not None:
-    import modules.tools.smon as smon_mod
-
-    smon_mod.show_smon()
-
-if form.getvalue('updateSmonName') is not None:
-    import modules.tools.smon as smon_mod
-
-    smon_mod.update_smon()
-
-if form.getvalue('smon_history_check') is not None:
-    import modules.tools.smon as smon_mod
-
-    server_id = int(form.getvalue('server_id'))
-    check_id = int(form.getvalue('check_id'))
-    smon_mod.history_metrics(server_id, check_id)
-
-if form.getvalue('smon_history_statuses') is not None:
-    import modules.tools.smon as smon_mod
-
-    dashboard_id = int(form.getvalue('dashboard_id'))
-    check_id = int(form.getvalue('check_id'))
-    smon_mod.history_statuses(dashboard_id, check_id)
-
-if form.getvalue('smon_cur_status') is not None:
-    import modules.tools.smon as smon_mod
-
-    dashboard_id = int(form.getvalue('dashboard_id'))
-    check_id = int(form.getvalue('check_id'))
-    smon_mod.history_cur_status(dashboard_id, check_id)
-
-if form.getvalue('showBytes') is not None:
-    import modules.roxywi.overview as roxywi_overview
-
-    server_ip = common.is_ip_or_dns(form.getvalue('showBytes'))
-    roxywi_overview.show_haproxy_binout(server_ip)
-
-if form.getvalue('nginxConnections'):
-    import modules.roxywi.overview as roxywi_overview
-
-    server_ip = common.is_ip_or_dns(form.getvalue('nginxConnections'))
-    roxywi_overview.show_nginx_connections(server_ip)
-
-if form.getvalue('apachekBytes'):
-    import modules.roxywi.overview as roxywi_overview
-
-    server_ip = common.is_ip_or_dns(form.getvalue('apachekBytes'))
-    roxywi_overview.show_apache_bytes(server_ip)
-
-if form.getvalue('keepalivedBecameMaster'):
-    import modules.roxywi.overview as roxywi_overview
-
-    server_ip = common.is_ip_or_dns(form.getvalue('keepalivedBecameMaster'))
-    roxywi_overview.keepalived_became_master(server_ip)
-
-if form.getvalue('waf_rule_id'):
-    import modules.roxywi.waf as roxy_waf
-
-    roxy_waf.switch_waf_rule(serv)
-
-if form.getvalue('new_waf_rule'):
-    import modules.roxywi.waf as roxy_waf
-
-    roxy_waf.create_waf_rule(serv)
-
-if form.getvalue('lets_domain'):
-    lets_domain = common.checkAjaxInput(form.getvalue('lets_domain'))
-    lets_email = common.checkAjaxInput(form.getvalue('lets_email'))
-
-    add_mod.get_le_cert(serv, lets_domain, lets_email)
-
-if form.getvalue('uploadovpn'):
-    name = common.checkAjaxInput(form.getvalue('ovpnname'))
-
-    ovpn_file = f"{os.path.dirname('/tmp/')}/{name}.ovpn"
-
-    try:
-        with open(ovpn_file, "w") as conf:
-            conf.write(form.getvalue('uploadovpn'))
-    except IOError as e:
-        print(str(e))
-        print('error: Cannot save ovpn file')
-    else:
-        print('success: ovpn file has been saved </div>')
-
-    try:
-        cmd = 'sudo openvpn3 config-import --config %s --persistent' % ovpn_file
-        server_mod.subprocess_execute(cmd)
-    except IOError as e:
-        roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
-
-    try:
-        cmd = 'sudo cp %s /etc/openvpn3/%s.conf' % (ovpn_file, name)
-        server_mod.subprocess_execute(cmd)
-    except IOError as e:
-        roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
-
-    roxywi_common.logging("Roxy-WI server", f" has been uploaded a new ovpn file {ovpn_file}", roxywi=1, login=1)
-
-if form.getvalue('openvpndel') is not None:
-    openvpndel = common.checkAjaxInput(form.getvalue('openvpndel'))
-
-    cmd = f'sudo openvpn3 config-remove --config /tmp/{openvpndel}.ovpn --force'
-    try:
-        server_mod.subprocess_execute(cmd)
-        print("Ok")
-        roxywi_common.logging(openvpndel, ' has deleted the ovpn file ', roxywi=1, login=1)
-    except IOError as e:
-        print(e.args[0])
-        roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
-
-if form.getvalue('actionvpn') is not None:
-    openvpn = common.checkAjaxInput(form.getvalue('openvpnprofile'))
-    action = common.checkAjaxInput(form.getvalue('actionvpn'))
-
-    if action == 'start':
-        cmd = f'sudo openvpn3 session-start --config /tmp/{openvpn}.ovpn'
-    elif action == 'restart':
-        cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --restart'
-    elif action == 'disconnect':
-        cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --disconnect'
-    else:
-        print('error: wrong action')
-        sys.exit()
-    try:
-        server_mod.subprocess_execute(cmd)
-        print(f"success: The {openvpn} has been {action}ed")
-        roxywi_common.logging(openvpn, f' The ovpn session has been {action}ed ', roxywi=1, login=1)
-    except IOError as e:
-        print(e.args[0])
-        roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
-
-if form.getvalue('scan_ports') is not None:
-    serv_id = common.checkAjaxInput(form.getvalue('scan_ports'))
-    server = sql.select_servers(id=serv_id)
-    ip = ''
-
-    for s in server:
-        ip = s[2]
-
-    cmd = f"sudo nmap -sS {ip} |grep -E '^[[:digit:]]'|sed 's/  */ /g'"
-    cmd1 = f"sudo nmap -sS {ip} |head -5|tail -2"
-
-    stdout, stderr = server_mod.subprocess_execute(cmd)
-    stdout1, stderr1 = server_mod.subprocess_execute(cmd1)
-
-    if stderr != '':
-        print(stderr)
-    else:
-        lang = roxywi_common.get_user_lang()
-        env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
-        template = env.get_template('ajax/scan_ports.html')
-        template = template.render(ports=stdout, info=stdout1, lang=lang)
-        print(template)
-
-if form.getvalue('viewFirewallRules') is not None:
-    server_mod.show_firewalld_rules()
-
-if form.getvalue('geoipserv') is not None:
-    serv = common.checkAjaxInput(form.getvalue('geoipserv'))
-    service = common.checkAjaxInput(form.getvalue('geoip_service'))
-    if service in ('haproxy', 'nginx'):
-        service_dir = common.return_nice_path(sql.get_setting(f'{service}_dir'))
-        cmd = [f"ls {service_dir}geoip/"]
-        print(server_mod.ssh_command(serv, cmd))
-    else:
-        print('warning: select a server and service first')
-
-if form.getvalue('nettools_icmp_server_from'):
-    import modules.roxywi.nettools as nettools
-
-    nettools.ping_from_server()
-
-if form.getvalue('nettools_telnet_server_from'):
-    import modules.roxywi.nettools as nettools
-
-    nettools.telnet_from_server()
-
-if form.getvalue('nettools_nslookup_server_from'):
-    import modules.roxywi.nettools as nettools
-
-    nettools.nslookup_from_server()
-
-if form.getvalue('portscanner_history_server_id'):
-    server_id = common.checkAjaxInput(form.getvalue('portscanner_history_server_id'))
-    enabled = common.checkAjaxInput(form.getvalue('portscanner_enabled'))
-    notify = common.checkAjaxInput(form.getvalue('portscanner_notify'))
-    history = common.checkAjaxInput(form.getvalue('portscanner_history'))
-    user_group_id = [server[3] for server in sql.select_servers(id=server_id)]
-
-    try:
-        if sql.insert_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history):
-            print('ok')
-        else:
-            if sql.update_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history):
-                print('ok')
-    except Exception as e:
-        print(e)
-
-if form.getvalue('show_versions'):
-    import modules.roxywi.roxy as roxy
-    env = Environment(loader=FileSystemLoader('templates'))
-    template = env.get_template('ajax/check_version.html')
-    template = template.render(versions=roxy.versions())
-    print(template)
-
-if form.getvalue('get_group_name_by_id'):
-    print(sql.get_group_name_by_id(form.getvalue('get_group_name_by_id')))
-
-if form.getvalue('new_provider_name'):
-    import modules.provisioning.provider as provider
-
-    provider.create_provider()
-
-if form.getvalue('providerdel'):
-    import modules.provisioning.provider as provider
-
-    provider.delete_provider()
-
-if form.getvalue('awsinit') or form.getvalue('doinit') or form.getvalue('gcoreinitserver'):
-    import modules.provisioning.server as prov_server
-
-    prov_server.init_server()
-
-if form.getvalue('awsvars') or form.getvalue('awseditvars'):
-    import modules.provisioning.aws as aws
-
-    aws.create_vars()
-
-if form.getvalue('dovars') or form.getvalue('doeditvars'):
-    import modules.provisioning.do as do
-
-    do.create_vars()
-
-if form.getvalue('dovalidate') or form.getvalue('doeditvalidate'):
-    import modules.provisioning.do as do
-
-    do.validate()
-
-if form.getvalue('doworkspace'):
-    import modules.provisioning.do as do
-
-    do.new_workspace()
-
-if form.getvalue('doeditworkspace'):
-    import modules.provisioning.do as do
-
-    do.edit_workspace()
-
-if form.getvalue('awsvalidate') or form.getvalue('awseditvalidate'):
-    import modules.provisioning.aws as aws
-
-    aws.validate()
-
-if form.getvalue('awsworkspace'):
-    import modules.provisioning.aws as aws
-
-    aws.new_workspace()
-
-if form.getvalue('awseditworkspace'):
-    import modules.provisioning.aws as aws
-
-    aws.edit_workspace()
-
-if any((form.getvalue('awsprovisining'), form.getvalue('awseditingprovisining'), form.getvalue('doprovisining'),
-        form.getvalue('doeditprovisining'), form.getvalue('gcoreprovisining'), form.getvalue('gcoreeditgprovisining'))):
-    import modules.provisioning.server as prov_server
-
-    prov_server.create_server()
-
-if form.getvalue('provisiningdestroyserver'):
-    import modules.provisioning.server as prov_server
-
-    prov_server.destroy_server()
-
-if form.getvalue('gcorevars') or form.getvalue('gcoreeditvars'):
-    import modules.provisioning.gcore as gcore
-
-    gcore.gcore_create_vars()
-
-if form.getvalue('gcorevalidate') or form.getvalue('gcoreeditvalidate'):
-    import modules.provisioning.gcore as gcore
-
-    gcore.validate()
-
-if form.getvalue('gcoreworkspace'):
-    import modules.provisioning.gcore as gcore
-
-    gcore.new_workspace()
-
-if form.getvalue('gcoreeditworkspace'):
-    import modules.provisioning.gcore as gcore
-
-    gcore.edit_workspace()
-
-if form.getvalue('editServerId'):
-    import modules.provisioning.server as prov_server_mod
-
-    prov_server_mod.edit_server()
-
-if form.getvalue('edit_provider_id'):
-    import modules.provisioning.provider as provider_mod
-
-    provider = form.getvalue('provider_name')
-    provider_id = form.getvalue('edit_provider_id')
-
-    edit_functions = {
-        'aws': provider_mod.edit_aws_provider,
-        'do': provider_mod.edit_DO_provider,
-        'gcore': provider_mod.edit_gcore_provider,
-    }
-
-    edit_functions[provider](provider_id)
-
-if form.getvalue('loadservices'):
-    from modules.roxywi.roxy import get_services_status
-
-    lang = roxywi_common.get_user_lang()
-    env = Environment(loader=FileSystemLoader('templates'))
-    template = env.get_template('ajax/load_services.html')
-    try:
-        services = get_services_status()
-    except Exception as e:
-        print(e)
-
-    template = template.render(services=services, lang=lang)
-    print(template)
-
-if form.getvalue('loadchecker'):
-    import modules.tools.checker as checker_mod
-
-    checker_mod.load_checker()
-
-if form.getvalue('load_update_hapwi'):
-    import modules.roxywi.roxy as roxy
-
-    env = Environment(loader=FileSystemLoader('templates'))
-    template = env.get_template('ajax/load_updateroxywi.html')
-
-    versions = roxy.versions()
-    checker_ver = roxy.check_new_version('checker')
-    smon_ver = roxy.check_new_version('smon')
-    metrics_ver = roxy.check_new_version('metrics')
-    keep_ver = roxy.check_new_version('keep_alive')
-    portscanner_ver = roxy.check_new_version('portscanner')
-    socket_ver = roxy.check_new_version('socket')
-    prometheus_exp_ver = roxy.check_new_version('prometheus-exporter')
-    services = roxy.get_services_status()
-    lang = roxywi_common.get_user_lang()
-
-    template = template.render(services=services,
-                               versions=versions,
-                               checker_ver=checker_ver,
-                               smon_ver=smon_ver,
-                               metrics_ver=metrics_ver,
-                               portscanner_ver=portscanner_ver,
-                               socket_ver=socket_ver,
-                               prometheus_exp_ver=prometheus_exp_ver,
-                               keep_ver=keep_ver,
-                               lang=lang)
-    print(template)
-
-if form.getvalue('loadopenvpn'):
-    import distro
-
-    env = Environment(loader=FileSystemLoader('templates'))
-    template = env.get_template('ajax/load_openvpn.html')
-    openvpn_configs = ''
-    openvpn_sess = ''
-    openvpn = ''
-
-    if distro.id() == 'ubuntu':
-        stdout, stderr = server_mod.subprocess_execute("apt show openvpn3 2>&1|grep E:")
-    elif distro.id() == 'centos' or distro.id() == 'rhel':
-        stdout, stderr = server_mod.subprocess_execute("rpm --query openvpn3-client")
-
-    if (
-            (stdout[0] != 'package openvpn3-client is not installed' and stderr != '/bin/sh: rpm: command not found')
-            and stdout[0] != 'E: No packages found'
-    ):
-        cmd = "sudo openvpn3 configs-list |grep -E 'ovpn|(^|[^0-9])[0-9]{4}($|[^0-9])' |grep -v net|awk -F\"    \" '{print $1}'|awk 'ORS=NR%2?\" \":\"\\n\"'"
-        openvpn_configs, stderr = server_mod.subprocess_execute(cmd)
-        cmd = "sudo openvpn3 sessions-list|grep -E 'Config|Status'|awk -F\":\" '{print $2}'|awk 'ORS=NR%2?\" \":\"\\n\"'| sed 's/^ //g'"
-        openvpn_sess, stderr = server_mod.subprocess_execute(cmd)
-        openvpn = stdout[0]
-
-    template = template.render(openvpn=openvpn, openvpn_sess=openvpn_sess, openvpn_configs=openvpn_configs)
-    print(template)
-
-if form.getvalue('check_receiver'):
-    import modules.alerting.alerting as alerting
-
-    channel_id = form.getvalue('receiver_channel_id')
-    receiver_name = form.getvalue('receiver_name')
-    alerting.check_receiver(channel_id, receiver_name)
-
-if form.getvalue('check_rabbitmq_alert'):
-    import modules.alerting.alerting as alerting
-
-    alerting.check_rabbit_alert()
-
-if form.getvalue('check_email_alert'):
-    import modules.alerting.alerting as alerting
-
-    alerting.check_email_alert()
-
-if form.getvalue('getoption'):
-    group = form.getvalue('getoption')
-    term = form.getvalue('term')
-
-    add_mod.get_saved_option(group, term)
-
-if form.getvalue('newtoption'):
-    option = common.checkAjaxInput(form.getvalue('newtoption'))
-    group = common.checkAjaxInput(form.getvalue('newoptiongroup'))
-    if option is None or group is None:
-        print(error_mess)
-    else:
-       add_mod.create_saved_option(option, group)
-
-if form.getvalue('updateoption') is not None:
-    option = common.checkAjaxInput(form.getvalue('updateoption'))
-    option_id = common.checkAjaxInput(form.getvalue('id'))
-    if option is None or option_id is None:
-        print(error_mess)
-    else:
-        sql.update_options(option, option_id)
-
-if form.getvalue('optiondel') is not None:
-    if sql.delete_option(common.checkAjaxInput(form.getvalue('optiondel'))):
-        print("Ok")
-
-if form.getvalue('getsavedserver'):
-    group = common.checkAjaxInput(form.getvalue('getsavedserver'))
-    term = common.checkAjaxInput(form.getvalue('term'))
-
-    add_mod.get_saved_servers(group, term)
-
-if form.getvalue('newsavedserver'):
-    server = common.checkAjaxInput(form.getvalue('newsavedserver'))
-    desc = common.checkAjaxInput(form.getvalue('newsavedserverdesc'))
-    group = common.checkAjaxInput(form.getvalue('newsavedservergroup'))
-    if server is None or group is None:
-        print(error_mess)
-    else:
-        add_mod.create_saved_server(server, group, desc)
-
-if form.getvalue('updatesavedserver') is not None:
-    savedserver = form.getvalue('updatesavedserver')
-    description = form.getvalue('description')
-    savedserver_id = form.getvalue('id')
-    if savedserver is None or savedserver_id is None:
-        print(error_mess)
-    else:
-        sql.update_savedserver(savedserver, description, savedserver_id)
-
-if form.getvalue('savedserverdel') is not None:
-    if sql.delete_savedserver(common.checkAjaxInput(form.getvalue('savedserverdel'))):
-        print("Ok")
-
-if form.getvalue('show_users_ovw') is not None:
-    import modules.roxywi.overview as roxywi_overview
-
-    roxywi_overview.user_ovw()
-
-if form.getvalue('serverSettings') is not None:
-    server_id = common.checkAjaxInput(form.getvalue('serverSettings'))
-    service = common.checkAjaxInput(form.getvalue('serverSettingsService'))
-    env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-    template = env.get_template('ajax/show_service_settings.html')
-
-    template = template.render(settings=sql.select_service_settings(server_id, service), service=service)
-    print(template)
-
-if form.getvalue('serverSettingsSave') is not None:
-    server_id = common.checkAjaxInput(form.getvalue('serverSettingsSave'))
-    service = common.checkAjaxInput(form.getvalue('serverSettingsService'))
-    haproxy_enterprise = common.checkAjaxInput(form.getvalue('serverSettingsEnterprise'))
-    service_dockerized = common.checkAjaxInput(form.getvalue('serverSettingsDockerized'))
-    service_restart = common.checkAjaxInput(form.getvalue('serverSettingsRestart'))
-    server_ip = sql.select_server_ip_by_id(server_id)
-    service_docker = f'Service {service.title()} has been flagged as a dockerized'
-    service_systemd = f'Service {service.title()} has been flagged as a system service'
-    disable_restart = f'Restart option is disabled for {service.title()} service'
-    enable_restart = f'Restart option is disabled for {service.title()} service'
-
-    if service == 'haproxy':
-        if sql.insert_or_update_service_setting(server_id, service, 'haproxy_enterprise', haproxy_enterprise):
-            print('Ok')
-            if haproxy_enterprise == '1':
-                roxywi_common.logging(server_ip, 'Service has been flagged as an Enterprise version', roxywi=1, login=1,
-                              keep_history=1, service=service)
-            else:
-                roxywi_common.logging(server_ip, 'Service has been flagged as a community version', roxywi=1, login=1,
-                              keep_history=1, service=service)
-
-    if sql.insert_or_update_service_setting(server_id, service, 'dockerized', service_dockerized):
-        print('Ok')
-        if service_dockerized == '1':
-            roxywi_common.logging(server_ip, service_docker, roxywi=1, login=1, keep_history=1, service=service)
-        else:
-            roxywi_common.logging(server_ip, service_systemd, roxywi=1, login=1, keep_history=1, service=service)
-
-    if sql.insert_or_update_service_setting(server_id, service, 'restart', service_restart):
-        print('Ok')
-        if service_restart == '1':
-            roxywi_common.logging(server_ip, disable_restart, roxywi=1, login=1, keep_history=1, service=service)
-        else:
-            roxywi_common.logging(server_ip, enable_restart, roxywi=1, login=1, keep_history=1, service=service)
-
-if act == 'showListOfVersion':
-    config_mod.list_of_versions(serv, service)
-
-if act == 'getSystemInfo':
-    server_mod.show_system_info()
-
-if act == 'updateSystemInfo':
-    server_mod.update_system_info()
-
-if act == 'server_is_up':
-    server_ip = common.is_ip_or_dns(form.getvalue('server_is_up'))
-
-    server_mod.server_is_up(server_ip)
-
-if act == 'findInConfigs':
-    server_ip = serv
-    server_ip = common.is_ip_or_dns(server_ip)
-    finding_words = form.getvalue('words')
-    log_path = sql.get_setting(service + '_dir')
-    log_path = common.return_nice_path(log_path)
-    commands = [f'sudo grep "{finding_words}" {log_path}*/*.conf -C 2 -Rn']
-    return_find = server_mod.ssh_command(server_ip, commands, raw=1)
-    return_find = config_mod.show_finding_in_config(return_find, grep=finding_words)
-
-    if 'error: ' in return_find:
-        print(return_find)
-        sys.exit()
-    print(return_find)
-
-if act == 'check_service':
-    import modules.service.action as service_action
-
-    cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
-    user_uuid = cookie.get('uuid')
-    server_id = common.checkAjaxInput(form.getvalue('server_id'))
-
-    service_action.check_service(serv, user_uuid, service)
-
-if form.getvalue('show_sub_ovw'):
-    import modules.roxywi.overview as roxywi_overview
-
-    roxywi_overview.show_sub_ovw()
-
-if form.getvalue('updateHaproxyCheckerSettings'):
-    import modules.tools.checker as checker_mod
-
-    checker_mod.update_haproxy_settings()
-
-if form.getvalue('updateKeepalivedCheckerSettings'):
-    import modules.tools.checker as checker_mod
-
-    checker_mod.update_keepalived_settings()
-
-if form.getvalue('updateServiceCheckerSettings'):
-    import modules.tools.checker as checker_mod
-
-    checker_mod.update_service_settings()
-
-if act == 'show_server_services':
-    server_mod.show_server_services()
-
-if form.getvalue('changeServerServicesId') is not None:
-    server_mod.change_server_services()
diff --git a/app/overview.py b/app/overview.py
deleted file mode 100644
index 0a213c05..00000000
--- a/app/overview.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-import sys
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.roxywi.logs as roxy_logs
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('ovw.html')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception:
-	print('error: your session is expired')
-	sys.exit()
-
-try:
-	groups = sql.select_groups()
-except Exception as e:
-	groups = ''
-	print(e)
-
-rendered_template = template.render(
-	h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], groups=groups,
-	roles=sql.select_roles(), servers=user_params['servers'], user_services=user_params['user_services'],
-	roxy_wi_log=roxy_logs.roxy_wi_log(), token=user_params['token'], guide_me=1, lang=user_params['lang']
-)
-print(rendered_template)
diff --git a/app/portscanner.py b/app/portscanner.py
deleted file mode 100644
index fa7c4fbd..00000000
--- a/app/portscanner.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-import modules.server.server as server_mod
-
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('portscanner.html')
-form = common.form
-serv = form.getvalue('history')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(virt=1)
-lang = user_params['lang']
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception as e:
-	print(f'error {e}')
-	sys.exit()
-
-if serv:
-	if lang == 'ru':
-		title = f'История Port scanner для {serv}'
-	elif lang == 'fr':
-		title = f'Historique du scanner de ports pour {serv}'
-	else:
-		title = f'Port scanner history for {serv}'
-	port_scanner_settings = sql.select_port_scanner_history(serv)
-	history = '1'
-	port_scanner = ''
-	port_scanner_stderr = ''
-	count_ports = ''
-else:
-	history = ''
-	if lang == 'ru':
-		title = 'Дашборд Port scanner'
-	elif lang == 'fr':
-		title = 'Tableau de bord du scanner de ports'
-	else:
-		title = 'Port scanner dashboard'
-	user_group = roxywi_common.get_user_group(id=1)
-	port_scanner_settings = sql.select_port_scanner_settings(user_group)
-	if not port_scanner_settings:
-		port_scanner_settings = ''
-		count_ports = ''
-	else:
-		count_ports = list()
-		for s in user_params['servers']:
-			count_ports_from_sql = sql.select_count_opened_ports(s[2])
-			i = (s[2], count_ports_from_sql)
-			count_ports.append(i)
-
-	cmd = "systemctl is-active roxy-wi-portscanner"
-	port_scanner, port_scanner_stderr = server_mod.subprocess_execute(cmd)
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-rendered_template = template.render(
-	h2=1, autorefresh=0, title=title, role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
-	port_scanner_settings=port_scanner_settings, count_ports=count_ports, history=history, port_scanner=''.join(port_scanner),
-	port_scanner_stderr=port_scanner_stderr, user_services=user_params['user_services'], user_status=user_subscription['user_status'],
-	user_plan=user_subscription['user_plan'], token=user_params['token'], lang=lang
-)
-print(rendered_template)
diff --git a/app/provisioning.py b/app/provisioning.py
deleted file mode 100644
index 25f49c28..00000000
--- a/app/provisioning.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('provisioning.html')
-form = common.form
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-try:
-    roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception as e:
-    print(f'error {e}')
-    sys.exit()
-
-roxywi_auth.page_for_admin(level=2)
-try:
-    if user_params['role'] == 1:
-        groups = sql.select_groups()
-    else:
-        groups = roxywi_common.get_user_group(id=1)
-    user_group = roxywi_common.get_user_group(id=1)
-
-    is_needed_tool = common.is_tool('terraform')
-
-    params = sql.select_provisioning_params()
-except Exception as e:
-    print(str(e))
-
-if user_params['lang'] == 'ru':
-    title = 'Предоставление серверов'
-else:
-    title = 'Servers provisioning'
-
-rendered_template = template.render(
-    title=title, role=user_params['role'], user=user_params['user'], groups=groups, lang=user_params['lang'],
-    user_group=user_group, servers=sql.select_provisioned_servers(), providers=sql.select_providers(user_group),
-    is_needed_tool=is_needed_tool, user_services=user_params['user_services'], token=user_params['token'], params=params
-)
-print(rendered_template)
diff --git a/app/routes/add/__init__.py b/app/routes/add/__init__.py
new file mode 100644
index 00000000..6f94b4c8
--- /dev/null
+++ b/app/routes/add/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('add', __name__)
+
+from app.routes.add import routes
diff --git a/app/routes/add/routes.py b/app/routes/add/routes.py
new file mode 100644
index 00000000..08ce9bd8
--- /dev/null
+++ b/app/routes/add/routes.py
@@ -0,0 +1,689 @@
+import os
+import sys
+
+from functools import wraps
+from flask import render_template, request, jsonify, redirect, url_for
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.add import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.config.add as add_mod
+import modules.common.common as common
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.roxy_wi_tools as roxy_wi_tools
+import app.modules.server.server as server_mod
+
+get_config = roxy_wi_tools.GetConfigVar()
+time_zone = sql.get_setting('time_zone')
+get_date = roxy_wi_tools.GetDate(time_zone)
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/<service>')
+def add(service):
+    roxywi_auth.page_for_admin(level=3)
+
+    if service not in ('haproxy', 'nginx'):
+        raise Exception('error: wrong service')
+
+    try:
+        user_params = roxywi_common.get_users_params(service=service)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    add = request.form.get('add')
+    conf_add = request.form.get('conf')
+
+    if service == 'haproxy':
+        user_group = request.cookies.get('group')
+        lib_path = get_config.get_config_var('main', 'lib_path')
+        list_dir = lib_path + "/lists"
+        white_dir = lib_path + "/lists/" + user_group + "/white"
+        black_dir = lib_path + "/lists/" + user_group + "/black"
+
+        if not os.path.exists(list_dir):
+            os.makedirs(list_dir)
+        if not os.path.exists(list_dir + "/" + user_group):
+            os.makedirs(list_dir + "/" + user_group)
+        if not os.path.exists(white_dir):
+            os.makedirs(white_dir)
+        if not os.path.exists(black_dir):
+            os.makedirs(black_dir)
+
+        white_lists = roxywi_common.get_files(folder=white_dir, file_format="lst")
+        black_lists = roxywi_common.get_files(folder=black_dir, file_format="lst")
+        maps = roxywi_common.get_files(folder=f'{lib_path}/maps/{user_group}', file_format="map")
+
+        return render_template(
+            'add.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'], add=add,
+            conf_add=conf_add, group=user_group, options=sql.select_options(), saved_servers=sql.select_saved_servers(),
+            white_lists=white_lists, black_lists=black_lists, user_services=user_params['user_services'],
+            token=user_params['token'], lang=user_params['lang'], maps=maps
+        )
+    elif service == 'nginx':
+        return render_template(
+            'add_nginx.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'], add=add,
+            conf_add=conf_add, user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
+        )
+    else:
+        return redirect(url_for('index'))
+
+
+@bp.route('/haproxy/add', methods=['POST'])
+def add_haproxy():
+    roxywi_auth.page_for_admin(level=3)
+
+    haproxy_dir = sql.get_setting('haproxy_dir')
+    generate = request.form.get('generateconfig')
+    server_ip = request.form.get('serv')
+    port = request.form.getlist('port')
+    bind = ""
+    ip = ""
+    force_close = request.form.get('force_close')
+    balance = ""
+    mode = f"    mode {request.form.get('mode')}\n"
+    maxconn = ""
+    options_split = ""
+    ssl = ""
+    ssl_check = ""
+    backend = ""
+    headers = ''
+    acl = ""
+    servers_split = ""
+    new_listener = request.form.get('listener')
+    new_frontend = request.form.get('frontend')
+    new_backend = request.form.get('new_backend')
+
+    if request.form.get('balance') is not None:
+        balance = "    balance " + request.form.get('balance') + "\n"
+
+    if request.form.get('health_check') is not None:
+        health_check = request.form.get('health_check')
+        if health_check == 'option httpchk' and request.form.get('checks_http_domain') is not None:
+            health_check = health_check + ' GET ' + request.form.get(
+                'checks_http_path') + ' "HTTP/1.0\\r\\nHost: ' + request.form.get('checks_http_domain') + '"'
+        balance += f"    {health_check}\n"
+
+    if request.form.get('ip') is not None:
+        ip = request.form.getlist('ip')
+
+    if new_listener is not None:
+        name = f"listen {new_listener}"
+        end_name = new_listener
+    elif new_frontend is not None:
+        name = f"frontend {new_frontend}"
+        end_name = new_frontend
+    elif new_backend is not None:
+        name = f"backend {new_backend}"
+        end_name = new_backend
+    else:
+        return 'error: The name cannot be empty'
+
+    if request.form.get('backends') is not None:
+        backend = f"    default_backend {request.form.get('backends')}\n"
+
+    if request.form.get('maxconn'):
+        maxconn = f"    maxconn {request.form.get('maxconn')}\n"
+
+    if request.form.get('ssl') == "https" and request.form.get('mode') != "tcp":
+        cert_path = sql.get_setting('cert_path')
+        if request.form.get('cert') is not None:
+            ssl = f"ssl crt {cert_path}{request.form.get('cert')}"
+        if request.form.get('ssl-dis-check') is None:
+            if request.form.get('ssl-check') == "ssl-check":
+                ssl_check = " ssl verify none"
+            else:
+                ssl_check = " ssl verify"
+
+    if ip or port:
+        if type(port) is list:
+            i = 0
+            for _p in port:
+                if ip[i] == 'IsEmptY':
+                    if ip[i] == 'IsEmptY' and port[i] == 'IsEmptY':
+                        i += 1
+                        continue
+                    else:
+                        port_value = port[i]
+                    bind += f"    bind *:{port_value} {ssl}\n"
+                else:
+                    if port[i] == 'IsEmptY':
+                        return 'error: IP cannot be bind without a port'
+                    else:
+                        port_value = port[i]
+                    bind += f"    bind {ip[i]}:{port_value} {ssl}\n"
+                i += 1
+
+    if request.form.get('default-check') == "1":
+        if request.form.get('check-servers') == "1":
+            check = f" check inter {request.form.get('inter')} rise {request.form.get('rise')} fall {request.form.get('fall')}{ssl_check}"
+        else:
+            check = ""
+    else:
+        if request.form.get('check-servers') != "1":
+            check = ""
+        else:
+            check = f" check{ssl_check}"
+
+    if request.form.get('option') is not None:
+        options = request.form.get('option')
+        i = options.split("\n")
+        for j in i:
+            options_split += f"    {j}\n"
+
+    if force_close == "1":
+        options_split += "    option http-server-close\n"
+    elif force_close == "2":
+        options_split += "    option forceclose\n"
+    elif force_close == "3":
+        options_split += "    option http-pretend-keepalive\n"
+
+    if request.form.get('whitelist'):
+        options_split += "    tcp-request connection accept if { src -f " + haproxy_dir + "/white/" + request.form.get(
+            'whitelist') + " }\n"
+
+    if request.form.get('blacklist'):
+        options_split += "    tcp-request connection reject if { src -f " + haproxy_dir + "/black/" + request.form.get(
+            'blacklist') + " }\n"
+
+    if request.form.get('cookie'):
+        cookie = f"    cookie {request.form.get('cookie_name')}"
+        if request.form.get('cookie_domain'):
+            cookie += f" domain {request.form.get('cookie_domain')}"
+        if request.form.get('rewrite'):
+            rewrite = request.form.get('rewrite')
+        else:
+            rewrite = ""
+        if request.form.get('prefix'):
+            prefix = request.form.get('prefix')
+        else:
+            prefix = ""
+        if request.form.get('nocache'):
+            nocache = request.form.get('nocache')
+        else:
+            nocache = ""
+        if request.form.get('postonly'):
+            postonly = request.form.get('postonly')
+        else:
+            postonly = ""
+        if request.form.get('dynamic'):
+            dynamic = request.form.get('dynamic')
+        else:
+            dynamic = ""
+        cookie += f" {rewrite} {prefix} {nocache} {postonly} {dynamic}\n"
+        options_split += cookie
+        if request.form.get('dynamic'):
+            options_split += f"    dynamic-cookie-key {request.form.get('dynamic-cookie-key')}\n"
+
+    if request.form.get('headers_res'):
+        headers_res = request.form.getlist('headers_res')
+        headers_method = request.form.getlist('headers_method')
+        header_name = request.form.getlist('header_name')
+        header_value = request.form.getlist('header_value')
+        i = 0
+
+        for _h in headers_method:
+            if headers_method[i] != 'del-header':
+                headers += f'    {headers_res[i]} {headers_method[i]} {header_name[i]} {header_value[i]}\n'
+            else:
+                headers += f'    {headers_res[i]} {headers_method[i]} {header_name[i]}\n'
+            i += 1
+
+    if request.form.get('acl_if'):
+        acl_if = request.form.getlist('acl_if')
+        acl_value = request.form.getlist('acl_value')
+        acl_then = request.form.getlist('acl_then')
+        acl_then_values = request.form.getlist('acl_then_value')
+        i = 0
+
+        for a in acl_if:
+            acl_then_value = '' if acl_then_values[i] == 'IsEmptY' else acl_then_values[i]
+
+            try:
+                if a == '1':
+                    acl_if_word = 'hdr_beg(host) -i '
+                    if request.form.get('ssl') == "https" and request.form.get('mode') != "tcp":
+                        acl_if_word = 'ssl_fc_sni -i '
+                    if request.form.get('mode') == "tcp":
+                        acl_if_word = 'req.ssl_sni -i '
+                elif a == '2':
+                    acl_if_word = 'hdr_end(host) -i '
+                    if request.form.get('ssl') == "https" and request.form.get('mode') != "tcp":
+                        acl_if_word = 'ssl_fc_sni -i '
+                    if request.form.get('mode') == "tcp":
+                        acl_if_word = 'req.ssl_sni -i '
+                elif a == '3':
+                    acl_if_word = 'path_beg -i '
+                elif a == '4':
+                    acl_if_word = 'path_end -i '
+                elif a == '6':
+                    acl_if_word = 'src ip '
+                else:
+                    acl_if_word = ''
+
+                if acl_then[i] == '5':
+                    acl += '    use_backend '
+                elif acl_then[i] == '2':
+                    acl += '    http-request redirect location '
+                elif acl_then[i] == '3':
+                    acl += '    http-request allow'
+                    acl_then_value = ''
+                elif acl_then[i] == '4':
+                    acl += '    http-request deny'
+                    acl_then_value = ''
+                elif acl_then[i] == '6':
+                    acl += f'    acl return_{acl_value[i]} {acl_if_word} {acl_value[i]}\n'
+                    acl += f'    http-request return if return_{acl_value[i]}\n'
+                elif acl_then[i] == '7':
+                    acl += f'    acl set_header_{acl_value[i]} {acl_if_word} {acl_value[i]}\n'
+                    acl += f'    http-request set-header if set_header_{acl_value[i]}\n'
+
+                if acl_then[i] in ('2', '3', '4', '5'):
+                    acl += acl_then_value + ' if { ' + acl_if_word + acl_value[i] + ' } \n'
+            except Exception:
+                acl = ''
+
+            i += 1
+
+    if request.form.get('circuit_breaking') == "1":
+        observe = 'observe ' + request.form.get('circuit_breaking_observe')
+        error_limit = ' error-limit ' + request.form.get('circuit_breaking_error_limit')
+        circuit_breaking_on_error = ' on-error ' + request.form.get('circuit_breaking_on_error')
+        default_server = '    default-server ' + observe + error_limit + circuit_breaking_on_error + '\n'
+        servers_split += default_server
+
+    if request.form.get('servers'):
+        servers = request.form.getlist('servers')
+        server_port = request.form.getlist('server_port')
+        send_proxy = request.form.getlist('send_proxy')
+        backup = request.form.getlist('backup')
+        server_maxconn = request.form.getlist('server_maxconn')
+        port_check = request.form.getlist('port_check')
+        i = 0
+        for server in servers:
+            if server == '':
+                continue
+            if request.form.get('template') is None:
+                try:
+                    if send_proxy[i] == '1':
+                        send_proxy_param = 'send-proxy'
+                    else:
+                        send_proxy_param = ''
+                except Exception:
+                    send_proxy_param = ''
+
+                try:
+                    if backup[i] == '1':
+                        backup_param = 'backup'
+                    else:
+                        backup_param = ''
+                except Exception:
+                    backup_param = ''
+
+                try:
+                    maxconn_val = server_maxconn[i]
+                except Exception:
+                    maxconn_val = '200'
+
+                try:
+                    port_check_val = port_check[i]
+                except Exception:
+                    port_check_val = server_port[i]
+
+                servers_split += "    server {0} {0}:{1}{2} port {6} maxconn {5} {3} {4} \n".format(
+                    server, server_port[i], check, send_proxy_param, backup_param, maxconn_val, port_check_val
+                )
+            else:
+                servers_split += "    server-template {0} {1} {2}:{3} {4} \n".format(
+                    request.form.get('prefix'), request.form.get('template-number'), server, server_port[i], check
+                )
+            i += 1
+
+    compression = request.form.get("compression")
+    cache = request.form.get("cache")
+    compression_s = ""
+    cache_s = ""
+    cache_set = ""
+    filter_com = ""
+    if compression == "1" or cache == "2":
+        filter_com = "    filter compression\n"
+        if cache == "2":
+            cache_s = f"    http-request cache-use {end_name}\n    http-response cache-store {end_name}\n"
+            cache_set = f"cache {end_name}\n    total-max-size 4\n    max-age 240\n"
+        if compression == "1":
+            compression_s = "    compression algo gzip\n    compression type text/html text/plain text/css\n"
+
+    waf = ""
+    if request.form.get('waf'):
+        waf = f"    filter spoe engine modsecurity config {haproxy_dir}/waf.conf\n"
+        waf += "    http-request deny if { var(txn.modsec.code) -m int gt 0 }\n"
+
+    config_add = f"\n{name}\n{bind}{mode}{maxconn}{balance}{options_split}{cache_s}{filter_com}{compression_s}" \
+                 f"{waf}{headers}{acl}{backend}{servers_split}\n{cache_set}\n"
+
+    if generate:
+        return config_add
+    else:
+        try:
+            return add_mod.save_to_haproxy_config(config_add, server_ip)
+        except Exception as e:
+            return str(e)
+
+
+@bp.post('/haproxy/userlist')
+def add_userlist():
+    roxywi_auth.page_for_admin(level=3)
+    return add_mod.add_userlist()
+
+
+@bp.post('/haproxy/bwlist/create')
+def create_bwlist():
+    server_ip = common.is_ip_or_dns(request.form.get('serv'))
+    color = common.checkAjaxInput(request.form.get('color'))
+    group = common.checkAjaxInput(request.form.get('group'))
+    list_name = common.checkAjaxInput(request.form.get('bwlists_create'))
+
+    return add_mod.create_bwlist(server_ip, list_name, color, group)
+
+
+@bp.post('/haproxy/bwlist/save')
+@login_required
+def save_bwlist():
+    server_ip = common.is_ip_or_dns(request.form.get('serv'))
+    color = common.checkAjaxInput(request.form.get('color'))
+    group = common.checkAjaxInput(request.form.get('group'))
+    bwlists_save = common.checkAjaxInput(request.form.get('bwlists_save'))
+    list_con = request.form.get('bwlists_content')
+    action = common.checkAjaxInput(request.form.get('bwlists_restart'))
+
+    return add_mod.save_bwlist(bwlists_save, list_con, color, group, server_ip, action)
+
+
+@bp.route('/haproxy/bwlist/delete/<server_ip>/<color>/<name>/<int:group>')
+def delete_bwlist(server_ip, color, name, group):
+    server_ip = common.is_ip_or_dns(server_ip)
+    color = common.checkAjaxInput(color)
+    list_name = common.checkAjaxInput(name)
+
+    return add_mod.delete_bwlist(list_name, color, group, server_ip)
+
+
+@bp.route('/haproxy/bwlist/<bwlists>/<color>/<int:group>')
+def get_bwlist(bwlists, color, group):
+    color = common.checkAjaxInput(color)
+    bwlists = common.checkAjaxInput(bwlists)
+
+    return add_mod.get_bwlist(color, group, bwlists)
+
+
+@bp.route('/haproxy/bwlists/<color>/<int:group>')
+def get_bwlists(color, group):
+    color = common.checkAjaxInput(color)
+
+    return add_mod.get_bwlists_for_autocomplete(color, group)
+
+
+@bp.route('/haproxy/userlist/<server_ip>')
+def show_userlist(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    return add_mod.show_userlist(server_ip)
+
+
+@bp.post('/haproxy/peers')
+def add_peers():
+    roxywi_auth.page_for_admin(level=3)
+
+    generate = request.form.get('generateconfig')
+    server_ip = request.form.get('serv')
+    servers_split = ''
+    name = "peers " + request.form.get('peers-name') + "\n"
+    servers = request.form.getlist('servers')
+    server_port = request.form.getlist('server_port')
+    servers_name = request.form.getlist('servers_name')
+    i = 0
+
+    for server in servers:
+        if server == '':
+            continue
+        servers_split += "    peer {0} {1}:{2} \n".format(servers_name[i], server, server_port[i])
+        i += 1
+
+    config_add = "\n" + name + servers_split
+
+    if generate:
+        return config_add, 200
+    else:
+        try:
+            return add_mod.save_to_haproxy_config(config_add, server_ip)
+        except Exception as e:
+            return (str(e)), 200
+
+
+@bp.route('/option/get/<group>')
+def get_option(group):
+    term = request.args.get('term')
+
+    return jsonify(add_mod.get_saved_option(group, term))
+
+
+@bp.post('/option/save')
+def save_option():
+    option = common.checkAjaxInput(request.form.get('option'))
+    group = int(request.form.get('option_group'))
+
+    return add_mod.create_saved_option(option, group)
+
+
+@bp.post('/option/update')
+def update_option():
+    option = common.checkAjaxInput(request.form.get('option'))
+    option_id = int(request.form.get('id'))
+
+    try:
+        sql.update_options(option, option_id)
+    except Exception as e:
+        return str(e)
+    else:
+        return 'ok'
+
+
+@bp.route('/option/delete/<int:option_id>')
+def delete_option(option_id):
+    try:
+        sql.delete_option(option_id)
+    except Exception as e:
+        return str(e)
+    else:
+        return 'ok'
+
+
+@bp.route('/server/get/<group>')
+def get_saved_server(group):
+    term = request.args.get('term')
+
+    return jsonify(add_mod.get_saved_servers(group, term))
+
+
+@bp.post('/server/save')
+def save_saved_server():
+    server = common.checkAjaxInput(request.form.get('server'))
+    group = int(request.form.get('group'))
+    desc = common.checkAjaxInput(request.form.get('desc'))
+
+    return add_mod.create_saved_server(server, group, desc)
+
+
+@bp.post('/server/update')
+def update_saved_server():
+    server = common.checkAjaxInput(request.form.get('server'))
+    server_id = int(request.form.get('id'))
+    desc = common.checkAjaxInput(request.form.get('desc'))
+
+    try:
+        sql.update_savedserver(server, desc, server_id)
+    except Exception as e:
+        return str(e)
+    else:
+        return 'ok'
+
+
+@bp.route('/server/delete/<int:server_id>')
+def delete_saved_server(server_id):
+    try:
+        sql.delete_savedserver(server_id)
+    except Exception as e:
+        return str(e)
+    else:
+        return 'ok'
+
+
+@bp.route('/certs/<server_ip>')
+def get_certs(server_ip):
+    return add_mod.get_ssl_certs(server_ip)
+
+
+@bp.route('/cert/<server_ip>/<cert_id>', methods=['DELETE', 'GET'])
+def get_cert(server_ip, cert_id):
+    if request.method == 'DELETE':
+        return add_mod.del_ssl_cert(server_ip, cert_id)
+    elif request.method == 'GET':
+        return add_mod.get_ssl_cert(server_ip, cert_id)
+
+
+@bp.post('/cert/add')
+def upload_cert():
+    server_ip = common.is_ip_or_dns(request.form.get('serv'))
+    ssl_name = request.form.get('ssl_name')
+    ssl_cont = request.form.get('ssl_cert')
+
+    return add_mod.upload_ssl_cert(server_ip, ssl_name, ssl_cont)
+
+
+@bp.route('/cert/get/raw/<server_ip>/<cert_id>')
+def get_cert_raw(server_ip, cert_id):
+    return add_mod.get_ssl_raw_cert(server_ip, cert_id)
+
+
+@bp.post('/map/create')
+def create_map():
+    server_ip = common.checkAjaxInput(request.form.get('serv'))
+    map_name = common.checkAjaxInput(request.form.get('map_create'))
+    group = common.checkAjaxInput(request.form.get('group'))
+
+    try:
+        return add_mod.create_map(server_ip, map_name, group)
+    except Exception as e:
+        return str(e)
+
+
+@bp.post('/map/save')
+def save_map():
+    server_ip = common.checkAjaxInput(request.form.get('serv'))
+    group = common.checkAjaxInput(request.form.get('group'))
+    map_save = common.checkAjaxInput(request.form.get('map_save'))
+    content = request.form.get('content')
+    action = common.checkAjaxInput(request.form.get('map_restart'))
+
+    return add_mod.save_map(map_save, content, group, server_ip, action)
+
+
+@bp.post('/map/edit')
+def edit_map():
+    group = common.checkAjaxInput(request.form.get('group'))
+    map_name = common.checkAjaxInput(request.form.get('edit_map'))
+
+    return add_mod.edit_map(map_name, group)
+
+
+@bp.post('/map/delete')
+def delete_map():
+    map_name = common.checkAjaxInput(request.form.get('map_delete'))
+    group = common.checkAjaxInput(request.form.get('group'))
+    server_id = common.checkAjaxInput(request.form.get('serv'))
+
+    return add_mod.delete_map(map_name, group, server_id)
+
+
+@bp.post('lets')
+def lets():
+    server_ip = common.checkAjaxInput(request.form.get('serv'))
+    lets_domain = common.checkAjaxInput(request.form.get('lets_domain'))
+    lets_email = common.checkAjaxInput(request.form.get('lets_email'))
+
+    return add_mod.get_le_cert(server_ip, lets_domain, lets_email)
+
+
+@bp.post('/nginx/upstream')
+def add_nginx_upstream():
+    roxywi_auth.page_for_admin(level=3)
+
+    server_ip = common.is_ip_or_dns(request.form.get('serv'))
+    new_upstream = request.form.get('upstream')
+    balance = request.form.get("balance")
+    config_add = ''
+    servers_split = ''
+    generate = request.form.get('generateconfig')
+
+    if balance == 'round_robin':
+        balance = ''
+    else:
+        balance = f'    {balance};\n'
+
+    if new_upstream != '':
+        config_add = f'upstream {new_upstream} {{\n'
+        config_add += balance
+        config_name = f'upstream_{new_upstream}'
+
+    if request.form.get('keepalive') != '':
+        config_add += f'    keepalive {request.form.get("keepalive")};\n'
+
+    if request.form.get('servers') is not None:
+        servers = request.form.getlist('servers')
+        server_port = request.form.getlist('server_port')
+        max_fails = request.form.getlist('max_fails')
+        fail_timeout = request.form.getlist('fail_timeout')
+        i = 0
+        for server in servers:
+            if server == '':
+                continue
+            try:
+                max_fails_val = f'max_fails={max_fails[i]}'
+            except Exception:
+                max_fails_val = 'max_fails=1'
+
+            try:
+                fail_timeout_val = f'fail_timeout={fail_timeout[i]}'
+            except Exception:
+                fail_timeout_val = 'fail_timeout=1'
+
+            servers_split += f"    server {server}:{server_port[i]} {max_fails_val} {fail_timeout_val}s; \n"
+            i += 1
+    config_add += f'{servers_split} }}\n'
+
+    if generate:
+        return config_add
+    else:
+        try:
+            return add_mod.save_nginx_config(config_add, server_ip, config_name)
+        except Exception as e:
+            return str(e)
+
+
+@bp.route('/show/ip/<server_ip>')
+def show_ip(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    commands = ['sudo hostname -I | tr " " "\\n"|sed "/^$/d"']
+
+    return server_mod.ssh_command(server_ip, commands, ip="1")
diff --git a/app/routes/admin/__init__.py b/app/routes/admin/__init__.py
new file mode 100644
index 00000000..5f16778e
--- /dev/null
+++ b/app/routes/admin/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('admin', __name__)
+
+from app.routes.admin import routes
diff --git a/app/routes/admin/routes.py b/app/routes/admin/routes.py
new file mode 100644
index 00000000..83fa0bb9
--- /dev/null
+++ b/app/routes/admin/routes.py
@@ -0,0 +1,220 @@
+import os
+import sys
+
+import pytz
+import distro
+from flask import render_template, request, redirect, url_for
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.admin import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxywi.roxy as roxy
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.server.server as server_mod
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('')
+def admin():
+    roxywi_auth.page_for_admin()
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    users = sql.select_users()
+    settings = sql.get_setting('', all=1)
+    ldap_enable = sql.get_setting('ldap_enable')
+    services = sql.select_services()
+    gits = sql.select_gits()
+    masters = sql.select_servers(get_master_servers=1)
+    is_needed_tool = common.is_tool('ansible')
+    grafana = 0
+    backups = sql.select_backups()
+    s3_backups = sql.select_s3_backups()
+    user_subscription = roxywi_common.return_user_subscription()
+
+    if not roxy.is_docker():
+        grafana, stderr = server_mod.subprocess_execute("systemctl is-active grafana-server")
+        grafana = grafana[0]
+
+    return render_template(
+        'admin.html', h2=1, role=user_params['role'], user=user, users=users, groups=sql.select_groups(),
+        servers=sql.select_servers(full=1), masters=masters, sshs=sql.select_ssh(), roles=sql.select_roles(),
+        settings=settings, backups=backups, s3_backups=s3_backups, services=services, timezones=pytz.all_timezones,
+        page="users.py", user_services=user_params['user_services'], ldap_enable=ldap_enable, gits=gits, guide_me=1,
+        user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
+        token=user_params['token'], is_needed_tool=is_needed_tool, lang=user_params['lang'], grafana=grafana
+    )
+
+
+@bp.route('/tools')
+def show_tools():
+    roxywi_auth.page_for_admin()
+    lang = roxywi_common.get_user_lang_for_flask()
+    try:
+        services = roxy.get_services_status()
+    except Exception as e:
+        return str(e)
+
+    return render_template('ajax/load_services.html', services=services, lang=lang)
+
+
+@bp.route('/tools/update/<service>')
+def update_tools(service):
+    roxywi_auth.page_for_admin()
+
+    try:
+        return roxy.update_roxy_wi(service)
+    except Exception as e:
+        return f'error: {e}'
+
+
+@bp.route('/tools/action/<service>/<action>')
+def action_tools(service, action):
+    roxywi_auth.page_for_admin()
+    if action not in ('start', 'stop', 'restart'):
+        return 'error: wrong action'
+
+    return roxy.action_service(action, service)
+
+
+@bp.route('/update')
+def update_roxywi():
+    roxywi_auth.page_for_admin()
+    versions = roxy.versions()
+    checker_ver = roxy.check_new_version('checker')
+    smon_ver = roxy.check_new_version('smon')
+    metrics_ver = roxy.check_new_version('metrics')
+    keep_ver = roxy.check_new_version('keep_alive')
+    portscanner_ver = roxy.check_new_version('portscanner')
+    socket_ver = roxy.check_new_version('socket')
+    prometheus_exp_ver = roxy.check_new_version('prometheus-exporter')
+    services = roxy.get_services_status()
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    return render_template(
+        'ajax/load_updateroxywi.html', services=services, versions=versions, checker_ver=checker_ver, smon_ver=smon_ver,
+        metrics_ver=metrics_ver, portscanner_ver=portscanner_ver, socket_ver=socket_ver, prometheus_exp_ver=prometheus_exp_ver,
+        keep_ver=keep_ver, lang=lang
+    )
+
+
+@bp.route('/openvpn')
+def load_openvpn():
+    roxywi_auth.page_for_admin()
+    openvpn_configs = ''
+    openvpn_sess = ''
+    openvpn = ''
+
+    if distro.id() == 'ubuntu':
+        stdout, stderr = server_mod.subprocess_execute("apt show openvpn3 2>&1|grep E:")
+    elif distro.id() == 'centos' or distro.id() == 'rhel':
+        stdout, stderr = server_mod.subprocess_execute("rpm --query openvpn3-client")
+
+    if (
+            (stdout[0] != 'package openvpn3-client is not installed' and stderr != '/bin/sh: rpm: command not found')
+            and stdout[0] != 'E: No packages found'
+    ):
+        cmd = "sudo openvpn3 configs-list |grep -E 'ovpn|(^|[^0-9])[0-9]{4}($|[^0-9])' |grep -v net|awk -F\"    \" '{print $1}'|awk 'ORS=NR%2?\" \":\"\\n\"'"
+        openvpn_configs, stderr = server_mod.subprocess_execute(cmd)
+        cmd = "sudo openvpn3 sessions-list|grep -E 'Config|Status'|awk -F\":\" '{print $2}'|awk 'ORS=NR%2?\" \":\"\\n\"'| sed 's/^ //g'"
+        openvpn_sess, stderr = server_mod.subprocess_execute(cmd)
+        openvpn = stdout[0]
+
+    return render_template('ajax/load_openvpn.html', openvpn=openvpn, openvpn_sess=openvpn_sess, openvpn_configs=openvpn_configs)
+
+
+@bp.post('/openvpn/upload')
+def upload_openvpn():
+    name = common.checkAjaxInput(request.form.get('ovpnname'))
+
+    ovpn_file = f"{os.path.dirname('/tmp/')}/{name}.ovpn"
+
+    try:
+        with open(ovpn_file, "w") as conf:
+            conf.write(request.form.get('uploadovpn'))
+    except IOError as e:
+        error = f'error: Cannot save ovpn file {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+
+    try:
+        cmd = 'sudo openvpn3 config-import --config %s --persistent' % ovpn_file
+        server_mod.subprocess_execute(cmd)
+    except IOError as e:
+        error = f'error: Cannot import OpenVPN file: {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+
+    try:
+        cmd = 'sudo cp %s /etc/openvpn3/%s.conf' % (ovpn_file, name)
+        server_mod.subprocess_execute(cmd)
+    except IOError as e:
+        error = f'error: Cannot save OpenVPN file: {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+
+    roxywi_common.logging("Roxy-WI server", f" has been uploaded a new ovpn file {ovpn_file}", roxywi=1, login=1)
+
+    return 'success: ovpn file has been saved </div>'
+
+
+@bp.post('/openvpn/delete')
+def delete_openvpn():
+    openvpndel = common.checkAjaxInput(request.form.get('openvpndel'))
+
+    cmd = f'sudo openvpn3 config-remove --config /tmp/{openvpndel}.ovpn --force'
+    try:
+        server_mod.subprocess_execute(cmd)
+        roxywi_common.logging(openvpndel, ' has deleted the ovpn file ', roxywi=1, login=1)
+    except IOError as e:
+        error = f'error: Cannot delete OpenVPN file: {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+    else:
+        return 'ok'
+
+
+@bp.route('/openvpn/action/<action>/<openvpn>')
+def action_openvpn(action, openvpn):
+    openvpn = common.checkAjaxInput(openvpn)
+
+    if action == 'start':
+        cmd = f'sudo openvpn3 session-start --config /tmp/{openvpn}.ovpn'
+    elif action == 'restart':
+        cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --restart'
+    elif action == 'disconnect':
+        cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --disconnect'
+    else:
+        return 'error: wrong action'
+    try:
+        server_mod.subprocess_execute(cmd)
+        roxywi_common.logging(openvpn, f' The ovpn session has been {action}ed ', roxywi=1, login=1)
+        return f"success: The {openvpn} has been {action}ed"
+    except IOError as e:
+        roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
+        return f'error: Cannot {action} OpenVPN: {e}'
+
+
+@app.route('/setting/<param>/<val>', methods=['POST'])
+def update_settings(param, val):
+    user_group = roxywi_common.get_user_group(id=1)
+    if sql.update_setting(param, val, user_group):
+        roxywi_common.logging('Roxy-WI server', f'The {param} setting has been changed to: {val}', roxywi=1, login=1)
+
+        return 'Ok'
diff --git a/app/routes/checker/__init__.py b/app/routes/checker/__init__.py
new file mode 100644
index 00000000..77c44c25
--- /dev/null
+++ b/app/routes/checker/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('checker', __name__)
+
+from app.routes.checker import routes
diff --git a/app/routes/checker/routes.py b/app/routes/checker/routes.py
new file mode 100644
index 00000000..9f724e88
--- /dev/null
+++ b/app/routes/checker/routes.py
@@ -0,0 +1,130 @@
+import os
+import sys
+
+from flask import render_template, request, redirect, url_for
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.checker import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxywi.common as roxywi_common
+import modules.tools.alerting as alerting
+import modules.tools.checker as checker_mod
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/settings')
+def checker_settings():
+    roxywi_common.check_user_group_for_flask()
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    return render_template(
+        'checker.html', h2=1, role=user_params['role'], user=user, lang=user_params['lang'],
+        token=user_params['token'], user_services=user_params['user_services']
+    )
+
+
+@bp.post('/settings/update')
+def update_settings():
+    service = request.form.get('service')
+    setting_id = int(request.form.get('setting_id'))
+    email = int(request.form.get('email'))
+    service_alert = int(request.form.get('server'))
+    backend_alert = int(request.form.get('backend'))
+    maxconn_alert = int(request.form.get('maxconn'))
+    telegram_id = int(request.form.get('telegram_id'))
+    slack_id = int(request.form.get('slack_id'))
+    pd_id = int(request.form.get('pd_id'))
+
+    if service == 'haproxy':
+        return checker_mod.update_haproxy_settings(
+            setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id
+        )
+    elif service in ('nginx', 'apache'):
+        return checker_mod.update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id)
+    else:
+        return checker_mod.update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id)
+
+
+@bp.route('/settings/load')
+def load_checker():
+    return checker_mod.load_checker()
+
+
+@bp.route('/history')
+def checker_history():
+    roxywi_common.check_user_group_for_flask()
+
+    user_group = roxywi_common.get_user_group(id=1)
+    smon_status, stderr = smon_mod.return_smon_status()
+    smon = sql.alerts_history('Checker', user_group)
+    user_subscription = roxywi_common.return_user_subscription()
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    return render_template(
+        'smon/checker_history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon,
+        lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
+        token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services']
+    )
+
+
+@bp.route('/check/<channel_id>/<receiver_name>')
+def check_receiver(channel_id, receiver_name):
+    channel_id = common.checkAjaxInput(channel_id)
+    receiver_name = common.checkAjaxInput(receiver_name)
+
+    return alerting.check_receiver(channel_id, receiver_name)
+
+
+@bp.route('/check/rabbit')
+def check_rabbit():
+    return alerting.check_rabbit_alert()
+
+
+@bp.route('/check/email')
+def check_email():
+    return alerting.check_email_alert()
+
+
+@bp.route('/receiver/<receiver_name>', methods=['PUT', 'POST', 'DELETE'])
+def receiver(receiver_name):
+    if request.method == 'POST':
+        token = common.checkAjaxInput(request.form.get('receiver'))
+        channel = common.checkAjaxInput(request.form.get('channel'))
+        group = common.checkAjaxInput(request.form.get('group'))
+        page = common.checkAjaxInput(request.form.get('page'))
+        page = page.split("#")[0]
+    
+        return alerting.add_receiver_channel(receiver_name, token, channel, group, page)
+    elif request.method == 'PUT':
+        token = common.checkAjaxInput(request.form.get('receiver_token'))
+        channel = common.checkAjaxInput(request.form.get('channel'))
+        group = common.checkAjaxInput(request.form.get('group'))
+        user_id = common.checkAjaxInput(request.form.get('id'))
+
+        return alerting.update_receiver_channel(receiver_name, token, channel, group, user_id)
+    elif request.method == 'DELETE':
+        channel_id = common.checkAjaxInput(request.form.get('channel_id'))
+
+        return alerting.delete_receiver_channel(channel_id, receiver_name)
+
diff --git a/app/routes/config/__init__.py b/app/routes/config/__init__.py
new file mode 100644
index 00000000..3c67338b
--- /dev/null
+++ b/app/routes/config/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('config', __name__)
+
+from app.routes.config import routes
diff --git a/app/routes/config/routes.py b/app/routes/config/routes.py
new file mode 100644
index 00000000..cca05ec2
--- /dev/null
+++ b/app/routes/config/routes.py
@@ -0,0 +1,461 @@
+import os
+import sys
+
+from flask import render_template, request, redirect, url_for, abort
+from flask_login import login_required
+
+from app import app, login_manager, cache
+from app.routes.config import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxy_wi_tools as roxy_wi_tools
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.config.config as config_mod
+import modules.config.section as section_mod
+import modules.service.haproxy as service_haproxy
+import modules.server.server as server_mod
+
+get_config = roxy_wi_tools.GetConfigVar()
+time_zone = sql.get_setting('time_zone')
+get_date = roxy_wi_tools.GetDate(time_zone)
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/<service>/show', methods=['POST'])
+def show_config(service):
+    config_file_name = request.form.get('config_file_name')
+    configver = request.form.get('configver')
+    server_ip = request.form.get('serv')
+
+    return  config_mod.show_config(server_ip, service, config_file_name, configver)
+
+
+@bp.route('/<service>/show-files', methods=['POST'])
+def show_config_files(service):
+    server_ip = request.form.get('serv')
+    config_file_name = request.form.get('config_file_name')
+
+    return config_mod.show_config_files(server_ip, service, config_file_name)
+
+
+@bp.route('/<service>/find-in-config', methods=['POST'])
+def find_in_config(service):
+    server_ip = common.is_ip_or_dns(request.form.get('serv'))
+    finding_words = request.form.get('words')
+    log_path = sql.get_setting(service + '_dir')
+    log_path = common.return_nice_path(log_path)
+    commands = [f'sudo grep "{finding_words}" {log_path}*/*.conf -C 2 -Rn']
+    try:
+        return_find = server_mod.ssh_command(server_ip, commands, raw=1)
+        return_find = config_mod.show_finding_in_config(return_find, grep=finding_words)
+    except Exception as e:
+        return str(e)
+
+    if 'error: ' in return_find:
+        return return_find
+
+    return return_find
+
+
+@bp.route('/<service>/', defaults={'serv': None, 'edit': None, 'config_file_name': None, 'new': None}, methods=['GET', 'POST'])
+@bp.route('/<service>/<serv>/<edit>/', defaults={'config_file_name': None, 'new': None}, methods=['GET', 'POST'])
+@bp.route('/<service>/<serv>/show', defaults={'edit': None, 'config_file_name': None, 'new': None}, methods=['GET', 'POST'])
+@bp.route('/<service>/<serv>/show/<config_file_name>', defaults={'edit': None, 'new': None}, methods=['GET', 'POST'])
+@bp.route('/<service>/<serv>/show-files', defaults={'edit': None, 'config_file_name': None, 'new': None}, methods=['GET', 'POST'])
+@bp.route('/<service>/<serv>/<edit>/<config_file_name>', defaults={'new': None}, methods=['GET', 'POST'])
+@bp.route('/<service>/<serv>/<edit>/<config_file_name>/<new>', methods=['GET', 'POST'])
+def config(service, serv, edit, config_file_name, new):
+    config_read = ""
+    cfg = ""
+    stderr = ""
+    error = ""
+    aftersave = ""
+    is_restart = ''
+    is_serv_protected = ''
+    new_config = new
+
+    try:
+        user_params = roxywi_common.get_users_params(service=service)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
+        service_desc = sql.select_service(service)
+        is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
+
+        if is_redirect != 'ok':
+            return redirect(url_for(f'{is_redirect}'))
+    else:
+        return redirect(url_for('index'))
+
+    if serv and config_file_name:
+        cfg = config_mod.return_cfg(service, serv, config_file_name)
+
+    if serv and edit and new_config is None:
+        roxywi_common.check_is_server_in_group(serv)
+        is_serv_protected = sql.is_serv_protected(serv)
+        server_id = sql.select_server_id_by_ip(serv)
+        is_restart = sql.select_service_setting(server_id, service, 'restart')
+
+        try:
+            error = config_mod.get_config(serv, cfg, service=service, config_file_name=config_file_name)
+        except Exception as e:
+            return str(e), 200
+
+        try:
+            roxywi_common.logging(serv, f" {service.title()} config has been opened")
+        except Exception:
+            pass
+
+        try:
+            conf = open(cfg, "r")
+            config_read = conf.read()
+            conf.close()
+        except IOError as e:
+            return f'Cannot read imported config file {e}', 200
+
+        os.system("/bin/mv %s %s.old" % (cfg, cfg))
+
+    if new_config is not None:
+        config_read = ' '
+
+    return render_template(
+        'config.html', h2=1, role=user_params['role'], user=user, select_id="serv", serv=serv, aftersave=aftersave,
+        config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service,
+        is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name,
+        is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
+    )
+
+
+@bp.route('/<service>/<server_ip>/save', methods=['POST'])
+def save_config(service, server_ip):
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    roxywi_common.check_is_server_in_group(server_ip)
+    service_desc = sql.select_service(service)
+    is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'],
+                                          service=service_desc.service_id)
+
+    if is_redirect != 'ok':
+        return redirect(url_for(f'{is_redirect}'))
+
+    config = request.form.get('config')
+    oldcfg = request.form.get('oldconfig')
+    save = request.form.get('save')
+    config_file_name = request.form.get('config_file_name')
+
+    try:
+        cfg = config_mod.return_cfg(service, server_ip, config_file_name)
+    except Exception as e:
+        return f'error: {e}', 200
+
+    try:
+        with open(cfg, "a") as conf:
+            conf.write(config)
+    except IOError as e:
+        return f"error: Cannot read imported config file: {e}", 200
+
+    try:
+        if service == 'keepalived':
+            stderr = config_mod.upload_and_restart(server_ip, cfg, save, service, oldcfg=oldcfg)
+        else:
+            stderr = config_mod.master_slave_upload_and_restart(server_ip, cfg, save, service, oldcfg=oldcfg,
+                                                                config_file_name=config_file_name)
+    except Exception as e:
+        return f'error: {e}', 200
+
+    if save != 'test':
+        config_mod.diff_config(oldcfg, cfg)
+
+    if stderr:
+        return stderr, 200
+
+    return
+
+
+@bp.route('/versions/<service>', defaults={'server_ip': None}, methods=['GET', 'POST'])
+@bp.route('/versions/<service>/<server_ip>', methods=['GET', 'POST'])
+def versions(service, server_ip):
+    roxywi_auth.page_for_admin(level=3)
+    aftersave = ''
+    file = set()
+    stderr = ''
+
+    try:
+        user_params = roxywi_common.get_users_params(disable=1)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    if service not in ('haproxy', 'nginx', 'keepalived', 'apache'):
+        return redirect(url_for('index'))
+
+    if service in ('haproxy', 'keepalived'):
+        conf_format = 'cfg'
+    else:
+        conf_format = 'conf'
+
+    if request.form.get('del'):
+        aftersave = 1
+        for get in request.form.getlist('do_delete'):
+            if conf_format in get and server_ip in get:
+                try:
+                    if sql.delete_config_version(service, get):
+                        try:
+                            os.remove(get)
+                        except OSError as e:
+                            if 'No such file or directory' in str(e):
+                                pass
+                    else:
+                        os.remove(os.path.join(configs_dir, get))
+                    try:
+                        file.add(get + "\n")
+                        roxywi_common.logging(
+                            server_ip, f"Version of config has been deleted: {get}", login=1, keep_history=1,
+                            service=service
+                        )
+                    except Exception:
+                        pass
+                except OSError as e:
+                    stderr = "Error: %s - %s." % (e.filename, e.strerror)
+
+    return render_template(
+        'delver.html', h2=1, role=user_params['role'], user=user, select_id="serv", serv=server_ip, aftersave=aftersave,
+        selects=user_params['servers'], file=file, service=service, user_services=user_params['user_services'],
+        token=user_params['token'], lang=user_params['lang'], stderr=stderr
+    )
+
+
+@bp.route('/version/<service>/list', methods=['POST'])
+def list_of_version(service):
+    server_ip = common.is_ip_or_dns(request.form.get('serv'))
+    configver = common.checkAjaxInput(request.form.get('configver'))
+    for_delver = common.checkAjaxInput(request.form.get('for_delver'))
+
+    return config_mod.list_of_versions(server_ip, service, configver, for_delver)
+
+
+@bp.route('/versions/<service>/<server_ip>/<configver>', defaults={'save': None}, methods=['GET', 'POST'])
+@bp.route('/versions/<service>/<server_ip>/<configver>/save', defaults={'save': 1}, methods=['GET', 'POST'])
+def show_version(service, server_ip, configver, save):
+    roxywi_auth.page_for_admin(level=3)
+
+    try:
+        user_params = roxywi_common.get_users_params(disable=1)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    if service not in ('haproxy', 'nginx', 'keepalived', 'apache'):
+        return redirect(url_for('index'))
+
+    service_desc = sql.select_service(service)
+
+    if not roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
+        return redirect(url_for('index'))
+
+    configs_dir = get_config.get_config_var('configs', f'{service_desc.service}_save_configs_dir')
+    configver = configs_dir + configver
+    servers = roxywi_common.get_dick_permit(service=service_desc.slug)
+    aftersave = 0
+    stderr = ''
+
+    if save:
+        aftersave = 1
+        save_action = request.form.get('save')
+        try:
+            roxywi_common.logging(
+                server_ip, f"Version of config has been uploaded {configver}", login=1, keep_history=1, service=service
+            )
+        except Exception:
+            pass
+
+        if service == 'keepalived':
+            stderr = config_mod.upload_and_restart(serv, configver, save_action, service)
+        elif service in ('nginx', 'apache'):
+            config_file_name = sql.select_remote_path_from_version(server_ip=server_ip, service=service,
+                                                                   local_path=configver)
+            stderr = config_mod.master_slave_upload_and_restart(server_ip, configver, save_action, service_desc.slug,
+                                                                config_file_name=config_file_name)
+        else:
+            stderr = config_mod.master_slave_upload_and_restart(server_ip, configver, save_action, service)
+
+    return render_template(
+        'configver.html',
+        h2=1, role=user_params['role'], user=user, select_id="serv", serv=server_ip, aftersave=aftersave,
+        selects=servers, stderr=stderr, save=save, configver=configver, service=service,
+        user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
+    )
+
+
+@bp.route('/section/haproxy/<server_ip>')
+def haproxy_section(server_ip):
+    try:
+        user_params = roxywi_common.get_users_params(service=1)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
+
+    if is_redirect != 'ok':
+        return redirect(url_for(f'{is_redirect}'))
+
+    is_restart = 0
+    hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
+    cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
+    error = config_mod.get_config(server_ip, cfg)
+    sections = section_mod.get_sections(cfg)
+
+    return render_template(
+        'sections.html', h2=1, role=user_params['role'], user=user, serv=server_ip, selects=user_params['servers'],
+        sections=sections, error=error, token=user_params['token'], lang=user_params['lang'], is_restart=is_restart, config='',
+        user_services=user_params['user_services']
+    )
+
+
+@bp.route('/section/haproxy/<server_ip>/<section>')
+def haproxy_section_show(server_ip, section):
+    try:
+        user_params = roxywi_common.get_users_params(service=1)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
+
+    if is_redirect != 'ok':
+        return redirect(url_for(f'{is_redirect}'))
+
+    try:
+        roxywi_common.logging(server_ip, f"A section {section} has been opened")
+    except Exception:
+        pass
+
+    hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
+    cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
+    error = config_mod.get_config(server_ip, cfg)
+    sections = section_mod.get_sections(cfg)
+    start_line, end_line, config_read = section_mod.get_section_from_config(cfg, section)
+    server_id = sql.select_server_id_by_ip(server_ip)
+    is_restart = sql.select_service_setting(server_id, 'haproxy', 'restart')
+
+    os.system(f"/bin/mv {cfg} {cfg}.old")
+
+    return render_template(
+        'sections.html', h2=1, role=user_params['role'], user=user,
+        serv=server_ip, selects=user_params['servers'], error=error, sections=sections, cfg=cfg,
+        token=user_params['token'], lang=user_params['lang'], is_restart=is_restart, config=config_read,
+        start_line=start_line, end_line=end_line, section=section, user_services=user_params['user_services']
+    )
+
+
+@bp.route('/section/haproxy/<server_ip>/save', methods=['POST'])
+def haproxy_section_save(server_ip):
+    try:
+        user_params = roxywi_common.get_users_params(service=1)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
+
+    if is_redirect != 'ok':
+        return redirect(url_for(f'{is_redirect}'))
+
+    hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
+    cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
+    config = request.form.get('config')
+    oldcfg = request.form.get('oldconfig')
+    save = request.form.get('save')
+    start_line = request.form.get('start_line')
+    end_line = request.form.get('end_line')
+
+    if save == 'delete':
+        config = ''
+        save = 'reload'
+
+    config = section_mod.rewrite_section(start_line, end_line, oldcfg, config)
+
+    try:
+        with open(cfg, "w") as conf:
+            conf.write(config)
+    except IOError as e:
+        return f"error: Cannot read import config file: {e}"
+
+    stderr = config_mod.master_slave_upload_and_restart(server_ip, cfg, save, 'haproxy', oldcfg=oldcfg)
+
+    config_mod.diff_config(oldcfg, cfg)
+
+    os.system(f"/bin/rm -f {hap_configs_dir}*.old")
+
+    return stderr
+
+
+@bp.route('/compare/<service>/<serv>')
+@bp.route('/map/<service>/<serv>')
+def show_compare_config(service, serv):
+    config_read = ""
+    cfg = ""
+    stderr = ""
+    error = ""
+    aftersave = ""
+    is_restart = ''
+    is_serv_protected = ''
+    config_file_name = ''
+
+    try:
+        user_params = roxywi_common.get_users_params(service=service)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
+        service_desc = sql.select_service(service)
+        is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
+
+        if is_redirect != 'ok':
+            return redirect(url_for(f'{is_redirect}'))
+    else:
+        return redirect(url_for('index'))
+
+    return render_template(
+        'config.html', h2=1, role=user_params['role'], user=user, select_id="serv", serv=serv, aftersave=aftersave,
+        config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service,
+        is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name,
+        is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'],
+        service_desc=service_desc
+    )
+
+
+@bp.route('/compare/<service>/<server_ip>/files')
+def show_configs_for_compare(service, server_ip):
+    return config_mod.show_compare_config(server_ip, service)
+
+
+@bp.route('/compare/<service>/<server_ip>/show', methods=['POST'])
+def show_compare(service, server_ip):
+    left = common.checkAjaxInput(request.form.get('left'))
+    right = common.checkAjaxInput(request.form.get('right'))
+
+    return config_mod.compare_config(service, left, right)
+
+
+@bp.route('/map/haproxy/<server_ip>/show')
+def show_map(server_ip):
+    return service_haproxy.show_map(server_ip)
diff --git a/app/routes/install/__init__.py b/app/routes/install/__init__.py
new file mode 100644
index 00000000..cc5356b8
--- /dev/null
+++ b/app/routes/install/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('install', __name__)
+
+from app.routes.install import routes
diff --git a/app/routes/install/routes.py b/app/routes/install/routes.py
new file mode 100644
index 00000000..f3e17881
--- /dev/null
+++ b/app/routes/install/routes.py
@@ -0,0 +1,268 @@
+import os
+import sys
+
+from functools import wraps
+from flask import render_template, request, redirect, url_for
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.install import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.roxy_wi_tools as roxy_wi_tools
+import modules.server.server as server_mod
+import modules.service.common as service_common
+import modules.service.installation as service_mod
+import modules.service.exporter_installation as exp_installation
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('')
+def install_monitoring():
+    roxywi_auth.page_for_admin(level=2)
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    is_needed_tool = common.is_tool('ansible')
+    geoip_country_codes = sql.select_geoip_country_codes()
+
+    return render_template(
+        'install.html', h2=1, role=user_params['role'], user=user, servers=user_params['servers'],
+        user_services=user_params['user_services'], lang=user_params['lang'], geoip_country_codes=geoip_country_codes,
+        is_needed_tool=is_needed_tool, token=user_params['token']
+    )
+
+
+@bp.route('/ha')
+def ha():
+    roxywi_auth.page_for_admin(level=2)
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    is_needed_tool = common.is_tool('ansible')
+    user_subscription = roxywi_common.return_user_subscription()
+    is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=3)
+
+    if is_redirect != 'ok':
+        return redirect(url_for(f'{is_redirect}'))
+
+    return render_template(
+        'ha.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'],
+        user_services=user_params['user_services'], user_status=user_subscription['user_status'], lang=user_params['lang'],
+        user_plan=user_subscription['user_plan'], is_needed_tool=is_needed_tool, token=user_params['token']
+    )
+
+
+@bp.post('/keepalived', defaults={'slave_kp': None})
+@bp.post('/keepalived/<slave_kp>')
+def install_keepalived(slave_kp):
+    master = request.form.get('master')
+    slave = request.form.get('slave')
+    eth = request.form.get('interface')
+    eth_slave = request.form.get('slave_interface')
+    vrrp_ip = request.form.get('vrrpip')
+    syn_flood = request.form.get('syn_flood')
+    return_to_master = request.form.get('return_to_master')
+    haproxy = request.form.get('hap')
+    nginx = request.form.get('nginx')
+    router_id = request.form.get('router_id')
+    virt_server = request.form.get('virt_server')
+
+    try:
+        virt_server = int(virt_server)
+    except Exception:
+        pass
+
+    if not slave_kp:
+        try:
+            return service_mod.keepalived_master_install(
+                master, eth, eth_slave, vrrp_ip, virt_server, syn_flood, return_to_master, haproxy, nginx, router_id
+            )
+        except Exception as e:
+            return f'{e}'
+    else:
+        try:
+            return service_mod.keepalived_slave_install(
+                master, slave, eth, eth_slave, vrrp_ip, syn_flood, haproxy, nginx, router_id
+            )
+        except Exception as e:
+            return f'{e}'
+
+
+@bp.post('/keepalived/add', defaults={'slave_kp': None})
+@bp.post('/keepalived/add/<slave_kp>')
+def add_extra_vrrp(slave_kp):
+    master = request.form.get('master')
+    slave = request.form.get('slave')
+    eth = request.form.get('interface')
+    slave_eth = request.form.get('slave_interface')
+    vrrp_ip = request.form.get('vrrpip')
+    router_id = request.form.get('router_id')
+    return_to_master = request.form.get('return_to_master')
+    kp = request.form.get('kp')
+
+    if not slave_kp:
+        try:
+            return service_mod.keepalived_masteradd(master, eth, slave_eth, vrrp_ip, router_id, return_to_master, kp)
+        except Exception as e:
+            return f'{e}'
+    else:
+        try:
+            return service_mod.keepalived_slaveadd(slave, eth, slave_eth, vrrp_ip, router_id, kp)
+        except Exception as e:
+            return f'{e}'
+
+
+@bp.post('/<service>/<server_ip>')
+def install_service(service, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    docker = common.checkAjaxInput(request.form.get('docker'))
+    syn_flood = request.form.get('syn_flood')
+    hapver = request.form.get('hapver')
+    
+    if service in ('nginx', 'apache'):
+        try:
+            return service_mod.install_service(server_ip, service, docker, syn_flood)
+        except Exception as e:
+            return str(e)
+    elif service == 'haproxy':
+        try:
+            return service_mod.install_haproxy(server_ip, syn_flood=syn_flood, hapver=hapver, docker=docker)
+        except Exception as e:
+            return str(e)
+    else:
+        return 'warning: Wrong service'
+
+
+@bp.post('/<service>/master-slave')
+def master_slave(service):
+    master = request.form.get('master')
+    slave = request.form.get('slave')
+    server = request.form.get('server')
+    docker = request.form.get('docker')
+
+    if service == 'haproxy':
+        if server == 'master':
+            try:
+                return service_mod.install_haproxy(master, server=server, docker=docker, m_or_s='master', master=master, slave=slave)
+            except Exception as e:
+                return f'{e}'
+        elif server == 'slave':
+            try:
+                return service_mod.install_haproxy(slave, server=server, docker=docker, m_or_s='slave', master=master, slave=slave)
+            except Exception as e:
+                return f'{e}'
+    elif service == 'nginx':
+        syn_flood_protect = '1' if request.form.get('syn_flood') == "1" else ''
+        if server == 'master':
+            try:
+                return service_mod.install_service(master, 'nginx', docker, syn_flood_protect, server=server)
+            except Exception as e:
+                return f'{e}'
+        elif server == 'slave':
+            try:
+                return service_mod.install_service(slave, 'nginx', docker, syn_flood_protect, server=server)
+            except Exception as e:
+                return f'{e}'
+
+
+@bp.route('/<service>/version/<server_ip>')
+def get_service_version(service, server_ip):
+    if service in ('haproxy', 'nginx', 'apache'):
+        return service_common.show_service_version(server_ip, service)
+    elif service == 'keepalived':
+        cmd = ["sudo /usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}'"]
+        return server_mod.ssh_command(server_ip, cmd)
+    else:
+        return 'error: Wrong service'
+
+
+@bp.post('/exporter/<exporter>')
+def install_exporter(exporter):
+    server_ip = common.is_ip_or_dns(request.form.get('server_ip'))
+    ver = common.checkAjaxInput(request.form.get('exporter_v'))
+    ext_prom = common.checkAjaxInput(request.form.get('ext_prom'))
+
+    if exporter == 'haproxy':
+        return exp_installation.haproxy_exp_installation(server_ip, ver, ext_prom)
+    elif exporter in ('nginx', 'apache'):
+        return exp_installation.nginx_apache_exp_installation(server_ip, exporter, ver, ext_prom)
+    elif exporter in ('keepalived', 'node'):
+        return exp_installation.node_keepalived_exp_installation(exporter, server_ip, ver, ext_prom)
+    else:
+        return 'error: Wrong exporter'
+
+
+@bp.route('/exporter/<exporter>/version/<server_ip>')
+def get_exporter_version(exporter, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    return service_common.get_exp_version(server_ip, exporter)
+
+
+@bp.route('/grafana')
+def install_grafana():
+    try:
+        return service_mod.grafana_install()
+    except Exception as e:
+        return f'{e}'
+
+
+@bp.route('/waf/<service>/<server_ip>')
+def install_waf(service, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    if service == 'haproxy':
+        try:
+            return service_mod.waf_install(server_ip)
+        except Exception as e:
+            return str(e)
+    elif service == 'nginx':
+        try:
+            return service_mod.waf_nginx_install(server_ip)
+        except Exception as e:
+            return str(e)
+    else:
+        return 'error: Wrong service'
+
+
+@bp.post('/geoip')
+def install_geoip():
+    server_ip = common.is_ip_or_dns(server_ip)
+    geoip_update = common.checkAjaxInput(request.form.get('update'))
+    service = request.form.get('service')
+
+    try:
+        return service_mod.geoip_installation(server_ip, geoip_update, service)
+    except Exception as e:
+        return str(e)
+
+
+@bp.route('/geoip/<service>/<server_ip>')
+def check_geoip(service, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    if service not in ('haproxy', 'nginx'):
+        return 'error: Wrong service'
+
+    service_dir = common.return_nice_path(sql.get_setting(f'{service}_dir'))
+    cmd = [f"ls {service_dir}geoip/"]
+    return server_mod.ssh_command(server_ip, cmd)
diff --git a/app/routes/metric/__init__.py b/app/routes/metric/__init__.py
new file mode 100644
index 00000000..b98c89b0
--- /dev/null
+++ b/app/routes/metric/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('metric', __name__)
+
+from app.routes.metric import routes
diff --git a/app/routes/metric/routes.py b/app/routes/metric/routes.py
new file mode 100644
index 00000000..a02c7c79
--- /dev/null
+++ b/app/routes/metric/routes.py
@@ -0,0 +1,128 @@
+import os
+import sys
+
+import distro
+from flask import render_template, request, jsonify, redirect, url_for
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.metric import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.server.server as server_mod
+import modules.roxywi.metrics as metric
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/<service>')
+def metrics(service):
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    service_desc = sql.select_service(service)
+    roxywi_common.check_user_group_for_flask()
+
+    is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
+
+    if is_redirect != 'ok':
+        return redirect(url_for(f'{is_redirect}'))
+
+    try:
+        if distro.id() == 'ubuntu':
+            cmd = "apt list --installed 2>&1 |grep roxy-wi-metrics"
+        else:
+            cmd = "rpm -q roxy-wi-metrics-* |awk -F\"metrics\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
+        service_ver, stderr = server_mod.subprocess_execute(cmd)
+        services = '0'
+
+        if not stderr:
+            if service_ver[0] == ' is not installed' or service_ver == '':
+                servers = ''
+            else:
+                services = '1'
+                if service == 'nginx':
+                    user_params['servers'] = sql.select_nginx_servers_metrics_for_master()
+                elif service == 'apache':
+                    user_params['servers'] = sql.select_apache_servers_metrics_for_master()
+                else:
+                    group_id = roxywi_common.get_user_group(id=1)
+                    user_params['servers'] = sql.select_servers_metrics(group_id)
+    except Exception as e:
+        return f'error: on Metrics page: {e}', 500
+
+    user_subscription = roxywi_common.return_user_subscription()
+
+    return render_template(
+        'metrics.html', h2=1, autorefresh=1, role=user_params['role'], user=user, servers=user_params['servers'],
+        services=services, user_services=user_params['user_services'], service=service,
+        user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
+        token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
+    )
+
+
+@bp.route('/cpu', methods=['POST'])
+def metrics_cpu():
+    metrics_type = common.checkAjaxInput(request.form.get('ip'))
+
+    return jsonify(metric.show_cpu_metrics(metrics_type))
+
+
+@bp.route('/ram', methods=['POST'])
+def metrics_ram():
+    metrics_type = common.checkAjaxInput(request.form.get('ip'))
+
+    return jsonify(metric.show_ram_metrics(metrics_type))
+
+
+@bp.route('/<service>/table-metrics')
+def table_metrics(service):
+    roxywi_common.check_user_group_for_flask()
+    lang = roxywi_common.get_user_lang()
+    group_id = roxywi_common.get_user_group(id=1)
+
+    if service in ('nginx', 'apache'):
+        metrics = sql.select_service_table_metrics(service, group_id)
+    else:
+        metrics = sql.select_table_metrics(group_id)
+
+    return render_template('ajax/table_metrics.html', table_stat=metrics, service=service, lang=lang)
+
+
+@bp.route('/<service>/<server_ip>', methods=['POST'])
+def show_metric(service, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    hostname = sql.get_hostname_by_server_ip(server_ip)
+    time_range = common.checkAjaxInput(request.form.get('time_range'))
+
+    if service in ('nginx', 'apache', 'waf'):
+        return jsonify(metric.service_metrics(server_ip, hostname, service, time_range))
+    elif service == 'haproxy':
+        return jsonify(metric.haproxy_metrics(server_ip, hostname, time_range))
+
+    return 'error: Wrong service'
+
+
+@bp.route('/<service>/<server_ip>/http', methods=['POST'])
+def show_http_metric(service, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    hostname = sql.get_hostname_by_server_ip(server_ip)
+    time_range = common.checkAjaxInput(request.form.get('time_range'))
+
+    if service == 'haproxy':
+        return jsonify(metric.haproxy_http_metrics(server_ip, hostname, time_range))
+
+    return 'error: Wrong service'
diff --git a/app/routes/runtime/__init__.py b/app/routes/runtime/__init__.py
new file mode 100644
index 00000000..979427c0
--- /dev/null
+++ b/app/routes/runtime/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('runtime', __name__)
+
+from app.routes.runtime import routes
diff --git a/app/routes/runtime/routes.py b/app/routes/runtime/routes.py
new file mode 100644
index 00000000..9dae244e
--- /dev/null
+++ b/app/routes/runtime/routes.py
@@ -0,0 +1,203 @@
+import os
+import sys
+
+from flask import render_template, request, redirect, url_for
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.runtime import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxywi.common as roxywi_common
+import modules.config.runtime as runtime
+import modules.service.haproxy as service_haproxy
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/')
+def runtimeapi():
+    try:
+        user_params = roxywi_common.get_users_params(haproxy=1)
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+    servbackend = ""
+
+    return render_template(
+        'runtimeapi.html', h2=1, title="RunTime API", role=user_params['role'], user=user, select_id="serv",
+        selects=user_params['servers'], token=user_params['token'], user_services=user_params['user_services'],
+        servbackend=servbackend, lang=user_params['lang']
+    )
+
+
+@bp.route('/backends/<server_ip>')
+def show_backends(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return runtime.show_backends(server_ip)
+
+
+@bp.route('/backend/servers/<server_ip>/<backend>')
+def show_backend_servers(server_ip, backend):
+    server_ip = common.is_ip_or_dns(server_ip)
+    backend = common.checkAjaxInput(backend)
+
+    return runtime.show_frontend_backend(server_ip, backend)
+
+
+@bp.route('/backend/server/<server_ip>/<backend>/<backend_server>')
+def show_backend_server(server_ip, backend, backend_server):
+    server_ip = common.is_ip_or_dns(server_ip)
+    backend = common.checkAjaxInput(backend)
+    backend_server = common.checkAjaxInput(backend_server)
+
+    return runtime.show_server(server_ip, backend, backend_server)
+
+
+@bp.route('/change/ip', methods=['POST'])
+def change_ip_port():
+    server_ip = common.is_ip_or_dns(request.form.get('serv'))
+    backend_backend = common.checkAjaxInput(request.form.get('backend_backend'))
+    backend_server = common.checkAjaxInput(request.form.get('backend_server'))
+    backend_ip = common.checkAjaxInput(request.form.get('backend_ip'))
+    backend_port = common.checkAjaxInput(request.form.get('backend_port'))
+
+    return runtime.change_ip_and_port(server_ip, backend_backend, backend_server, backend_ip, backend_port)
+
+
+@bp.route('/maxconn/<server_ip>')
+def maxconn_select(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return runtime.get_backends_from_config(server_ip, backends='frontend')
+
+
+@bp.route('/maxconn/<type_maxconn>/<server_ip>', methods=['POST'])
+def change_maxconn(type_maxconn, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    maxconn = common.checkAjaxInput(request.form.get('maxconn'))
+
+    if type_maxconn == 'global':
+
+        return runtime.change_maxconn_global(server_ip, maxconn)
+    elif type_maxconn == 'frontend':
+        frontend = common.checkAjaxInput(request.form.get('maxconn_frontend'))
+
+        return runtime.change_maxconn_frontend(server_ip, maxconn, frontend)
+    elif type_maxconn == 'backend':
+        backend = common.checkAjaxInput(request.form.get('maxconn_backend'))
+        backend_server = common.checkAjaxInput(request.form.get('maxconn_backend_server'))
+
+        return runtime.change_maxconn_backend(server_ip, backend, backend_server, maxconn)
+    else:
+        return 'error: Wrong backend'
+
+
+@bp.route('/action/<server_ip>', methods=['POST'])
+def action(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    enable = common.checkAjaxInput(request.form.get('servaction'))
+    backend = common.checkAjaxInput(request.form.get('servbackend'))
+    save = request.form.get('save')
+    
+    return service_haproxy.runtime_command(server_ip, enable, backend, save)
+
+
+@bp.route('/tables/<server_ip>')
+def get_all_tables(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return runtime.get_all_stick_table(server_ip)
+
+
+@bp.route('/table/<server_ip>/<table>')
+def get_table(server_ip, table):
+    server_ip = common.is_ip_or_dns(server_ip)
+    table = common.checkAjaxInput(table)
+
+    return runtime.table_select(server_ip, table)
+
+
+@bp.route('/table/delete/<server_ip>/<table>/<ip_for_delete>')
+def delete_ip(server_ip, table, ip_for_delete):
+    server_ip = common.is_ip_or_dns(server_ip)
+    table = common.checkAjaxInput(table)
+    ip_for_delete = common.is_ip_or_dns(ip_for_delete)
+
+    return runtime.delete_ip_from_stick_table(server_ip, ip_for_delete, table)
+
+
+@bp.route('/table/clear/<server_ip>/<table>')
+def clear_table(server_ip, table):
+    server_ip = common.is_ip_or_dns(server_ip)
+    table = common.checkAjaxInput(table)
+
+    return runtime.clear_stick_table(server_ip, table)
+
+
+@bp.route('/session/<server_ip>')
+def select_sessions(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return runtime.select_session(server_ip)
+
+
+@bp.route('/session/<server_ip>/<sess_id>')
+def show_sessions(server_ip, sess_id):
+    server_ip = common.is_ip_or_dns(server_ip)
+    sess_id = common.checkAjaxInput(sess_id)
+
+    return runtime.show_session(server_ip, sess_id)
+
+
+@bp.route('/session/delete/<server_ip>/<sess_id>')
+def delete_session(server_ip, sess_id):
+    server_ip = common.is_ip_or_dns(server_ip)
+    sess_id = common.checkAjaxInput(sess_id)
+
+    return runtime.delete_session(server_ip, sess_id)
+
+
+@bp.route('/list/<server_ip>')
+def get_lists(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    
+    return runtime.list_of_lists(server_ip)
+
+
+@bp.route('/list/<server_ip>/<int:list_id>/<list_name>')
+def get_list(server_ip, list_id, list_name):
+    server_ip = common.is_ip_or_dns(server_ip)
+    list_name = common.checkAjaxInput(list_name)
+    
+    return runtime.show_lists(server_ip, list_id, list_name)
+
+
+@bp.route('/list/delete', methods=['POST'])
+def delete_ip_from_list():
+    ip_id = common.checkAjaxInput(request.form.get('list_ip_id_for_delete'))
+    ip = common.is_ip_or_dns(request.form.get('list_ip_for_delete'))
+    list_id = common.checkAjaxInput(request.form.get('list_id_for_delete'))
+    list_name = common.checkAjaxInput(request.form.get('list_name'))
+
+    return runtime.delete_ip_from_list(serv, ip_id, ip, list_id, list_name)
+
+
+@bp.route('/list/add', methods=['POST'])
+def add_ip_to_list():
+    ip = request.form.get('list_ip_for_add')
+    ip = ip.strip()
+    ip = common.is_ip_or_dns(ip)
+    list_id = common.checkAjaxInput(request.form.get('list_id_for_add'))
+    list_name = common.checkAjaxInput(request.form.get('list_name'))
+
+    return runtime.add_ip_to_list(serv, ip, list_id, list_name)
\ No newline at end of file
diff --git a/app/routes/server/__init__.py b/app/routes/server/__init__.py
new file mode 100644
index 00000000..ae27ba97
--- /dev/null
+++ b/app/routes/server/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('server', __name__)
+
+from app.routes.server import routes
diff --git a/app/routes/server/routes.py b/app/routes/server/routes.py
new file mode 100644
index 00000000..2ba2785c
--- /dev/null
+++ b/app/routes/server/routes.py
@@ -0,0 +1,462 @@
+import os
+import sys
+import json
+
+import distro
+from flask import render_template, request
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.server import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxywi.roxy as roxy
+import modules.roxywi.group as group_mod
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.roxy_wi_tools as roxy_wi_tools
+import modules.server.ssh as ssh_mod
+import modules.server.server as server_mod
+import modules.tools.smon as smon_mod
+import modules.service.backup as backup_mod
+
+get_config = roxy_wi_tools.GetConfigVar()
+time_zone = sql.get_setting('time_zone')
+get_date = roxy_wi_tools.GetDate(time_zone)
+error_mess = roxywi_common.return_error_message()
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/check/ssh/<server_ip>')
+def check_ssh(server_ip):
+    roxywi_auth.page_for_admin(level=2)
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    try:
+        return server_mod.ssh_command(server_ip, ["ls -1t"])
+    except Exception as e:
+        return str(e)
+
+
+@bp.route('/check/server/<server_ip>')
+def check_server(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return server_mod.server_is_up(server_ip)
+
+
+@bp.route('/show/if/<server_ip>')
+def show_if(server_ip):
+    roxywi_auth.page_for_admin(level=2)
+    server_ip = common.is_ip_or_dns(server_ip)
+    commands = ["sudo ip link|grep 'UP' |grep -v 'lo'| awk '{print $2}' |awk -F':' '{print $1}'"]
+
+    return server_mod.ssh_command(server_ip, commands)
+
+
+@bp.route('/create', methods=['POST'])
+def create_server():
+    roxywi_auth.page_for_admin(level=2)
+    hostname = common.checkAjaxInput(request.form.get('servername'))
+    ip = common.is_ip_or_dns(request.form.get('newip'))
+    group = common.checkAjaxInput(request.form.get('newservergroup'))
+    typeip = common.checkAjaxInput(request.form.get('typeip'))
+    haproxy = common.checkAjaxInput(request.form.get('haproxy'))
+    nginx = common.checkAjaxInput(request.form.get('nginx'))
+    apache = common.checkAjaxInput(request.form.get('apache'))
+    firewall = common.checkAjaxInput(request.form.get('firewall'))
+    enable = common.checkAjaxInput(request.form.get('enable'))
+    master = common.checkAjaxInput(request.form.get('slave'))
+    cred = common.checkAjaxInput(request.form.get('cred'))
+    page = common.checkAjaxInput(request.form.get('page'))
+    page = page.split("#")[0]
+    port = common.checkAjaxInput(request.form.get('newport'))
+    desc = common.checkAjaxInput(request.form.get('desc'))
+    add_to_smon = common.checkAjaxInput(request.form.get('add_to_smon'))
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    if ip == '':
+        return 'error: IP or DNS name is not valid'
+    try:
+        if server_mod.create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, haproxy, nginx,
+                                    apache, firewall):
+            try:
+                user_subscription = roxywi_common.return_user_status()
+            except Exception as e:
+                user_subscription = roxywi_common.return_unsubscribed_user_status()
+                roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
+
+            if add_to_smon:
+                user_group = roxywi_common.get_user_group(id=1)
+                smon_mod.create_smon(hostname, ip, 0, 1, 0, 0, hostname, desc, 0, 0, 0, 56, 'ping', 0, 0, user_group, 0)
+
+            roxywi_common.logging(ip, f'A new server {hostname} has been created', roxywi=1, login=1, keep_history=1, service='server')
+
+            return render_template(
+                'ajax/new_server.html', groups=sql.select_groups(), servers=sql.select_servers(server=ip), lang=lang,
+                masters=sql.select_servers(get_master_servers=1), sshs=sql.select_ssh(group=group), page=page,
+                user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], adding=1
+            )
+    except Exception as e:
+        return f'error: {e}'
+
+
+
+@bp.route('/create/after', methods=['POST'])
+def after_add():
+    hostname = common.checkAjaxInput(request.form.get('servername'))
+    ip = common.is_ip_or_dns(request.form.get('newip'))
+    scan_server = common.checkAjaxInput(request.form.get('scan_server'))
+
+    try:
+        return server_mod.update_server_after_creating(hostname, ip, scan_server)
+    except Exception as e:
+        return str(e)
+
+
+@bp.route('/update', methods=['POST'])
+def update_server():
+    roxywi_auth.page_for_admin(level=2)
+    name = request.form.get('updateserver')
+    group = request.form.get('servergroup')
+    typeip = request.form.get('typeip')
+    firewall = request.form.get('firewall')
+    enable = request.form.get('enable')
+    master = request.form.get('slave')
+    serv_id = request.form.get('id')
+    cred = request.form.get('cred')
+    port = request.form.get('port')
+    protected = request.form.get('protected')
+    desc = request.form.get('desc')
+
+    if name is None or port is None:
+        return error_mess
+    else:
+        sql.update_server(name, group, typeip, enable, master, serv_id, cred, port, desc, firewall, protected)
+        roxywi_common.logging(f'The server {name}', ' has been updated ', roxywi=1, login=1)
+        server_ip = sql.select_server_ip_by_id(serv_id)
+        roxywi_common.logging(server_ip, f'The server {name} has been update', roxywi=1, login=1, keep_history=1, service='server')
+
+        return 'ok'
+
+
+@bp.route('/delete/<int:server_id>')
+def delete_server(server_id):
+    roxywi_auth.page_for_admin(level=2)
+    return server_mod.delete_server(server_id)
+
+
+@bp.route('/group/create', methods=['POST'])
+def create_group():
+    roxywi_auth.page_for_admin()
+    newgroup = common.checkAjaxInput(request.form.get('groupname'))
+    desc = common.checkAjaxInput(request.form.get('newdesc'))
+    if newgroup == '':
+        return error_mess
+    else:
+        try:
+            if sql.add_group(newgroup, desc):
+                roxywi_common.logging('Roxy-WI server', f'A new group {newgroup} has been created', roxywi=1, login=1)
+                return render_template('ajax/new_group.html', groups=sql.select_groups(group=newgroup))
+        except Exception as e:
+            return str(e)
+
+
+@bp.route('/group/update', methods=['POST'])
+def update_group():
+    roxywi_auth.page_for_admin()
+    name = common.checkAjaxInput(request.form.get('updategroup'))
+    desc = common.checkAjaxInput(request.form.get('descript'))
+    group_id = common.checkAjaxInput(request.form.get('id'))
+
+    return group_mod.update_group(group_id, name, desc)
+
+
+@bp.route('/group/delete/<int:group_id>')
+def delete_group(group_id):
+    roxywi_auth.page_for_admin()
+    return group_mod.delete_group(group_id)
+
+
+@bp.route('/ssh/create', methods=['POST'])
+def create_ssh():
+    roxywi_auth.page_for_admin(level=2)
+    return ssh_mod.create_ssh_cred()
+
+
+@bp.route('/ssh/delete/<int:ssh_id>')
+def delete_ssh(ssh_id):
+    roxywi_auth.page_for_admin(level=2)
+    return ssh_mod.delete_ssh_key(ssh_id)
+
+
+@bp.route('/ssh/update', methods=['POST'])
+def update_ssh():
+    roxywi_auth.page_for_admin(level=2)
+    return ssh_mod.update_ssh_key()
+
+
+@bp.route('/ssh/upload', methods=['POST'])
+def upload_ssh_key():
+    user_group = roxywi_common.get_user_group()
+    name = common.checkAjaxInput(request.form.get('name'))
+    key = request.form.get('ssh_cert')
+
+    try:
+        return ssh_mod.upload_ssh_key(name, user_group, key)
+    except Exception as e:
+        return str(e)
+
+
+@bp.app_template_filter('string_to_dict')
+def string_to_dict(dict_string) -> dict:
+    from ast import literal_eval
+    return literal_eval(dict_string)
+
+
+@bp.route('/system_info/get/<server_ip>/<int:server_id>')
+def get_system_info(server_ip, server_id):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return server_mod.show_system_info(server_ip, server_id)
+
+
+@bp.route('/system_info/update/<server_ip>/<int:server_id>')
+def update_system_info(server_ip, server_id):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return server_mod.update_system_info(server_ip, server_id)
+
+
+@bp.route('/tools')
+def show_tools():
+    roxywi_auth.page_for_admin()
+    lang = roxywi_common.get_user_lang_for_flask()
+    try:
+        services = roxy.get_services_status()
+    except Exception as e:
+        return str(e)
+
+    return render_template('ajax/load_services.html', services=services, lang=lang)
+
+
+@bp.route('/tools/update/<service>')
+def update_tools(service):
+    roxywi_auth.page_for_admin()
+
+    try:
+        return roxy.update_roxy_wi(service)
+    except Exception as e:
+        return f'error: {e}'
+
+
+@bp.route('/tools/action/<service>/<action>')
+def action_tools(service, action):
+    roxywi_auth.page_for_admin()
+    if action not in ('start', 'stop', 'restart'):
+        return 'error: wrong action'
+
+    return roxy.action_service(action, service)
+
+
+@bp.route('/update')
+def update_roxywi():
+    roxywi_auth.page_for_admin()
+    versions = roxy.versions()
+    checker_ver = roxy.check_new_version('checker')
+    smon_ver = roxy.check_new_version('smon')
+    metrics_ver = roxy.check_new_version('metrics')
+    keep_ver = roxy.check_new_version('keep_alive')
+    portscanner_ver = roxy.check_new_version('portscanner')
+    socket_ver = roxy.check_new_version('socket')
+    prometheus_exp_ver = roxy.check_new_version('prometheus-exporter')
+    services = roxy.get_services_status()
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    return render_template(
+        'ajax/load_updateroxywi.html', services=services, versions=versions, checker_ver=checker_ver, smon_ver=smon_ver,
+        metrics_ver=metrics_ver, portscanner_ver=portscanner_ver, socket_ver=socket_ver, prometheus_exp_ver=prometheus_exp_ver,
+        keep_ver=keep_ver, lang=lang
+    )
+
+
+@bp.route('/openvpn')
+def load_openvpn():
+    roxywi_auth.page_for_admin()
+    openvpn_configs = ''
+    openvpn_sess = ''
+    openvpn = ''
+
+    if distro.id() == 'ubuntu':
+        stdout, stderr = server_mod.subprocess_execute("apt show openvpn3 2>&1|grep E:")
+    elif distro.id() == 'centos' or distro.id() == 'rhel':
+        stdout, stderr = server_mod.subprocess_execute("rpm --query openvpn3-client")
+
+    if (
+            (stdout[0] != 'package openvpn3-client is not installed' and stderr != '/bin/sh: rpm: command not found')
+            and stdout[0] != 'E: No packages found'
+    ):
+        cmd = "sudo openvpn3 configs-list |grep -E 'ovpn|(^|[^0-9])[0-9]{4}($|[^0-9])' |grep -v net|awk -F\"    \" '{print $1}'|awk 'ORS=NR%2?\" \":\"\\n\"'"
+        openvpn_configs, stderr = server_mod.subprocess_execute(cmd)
+        cmd = "sudo openvpn3 sessions-list|grep -E 'Config|Status'|awk -F\":\" '{print $2}'|awk 'ORS=NR%2?\" \":\"\\n\"'| sed 's/^ //g'"
+        openvpn_sess, stderr = server_mod.subprocess_execute(cmd)
+        openvpn = stdout[0]
+
+    return render_template('ajax/load_openvpn.html', openvpn=openvpn, openvpn_sess=openvpn_sess, openvpn_configs=openvpn_configs)
+
+
+@bp.post('/openvpn/upload')
+def upload_openvpn():
+    name = common.checkAjaxInput(request.form.get('ovpnname'))
+
+    ovpn_file = f"{os.path.dirname('/tmp/')}/{name}.ovpn"
+
+    try:
+        with open(ovpn_file, "w") as conf:
+            conf.write(request.form.get('uploadovpn'))
+    except IOError as e:
+        error = f'error: Cannot save ovpn file {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+
+    try:
+        cmd = 'sudo openvpn3 config-import --config %s --persistent' % ovpn_file
+        server_mod.subprocess_execute(cmd)
+    except IOError as e:
+        error = f'error: Cannot import OpenVPN file: {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+
+    try:
+        cmd = 'sudo cp %s /etc/openvpn3/%s.conf' % (ovpn_file, name)
+        server_mod.subprocess_execute(cmd)
+    except IOError as e:
+        error = f'error: Cannot save OpenVPN file: {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+
+    roxywi_common.logging("Roxy-WI server", f" has been uploaded a new ovpn file {ovpn_file}", roxywi=1, login=1)
+
+    return 'success: ovpn file has been saved </div>'
+
+
+@bp.post('/openvpn/delete')
+def delete_openvpn():
+    openvpndel = common.checkAjaxInput(request.form.get('openvpndel'))
+
+    cmd = f'sudo openvpn3 config-remove --config /tmp/{openvpndel}.ovpn --force'
+    try:
+        server_mod.subprocess_execute(cmd)
+        roxywi_common.logging(openvpndel, ' has deleted the ovpn file ', roxywi=1, login=1)
+    except IOError as e:
+        error = f'error: Cannot delete OpenVPN file: {e}'
+        roxywi_common.logging('Roxy-WI server', error, roxywi=1)
+        return error
+    else:
+        return 'ok'
+
+
+@bp.route('/openvpn/action/<action>/<openvpn>')
+def action_openvpn(action, openvpn):
+    openvpn = common.checkAjaxInput(openvpn)
+
+    if action == 'start':
+        cmd = f'sudo openvpn3 session-start --config /tmp/{openvpn}.ovpn'
+    elif action == 'restart':
+        cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --restart'
+    elif action == 'disconnect':
+        cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --disconnect'
+    else:
+        return 'error: wrong action'
+    try:
+        server_mod.subprocess_execute(cmd)
+        roxywi_common.logging(openvpn, f' The ovpn session has been {action}ed ', roxywi=1, login=1)
+        return f"success: The {openvpn} has been {action}ed"
+    except IOError as e:
+        roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1)
+        return f'error: Cannot {action} OpenVPN: {e}'
+
+
+@bp.route('/services/<int:server_id>', methods=['GET', 'POST'])
+def show_server_services(server_id):
+    roxywi_auth.page_for_admin(level=2)
+
+    if request.method == 'GET':
+        return server_mod.show_server_services(server_id)
+    else:
+        server_name = common.checkAjaxInput(request.form.get('changeServerServicesServer'))
+        server_services = json.loads(request.form.get('jsonDatas'))
+
+        return server_mod.change_server_services(server_id, server_name, server_services)
+
+
+@bp.route('/firewall/<server_ip>')
+def show_firewall(server_ip):
+    roxywi_auth.page_for_admin(level=2)
+
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return server_mod.show_firewalld_rules(server_ip)
+
+
+@bp.post('/backup/create')
+@bp.post('/backup/delete')
+@bp.post('/backup/update')
+def create_backup():
+    server = common.is_ip_or_dns(request.form.get('server'))
+    rpath = common.checkAjaxInput(request.form.get('rpath'))
+    time = common.checkAjaxInput(request.form.get('time'))
+    backup_type = common.checkAjaxInput(request.form.get('type'))
+    rserver = common.checkAjaxInput(request.form.get('rserver'))
+    cred = int(request.form.get('cred'))
+    deljob = common.checkAjaxInput(request.form.get('deljob'))
+    update = common.checkAjaxInput(request.form.get('backupupdate'))
+    description = common.checkAjaxInput(request.form.get('description'))
+
+    try:
+        return backup_mod.backup(server, rpath, time, backup_type, rserver, cred, deljob, update, description)
+    except Exception as e:
+        return str(e)
+
+
+@bp.post('/s3backup/create')
+@bp.post('/s3backup/delete')
+def create_s3_backup():
+    server = common.is_ip_or_dns(request.form.get('s3_backup_server'))
+    s3_server = common.checkAjaxInput(request.form.get('s3_server'))
+    bucket = common.checkAjaxInput(request.form.get('s3_bucket'))
+    secret_key = common.checkAjaxInput(request.form.get('s3_secret_key'))
+    access_key = common.checkAjaxInput(request.form.get('s3_access_key'))
+    time = common.checkAjaxInput(request.form.get('time'))
+    deljob = common.checkAjaxInput(request.form.get('dels3job'))
+    description = common.checkAjaxInput(request.form.get('description'))
+
+    try:
+        return backup_mod.s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description)
+    except Exception as e:
+        return str(e)
+    
+
+@bp.post('/git/create')
+@bp.post('/git/delete')
+def create_git_backup():
+    server_id = request.form.get('server')
+    service_id = request.form.get('git_service')
+    git_init = request.form.get('git_init')
+    repo = request.form.get('git_repo')
+    branch = request.form.get('git_branch')
+    period = request.form.get('time')
+    cred = request.form.get('cred')
+    deljob = request.form.get('git_deljob')
+    description = request.form.get('description')
+
+    return backup_mod.git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description)
diff --git a/app/routes/service/__init__.py b/app/routes/service/__init__.py
new file mode 100644
index 00000000..cb97bd9c
--- /dev/null
+++ b/app/routes/service/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('service', __name__)
+
+from app.routes.service import routes
diff --git a/app/routes/service/routes.py b/app/routes/service/routes.py
new file mode 100644
index 00000000..40296bff
--- /dev/null
+++ b/app/routes/service/routes.py
@@ -0,0 +1,386 @@
+import os
+import sys
+from functools import wraps
+
+import distro
+from flask import render_template, request, redirect, url_for, abort
+from flask_login import login_required
+
+from app import app, login_manager, cache
+from app.routes.service import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.server.server as server_mod
+import modules.service.action as service_action
+import modules.service.common as service_common
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.roxywi.overview as roxy_overview
+
+
+def check_services(fn):
+    @wraps(fn)
+    def decorated_view(*args, **kwargs):
+        service = kwargs['service']
+        if service not in ('haproxy', 'nginx', 'apache', 'keepalived'):
+            abort(400, 'bad service')
+        return fn(*args, **kwargs)
+    return decorated_view
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/<service>', defaults={'serv': None})
+@bp.route('/<service>/<serv>')
+@check_services
+def services(service, serv):
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    services = []
+    servers: object
+    autorefresh = 0
+    waf_server = ''
+    cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l"
+    keep_alive, stderr = server_mod.subprocess_execute(cmd)
+
+    service_desc = sql.select_service(service)
+    is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
+
+    if is_redirect != 'ok':
+        return redirect(url_for(f'{is_redirect}'))
+
+    if serv:
+        if roxywi_common.check_is_server_in_group(serv):
+            servers = sql.select_servers(server=serv)
+            autorefresh = 1
+            waf_server = sql.select_waf_servers(serv)
+            server_id = sql.select_server_id_by_ip(serv)
+            docker_settings = sql.select_docker_service_settings(server_id, service_desc.slug)
+            restart_settings = sql.select_restart_service_settings(server_id, service_desc.slug)
+        else:
+            raise Exception('error: wrong group')
+    else:
+        servers = roxywi_common.get_dick_permit(virt=1, service=service_desc.slug)
+        docker_settings = sql.select_docker_services_settings(service_desc.slug)
+        restart_settings = sql.select_restart_services_settings(service_desc.slug)
+
+    services_name = {'roxy-wi-checker': 'Master backends checker service',
+                     'roxy-wi-keep_alive': 'Auto start service',
+                     'roxy-wi-metrics': 'Master metrics service'}
+    for s, v in services_name.items():
+        if distro.id() == 'ubuntu':
+            if s == 'roxy-wi-keep_alive':
+                s = 'roxy-wi-keep-alive'
+            cmd = "apt list --installed 2>&1 |grep " + s
+        else:
+            cmd = "rpm --query " + s + "-* |awk -F\"" + s + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
+        service_ver, stderr = server_mod.subprocess_execute(cmd)
+        try:
+            services.append([s, service_ver[0]])
+        except Exception:
+            services.append([s, ''])
+
+    haproxy_sock_port = sql.get_setting('haproxy_sock_port')
+    servers_with_status1 = []
+    out1 = ''
+    if len(servers) == 1:
+        serv = servers[0][2]
+    for s in servers:
+        servers_with_status = list()
+        servers_with_status.append(s[0])
+        servers_with_status.append(s[1])
+        servers_with_status.append(s[2])
+        servers_with_status.append(s[11])
+        if service == 'nginx':
+            h = (['', ''],)
+            cmd = [
+                "/usr/sbin/nginx -v 2>&1|awk '{print $3}' && systemctl status nginx |grep -e 'Active' |awk "
+                "'{print $2, $9$10$11$12$13}' && ps ax |grep nginx:|grep -v grep |wc -l"]
+            for service_set in docker_settings:
+                if service_set.server_id == s[0] and service_set.setting == 'dockerized' and service_set.value == '1':
+                    container_name = sql.get_setting('nginx_container_name')
+                    cmd = [
+                        "docker exec -it " + container_name + " /usr/sbin/nginx -v 2>&1|awk '{print $3}' && "
+                                                              "docker ps -a -f name=" + container_name + " --format '{{.Status}}'|tail -1 && ps ax |grep nginx:"
+                                                                                                         "|grep -v grep |wc -l"
+                    ]
+            try:
+                out = server_mod.ssh_command(s[2], cmd)
+                h = ()
+                out1 = []
+                for k in out.split():
+                    out1.append(k)
+                h = (out1,)
+                servers_with_status.append(h)
+                servers_with_status.append(h)
+                servers_with_status.append(s[17])
+            except Exception:
+                servers_with_status.append(h)
+                servers_with_status.append(h)
+                servers_with_status.append(s[17])
+        elif service == 'keepalived':
+            h = (['', ''],)
+            cmd = [
+                "/usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}' && systemctl status keepalived |"
+                "grep -e 'Active' |awk '{print $2, $9$10$11$12$13}' && ps ax |grep keepalived|grep -v grep |wc -l"
+            ]
+            try:
+                out = server_mod.ssh_command(s[2], cmd)
+                out1 = []
+                for k in out.split():
+                    out1.append(k)
+                h = (out1,)
+                servers_with_status.append(h)
+                servers_with_status.append(h)
+                servers_with_status.append(s[22])
+            except Exception:
+                servers_with_status.append(h)
+                servers_with_status.append(h)
+                servers_with_status.append(s[22])
+        elif service == 'apache':
+            h = (['', ''],)
+            apache_stats_user = sql.get_setting('apache_stats_user')
+            apache_stats_password = sql.get_setting('apache_stats_password')
+            apache_stats_port = sql.get_setting('apache_stats_port')
+            apache_stats_page = sql.get_setting('apache_stats_page')
+            cmd = "curl -s -u %s:%s http://%s:%s/%s?auto |grep 'ServerVersion\|Processes\|ServerUptime:'" % (
+                apache_stats_user, apache_stats_password, s[2], apache_stats_port, apache_stats_page
+            )
+            try:
+                out = server_mod.subprocess_execute(cmd)
+                if out != '':
+                    for k in out:
+                        servers_with_status.append(k)
+                    servers_with_status.append(s[22])
+            except Exception:
+                servers_with_status.append(h)
+                servers_with_status.append(h)
+                servers_with_status.append(s[22])
+        else:
+            cmd = 'echo "show info" |nc %s %s -w 1 -v|grep -e "Ver\|Uptime:\|Process_num"' % (s[2], haproxy_sock_port)
+            out = server_mod.subprocess_execute(cmd)
+
+            for k in out:
+                if "Connection refused" not in k:
+                    out1 = out
+                else:
+                    out1 = False
+                servers_with_status.append(out1)
+
+            servers_with_status.append(s[12])
+
+        servers_with_status.append(sql.is_master(s[2]))
+        servers_with_status.append(sql.select_servers(server=s[2]))
+
+        is_keepalived = sql.select_keepalived(s[2])
+
+        if is_keepalived:
+            try:
+                cmd = ['sudo kill -USR1 `cat /var/run/keepalived.pid` && sudo grep State /tmp/keepalived.data -m 1 |'
+                       'awk -F"=" \'{print $2}\'|tr -d \'[:space:]\' && sudo rm -f /tmp/keepalived.data']
+                out = server_mod.ssh_command(s[2], cmd)
+                out1 = ('1', out)
+                servers_with_status.append(out1)
+            except Exception as e:
+                servers_with_status.append(str(e))
+        else:
+            servers_with_status.append('')
+
+        servers_with_status1.append(servers_with_status)
+
+    user_subscription = roxywi_common.return_user_subscription()
+
+    return render_template(
+        'hapservers.html', h2=1, autorefresh=autorefresh, role=user_params['role'], user=user, servers=servers_with_status1,
+        keep_alive=''.join(keep_alive), serv=serv, service=service, services=services, user_services=user_params['user_services'],
+        docker_settings=docker_settings, user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
+        waf_server=waf_server, restart_settings=restart_settings, service_desc=service_desc, token=user_params['token'],
+        lang=user_params['lang']
+    )
+
+
+@bp.route('/action/check-service', methods=['POST'])
+def check_service():
+    user_uuid = request.cookies.get('uuid')
+    server_ip = common.checkAjaxInput(request.form.get('server_ip'))
+    service = common.checkAjaxInput(request.form.get('service'))
+
+    return service_action.check_service(server_ip, user_uuid, service)
+
+
+@bp.route('/action/<service>/<server_ip>/<action>', methods=['GET'])
+@check_services
+def action_service(service, server_ip, action):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return service_action.common_action(server_ip, action, service)
+
+
+@bp.route('/<service>/<server_ip>/last-edit')
+def last_edit(service, server_ip):
+    return service_common.get_overview_last_edit(server_ip, service)
+
+
+@bp.route('/cpu-ram-metrics/<server_ip>/<server_id>/<name>/<service>')
+def cpu_ram_metrics(server_ip, server_id, name, service):
+    user_params = roxywi_common.get_users_params()
+
+    if service == 'haproxy':
+        cmd = 'echo "show info" |nc %s %s -w 1|grep -e "node\|Nbproc\|Maxco\|MB\|Nbthread"' % (server_ip, sql.get_setting('haproxy_sock_port'))
+        out = server_mod.subprocess_execute(cmd)
+        return_out = ""
+
+        for k in out:
+            if "Ncat:" not in k:
+                for r in k:
+                    return_out += r
+                    return_out += "\n"
+            else:
+                return_out = "Cannot connect to HAProxy"
+    else:
+        return_out = ''
+
+    server_status = (name, server_ip, return_out)
+
+    servers = []
+    user_id = request.cookies.get('uuid')
+    group_id = int(request.cookies.get('group'))
+    role = sql.get_user_role_by_uuid(user_id, group_id)
+
+    servers.append(server_status)
+    servers_sorted = sorted(servers, key=common.get_key)
+
+    return render_template('ajax/overviewServers.html', service_status=servers_sorted, role=role, id=server_id, service_page=service,
+                                   lang=user_params['lang'])
+
+
+@bp.route('/haproxy/bytes', methods=['POST'])
+def show_haproxy_bytes():
+    server_ip = common.is_ip_or_dns(request.form.get('showBytes'))
+
+    return roxy_overview.show_haproxy_binout(server_ip)
+
+
+@bp.route('/nginx/connections', methods=['POST'])
+def show_nginx_connections():
+    server_ip = common.is_ip_or_dns(request.form.get('nginxConnections'))
+
+    return roxy_overview.show_nginx_connections(server_ip)
+
+
+@bp.route('/apache/bytes', methods=['POST'])
+def show_apache_bytes():
+    server_ip = common.is_ip_or_dns(request.form.get('apachekBytes'))
+
+    return roxy_overview.show_apache_bytes(server_ip)
+
+
+@bp.route('/keepalived/become-master', methods=['POST'])
+@cache.cached()
+def show_keepalived_become_master():
+    server_ip = common.is_ip_or_dns(request.form.get('keepalivedBecameMaster'))
+
+    return roxy_overview.keepalived_became_master(server_ip)
+
+
+@bp.route('/<service>/backends/<server_ip>')
+@cache.cached()
+def show_service_backends(service, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return service_common.overview_backends(server_ip, service)
+
+
+@bp.route('/position/<int:server_id>/<int:pos>')
+def change_pos(server_id, pos):
+    return sql.update_server_pos(pos, server_id)
+
+
+@bp.route('/haproxy/version/<server_ip>')
+def get_haproxy_v(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return service_common.check_haproxy_version(server_ip)
+
+
+@bp.route('/settings/<service>/<int:server_id>')
+@check_services
+def show_service_settings(service, server_id):
+    settings = sql.select_service_settings(server_id, service)
+    return render_template('ajax/service_settings.html', settings=settings, service=service)
+
+
+@bp.post('/settings/<service>')
+@check_services
+def save_service_settings(service):
+    server_id = common.checkAjaxInput(request.form.get('serverSettingsSave'))
+    haproxy_enterprise = common.checkAjaxInput(request.form.get('serverSettingsEnterprise'))
+    service_dockerized = common.checkAjaxInput(request.form.get('serverSettingsDockerized'))
+    service_restart = common.checkAjaxInput(request.form.get('serverSettingsRestart'))
+    server_ip = sql.select_server_ip_by_id(server_id)
+    service_docker = f'Service {service.title()} has been flagged as a dockerized'
+    service_systemd = f'Service {service.title()} has been flagged as a system service'
+    disable_restart = f'Restart option is disabled for {service.title()} service'
+    enable_restart = f'Restart option is disabled for {service.title()} service'
+
+    if service == 'haproxy':
+        if sql.insert_or_update_service_setting(server_id, service, 'haproxy_enterprise', haproxy_enterprise):
+            if haproxy_enterprise == '1':
+                roxywi_common.logging(server_ip, 'Service has been flagged as an Enterprise version', roxywi=1, login=1,
+                                      keep_history=1, service=service)
+            else:
+                roxywi_common.logging(server_ip, 'Service has been flagged as a community version', roxywi=1, login=1,
+                                      keep_history=1, service=service)
+
+    if sql.insert_or_update_service_setting(server_id, service, 'dockerized', service_dockerized):
+        if service_dockerized == '1':
+            roxywi_common.logging(server_ip, service_docker, roxywi=1, login=1, keep_history=1, service=service)
+        else:
+            roxywi_common.logging(server_ip, service_systemd, roxywi=1, login=1, keep_history=1, service=service)
+
+    if sql.insert_or_update_service_setting(server_id, service, 'restart', service_restart):
+        if service_restart == '1':
+            roxywi_common.logging(server_ip, disable_restart, roxywi=1, login=1, keep_history=1, service=service)
+        else:
+            roxywi_common.logging(server_ip, enable_restart, roxywi=1, login=1, keep_history=1, service=service)
+
+    return 'ok'
+
+
+@bp.post('/<service>/tools/update')
+@check_services
+def update_tools_enable(service):
+    server_id = request.form.get('server_id')
+    active = request.form.get('active')
+    name = request.form.get('name')
+    alert = request.form.get('alert_en')
+    metrics = request.form.get('metrics')
+    sql.update_hapwi_server(server_id, alert, metrics, active, service)
+    server_ip = sql.select_server_ip_by_id(server_id)
+    roxywi_common.logging(server_ip, f'The server {name} has been updated ', roxywi=1, login=1, keep_history=1,
+                          service=service)
+
+    return 'ok'
+
+
+@bp.route('/check-restart/<server_ip>')
+def check_restart(server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+    servers = roxywi_common.get_dick_permit(ip=server_ip)
+    for server in servers:
+        if server != "":
+            return 'ok'
+
+    return 'nothing'
diff --git a/app/routes/smon/__init__.py b/app/routes/smon/__init__.py
new file mode 100644
index 00000000..446c971a
--- /dev/null
+++ b/app/routes/smon/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('smon', __name__)
+
+from app.routes.smon import routes
diff --git a/app/routes/smon/routes.py b/app/routes/smon/routes.py
new file mode 100644
index 00000000..adc18d85
--- /dev/null
+++ b/app/routes/smon/routes.py
@@ -0,0 +1,276 @@
+import os
+import sys
+
+from pytz import timezone
+from flask import render_template, request, redirect, url_for, jsonify
+from flask_login import login_required
+from datetime import datetime, timedelta
+
+from app import app, login_manager
+from app.routes.smon import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.tools.smon as smon_mod
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.route('/dashboard')
+def smon():
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    roxywi_common.check_user_group_for_flask()
+
+    user_group = roxywi_common.get_user_group(id=1)
+    smon = sql.smon_list(user_group)
+    smon_status, stderr = smon_mod.return_smon_status()
+    user_subscription = roxywi_common.return_user_subscription()
+
+    return render_template(
+        'smon/dashboard.html', h2=1, autorefresh=1, role=user_params['role'], user=user, group=user_group,
+        lang=user_params['lang'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'],
+        user_status=user_subscription['user_status'], smon=smon, user_plan=user_subscription['user_plan'], token=user_params['token']
+    )
+
+
+@bp.route('/dashboard/<dashboard_id>/<check_id>')
+def smon_dashboard(dashboard_id, check_id):
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    check_id = int(check_id)
+    roxywi_common.check_user_group_for_flask()
+    user_subscription = roxywi_common.return_user_subscription()
+    smon_name = sql.get_smon_service_name_by_id(dashboard_id)
+    check_interval = sql.get_setting('smon_check_interval')
+    smon = sql.select_one_smon(dashboard_id, check_id)
+    present = datetime.now(timezone('UTC'))
+    present = present.strftime('%b %d %H:%M:%S %Y %Z')
+    present = datetime.strptime(present, '%b %d %H:%M:%S %Y %Z')
+    cert_day_diff = 'N/A'
+    count_checks = sql.get_smon_history_count_checks(dashboard_id, check_id)
+
+    try:
+        uptime = round(count_checks['up'] * 100 / count_checks['total'], 2)
+    except Exception:
+        uptime = 0
+    try:
+        avg_res_time = round(sql.get_avg_resp_time(dashboard_id, check_id), 2)
+    except Exception:
+        avg_res_time = 0
+    try:
+        last_resp_time = round(sql.get_last_smon_res_time_by_check(dashboard_id, check_id), 2)
+    except Exception:
+        last_resp_time = 0
+
+    for s in smon:
+        if s.smon_id.ssl_expire_date is not None:
+            ssl_expire_date = datetime.strptime(s.smon_id.ssl_expire_date, '%Y-%m-%d %H:%M:%S')
+            cert_day_diff = (ssl_expire_date - present).days
+
+    return render_template(
+        'include/smon/smon_history.html', h2=1, autorefresh=1, role=user_params['role'], user=user, smon=smon,
+        lang=user_params['lang'],user_status=user_subscription['user_status'], check_interval=check_interval,
+        user_plan=user_subscription['user_plan'], token=user_params['token'], uptime=uptime, avg_res_time=avg_res_time,
+        user_services=user_params['user_services'], smon_name=smon_name, cert_day_diff=cert_day_diff, check_id=check_id,
+        dashboard_id=dashboard_id, last_resp_time=last_resp_time
+    )
+
+
+@bp.route('/history')
+def smon_history():
+    roxywi_common.check_user_group_for_flask()
+
+    user_group = roxywi_common.get_user_group(id=1)
+    smon_status, stderr = smon_mod.return_smon_status()
+    smon = sql.alerts_history('SMON', user_group)
+    user_subscription = roxywi_common.return_user_subscription()
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    return render_template(
+        'smon/history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon,
+        lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
+        token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services']
+    )
+
+
+@bp.route('/history/host/<server_ip>')
+def smon_host_history(server_ip):
+    roxywi_common.check_user_group_for_flask()
+
+    needed_host = common.is_ip_or_dns(server_ip)
+    user_group = roxywi_common.get_user_group(id=1)
+    smon_status, stderr = smon_mod.return_smon_status()
+    smon = sql.alerts_history('SMON', user_group, host=needed_host)
+    user_subscription = roxywi_common.return_user_subscription()
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    return render_template(
+        'smon/history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon,
+        lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
+        token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services']
+    )
+
+
+@bp.route('/history/metric/<int:dashboard_id>/<int:check_id>')
+def smon_history_metric(dashboard_id, check_id):
+    return jsonify(smon_mod.history_metrics(dashboard_id, check_id))
+
+
+@bp.route('/history/statuses/<int:dashboard_id>/<int:check_id>')
+def smon_history_statuses(dashboard_id, check_id):
+    return smon_mod.history_statuses(dashboard_id, check_id)
+
+
+@bp.route('/history/cur_status/<int:dashboard_id>/<int:check_id>')
+def smon_history_cur_status(dashboard_id, check_id):
+    return smon_mod.history_cur_status(dashboard_id, check_id)
+
+
+@bp.route('/admin')
+def smon_admin():
+    user_group = roxywi_common.get_user_group(id=1)
+    smon_status, stderr = smon_mod.return_smon_status()
+    telegrams = sql.get_user_telegram_by_group(user_group)
+    slacks = sql.get_user_slack_by_group(user_group)
+    pds = sql.get_user_pd_by_group(user_group)
+    smon = sql.select_smon(user_group)
+    smon_ping = sql.select_smon_ping(user_group)
+    smon_tcp = sql.select_smon_tcp(user_group)
+    smon_http = sql.select_smon_http(user_group)
+    smon_dns = sql.select_smon_dns(user_group)
+    roxywi_auth.page_for_admin(level=3)
+    user_subscription = roxywi_common.return_user_subscription()
+
+    try:
+        user_params = roxywi_common.get_users_params()
+        user = user_params['user']
+    except Exception:
+        return redirect(url_for('login_page'))
+
+    return render_template(
+        'smon/add.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon, lang=user_params['lang'],
+        user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'],
+        smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'], telegrams=telegrams,
+        slacks=slacks, pds=pds, smon_ping=smon_ping, smon_tcp=smon_tcp, smon_http=smon_http, smon_dns=smon_dns
+    )
+
+
+@bp.post('/add')
+def smon_add():
+    user_group = roxywi_common.get_user_group(id=1)
+    name = common.checkAjaxInput(request.form.get('newsmonname'))
+    hostname = common.checkAjaxInput(request.form.get('newsmon'))
+    port = common.checkAjaxInput(request.form.get('newsmonport'))
+    enable = common.checkAjaxInput(request.form.get('newsmonenable'))
+    url = common.checkAjaxInput(request.form.get('newsmonurl'))
+    body = common.checkAjaxInput(request.form.get('newsmonbody'))
+    group = common.checkAjaxInput(request.form.get('newsmongroup'))
+    desc = common.checkAjaxInput(request.form.get('newsmondescription'))
+    telegram = common.checkAjaxInput(request.form.get('newsmontelegram'))
+    slack = common.checkAjaxInput(request.form.get('newsmonslack'))
+    pd = common.checkAjaxInput(request.form.get('newsmonpd'))
+    check_type = common.checkAjaxInput(request.form.get('newsmonchecktype'))
+    resolver = common.checkAjaxInput(request.form.get('newsmonresserver'))
+    record_type = common.checkAjaxInput(request.form.get('newsmondns_record_type'))
+    packet_size = common.checkAjaxInput(request.form.get('newsmonpacket_size'))
+    http_method = common.checkAjaxInput(request.form.get('newsmon_http_method'))
+    lang = roxywi_common.get_user_lang()
+
+    try:
+        last_id = smon_mod.create_smon(
+            name, hostname, port, enable, url, body, group, desc, telegram, slack, pd, packet_size, check_type,
+             resolver, record_type, user_group, http_method
+        )
+    except Exception as e:
+        return str(e), 200
+    else:
+        if last_id:
+            smon = sql.select_smon_by_id(last_id)
+            pds = sql.get_user_pd_by_group(user_group)
+            slacks = sql.get_user_slack_by_group(user_group)
+            telegrams = sql.get_user_telegram_by_group(user_group)
+            smon_service = sql.select_smon_check_by_id(last_id, check_type)
+
+            return render_template(
+                'ajax/smon/show_new_smon.html', smon=smon, telegrams=telegrams, slacks=slacks, pds=pds, lang=lang,
+                check_type=check_type, smon_service=smon_service
+            )
+
+
+@bp.post('/update/<smon_id>')
+def smon_update(smon_id):
+    roxywi_common.check_user_group_for_flask()
+    name = common.checkAjaxInput(request.form.get('updateSmonName'))
+    ip = common.checkAjaxInput(request.form.get('updateSmonIp'))
+    port = common.checkAjaxInput(request.form.get('updateSmonPort'))
+    en = common.checkAjaxInput(request.form.get('updateSmonEn'))
+    url = common.checkAjaxInput(request.form.get('updateSmonUrl'))
+    body = common.checkAjaxInput(request.form.get('updateSmonBody'))
+    telegram = common.checkAjaxInput(request.form.get('updateSmonTelegram'))
+    slack = common.checkAjaxInput(request.form.get('updateSmonSlack'))
+    pd = common.checkAjaxInput(request.form.get('updateSmonPD'))
+    group = common.checkAjaxInput(request.form.get('updateSmonGroup'))
+    desc = common.checkAjaxInput(request.form.get('updateSmonDesc'))
+    check_type = common.checkAjaxInput(request.form.get('check_type'))
+    resolver = common.checkAjaxInput(request.form.get('updateSmonResServer'))
+    record_type = common.checkAjaxInput(request.form.get('updateSmonRecordType'))
+    packet_size = common.checkAjaxInput(request.form.get('updateSmonPacket_size'))
+    http_method = common.checkAjaxInput(request.form.get('updateSmon_http_method'))
+
+    if roxywi_common.check_user_group_for_flask():
+        try:
+            status = smon_mod.update_smon(
+                smon_id, name, ip, port, en, url, body, telegram, slack, pd, group, desc, check_type,
+                resolver, record_type, packet_size, http_method
+            )
+        except Exception as e:
+            return f'{e}', 200
+        else:
+            return status
+
+
+@bp.route('/delete/<smon_id>')
+def smon_delete(smon_id):
+    user_group = roxywi_common.get_user_group(id=1)
+
+    if roxywi_common.check_user_group_for_flask():
+        try:
+            status = smon_mod.delete_smon(smon_id, user_group)
+        except Exception as e:
+            return f'{e}', 200
+        else:
+            return status
+
+
+@bp.post('/refresh')
+def smon_show():
+    sort = common.checkAjaxInput(request.form.get('sort'))
+    return smon_mod.show_smon(sort)
diff --git a/app/routes/user/__init__.py b/app/routes/user/__init__.py
new file mode 100644
index 00000000..3a4d49c5
--- /dev/null
+++ b/app/routes/user/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('user', __name__)
+
+from app.routes.user import routes
diff --git a/app/routes/user/routes.py b/app/routes/user/routes.py
new file mode 100644
index 00000000..8ac43fb3
--- /dev/null
+++ b/app/routes/user/routes.py
@@ -0,0 +1,149 @@
+import os
+import sys
+import json
+
+from flask import render_template, request
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.user import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+import modules.common.common as common
+import modules.roxywi.user as roxywi_user
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+
+
+@bp.before_request
+@login_required
+def before_request():
+    """ Protect all of the admin endpoints. """
+    pass
+
+
+@bp.post('/create')
+def create_user():
+    roxywi_auth.page_for_admin(level=2)
+    email = common.checkAjaxInput(request.form.get('newemail'))
+    password = common.checkAjaxInput(request.form.get('newpassword'))
+    role = common.checkAjaxInput(request.form.get('newrole'))
+    new_user = common.checkAjaxInput(request.form.get('newusername'))
+    page = common.checkAjaxInput(request.form.get('page'))
+    activeuser = common.checkAjaxInput(request.form.get('activeuser'))
+    group = common.checkAjaxInput(request.form.get('newgroupuser'))
+    token = common.checkAjaxInput(request.form.get('token'))
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    if not roxywi_common.check_user_group_for_flask(token=token):
+        return 'error: Wrong group'
+    if page == 'servers':
+        if roxywi_auth.is_admin(level=2, role_id=role):
+            roxywi_common.logging(new_user, ' tried to privilege escalation: user creation', roxywi=1, login=1)
+            return 'error: Wrong role'
+    if roxywi_user.create_user(new_user, email, password, role, activeuser, group):
+        return render_template(
+            'ajax/new_user.html', users=sql.select_users(user=new_user), groups=sql.select_groups(), page=page,
+            roles=sql.select_roles(), adding=1, lang=lang
+        )
+
+
+@bp.post('/update')
+def update_user():
+    roxywi_auth.page_for_admin(level=2)
+    email = request.form.get('email')
+    new_user = request.form.get('updateuser')
+    user_id = request.form.get('id')
+    enabled = request.form.get('activeuser')
+    group_id = int(request.form.get('usergroup'))
+
+    if roxywi_common.check_user_group_for_flask():
+        if request.form.get('role'):
+            role_id = int(request.form.get('role'))
+            if roxywi_auth.is_admin(level=role_id):
+                roxywi_user.update_user(email, new_user, user_id, enabled, group_id, role_id)
+            else:
+                roxywi_common.logging(new_user, ' tried to privilege escalation', roxywi=1, login=1)
+                return 'error: dalsd'
+        else:
+            try:
+                sql.update_user_from_admin_area(new_user, email, user_id, enabled)
+            except Exception as e:
+                return f'error: Cannot update user: {e}'
+            roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1)
+
+        return 'ok'
+
+
+@bp.route('/delete/<int:user_id>')
+def delete_user(user_id):
+    roxywi_auth.page_for_admin(level=2)
+    try:
+        return roxywi_user.delete_user(user_id)
+    except Exception as e:
+        return f'error: {e}'
+
+
+@bp.route('/ldap/<username>')
+def get_ldap_email(username):
+    roxywi_auth.page_for_admin(level=2)
+
+    return roxywi_user.get_ldap_email(username)
+
+
+@bp.post('/password')
+def update_password():
+    password = request.form.get('updatepassowrd')
+    uuid = request.form.get('uuid')
+    user_id_from_get = request.form.get('id')
+
+    return roxywi_user.update_user_password(password, uuid, user_id_from_get)
+
+
+@bp.route('/services/<int:user_id>', methods=['GET', 'POST'])
+def show_user_services(user_id):
+    if request.method == 'GET':
+        return roxywi_user.get_user_services(user_id)
+    else:
+        user = common.checkAjaxInput(request.form.get('changeUserServicesUser'))
+        user_services = json.loads(request.form.get('jsonDatas'))
+
+        return roxywi_user.change_user_services(user, user_id, user_services)
+
+
+@bp.route('/group/current')
+def get_current_group():
+    uuid = request.cookies.get('uuid')
+    group = request.cookies.get('group')
+
+    return roxywi_user.get_user_active_group(uuid, group)
+
+
+@bp.post('/group/change')
+def change_current_group():
+    group_id = common.checkAjaxInput(request.form.get('changeUserCurrentGroupId'))
+    user_uuid = common.checkAjaxInput(request.form.get('changeUserGroupsUser'))
+
+    return roxywi_user.change_user_active_group(group_id, user_uuid)
+
+
+@bp.route('/groups/<int:user_id>')
+def show_user_groups_and_roles(user_id):
+    lang = roxywi_common.get_user_lang_for_flask()
+
+    return roxywi_user.show_user_groups_and_roles(user_id, lang)
+
+
+@bp.post('/groups/save')
+def change_user_groups_and_roles():
+    user = common.checkAjaxInput(request.form.get('changeUserGroupsUser'))
+    groups_and_roles = json.loads(request.form.get('jsonDatas'))
+
+    return roxywi_user.save_user_group_and_role(user, groups_and_roles)
+
+
+@bp.route('/group/name/<int:group_id>')
+def get_group_name_by_id(group_id):
+    return sql.get_group_name_by_id(group_id)
diff --git a/app/routes/waf/__init__.py b/app/routes/waf/__init__.py
new file mode 100644
index 00000000..dbe6c950
--- /dev/null
+++ b/app/routes/waf/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+bp = Blueprint('waf', __name__)
+
+from app.routes.waf import routes
diff --git a/app/routes/waf/routes.py b/app/routes/waf/routes.py
new file mode 100644
index 00000000..43f186ee
--- /dev/null
+++ b/app/routes/waf/routes.py
@@ -0,0 +1,219 @@
+import os
+import sys
+
+from flask import render_template, request
+from flask_login import login_required
+
+from app import app, login_manager
+from app.routes.waf import bp
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+from modules.db.db_model import *
+import modules.common.common as common
+import modules.roxy_wi_tools as roxy_wi_tools
+import modules.roxywi.waf as roxy_waf
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+import modules.config.config as config_mod
+
+get_config = roxy_wi_tools.GetConfigVar()
+time_zone = sql.get_setting('time_zone')
+get_date = roxy_wi_tools.GetDate(time_zone)
+
+
+@bp.route('/<service>')
+@login_required
+def waf(service):
+    roxywi_auth.page_for_admin(level=2)
+
+    manage_rules = ''
+    waf_rule_id = ''
+    config_file_name = ''
+    waf_rule_file = ''
+    config_read = ''
+    rules = ''
+    serv = ''
+    cfg = ''
+    user_params = roxywi_common.get_users_params()
+
+    if service == 'nginx':
+        roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
+        servers = roxywi_common.get_dick_permit(nginx=1)
+    else:
+        roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
+        servers = user_params['servers']
+
+    title = "Web application firewall"
+    servers_waf = sql.select_waf_servers_metrics(user_params['user_uuid'])
+    autorefresh = 1
+
+    return render_template(
+        'waf.html',
+        h2=1, title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], serv=serv,
+        servers=servers_waf,
+        servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'],
+        waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id, config=config_read, cfg=cfg, token=user_params['token'],
+        config_file_name=config_file_name, service=service, lang=user_params['lang']
+    )
+
+
+@bp.route('/<service>/<server_ip>/rules')
+@login_required
+def waf_rules(service, server_ip):
+    roxywi_auth.page_for_admin(level=2)
+    roxywi_common.check_is_server_in_group(server_ip)
+
+    manage_rules = '1'
+    waf_rule_id = ''
+    config_file_name = ''
+    waf_rule_file = ''
+    servers_waf = ''
+    config_read = ''
+    servers = ''
+    cfg = ''
+    user_params = roxywi_common.get_users_params()
+    title = "Manage rules - Web application firewall"
+    rules = sql.select_waf_rules(server_ip, service)
+
+    if service == 'nginx':
+        roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
+    else:
+        roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
+
+    return render_template(
+        'waf.html',
+        h2=1, title=title, autorefresh=0, role=user_params['role'], user=user_params['user'], serv=server_ip,
+        servers=servers_waf,
+        servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'],
+        waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id, config=config_read, cfg=cfg, token=user_params['token'],
+        config_file_name=config_file_name, service=service, lang=user_params['lang']
+    )
+
+
+@bp.route('/<service>/<server_ip>/rule/<rule_id>')
+@login_required
+def waf_rule_edit(service, server_ip, rule_id):
+    roxywi_auth.page_for_admin(level=2)
+    roxywi_common.check_is_server_in_group(server_ip)
+
+    manage_rules = ''
+    servers_waf = ''
+    config_read = ''
+    servers = ''
+    user_params = roxywi_common.get_users_params()
+    rules = sql.select_waf_rules(server_ip, service)
+
+    if service == 'nginx':
+        roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
+        config_path = sql.get_setting('nginx_dir')
+    else:
+        roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
+        config_path = sql.get_setting('haproxy_dir')
+
+    title = 'Edit a WAF rule'
+    waf_rule_file = sql.select_waf_rule_by_id(rule_id)
+    configs_dir = sql.get_setting('tmp_config_path')
+    cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}-{waf_rule_file}"
+    error = config_mod.get_config(server_ip, cfg, waf=service, waf_rule_file=waf_rule_file)
+    config_file_name = common.return_nice_path(config_path) + 'waf/rules/' + waf_rule_file
+
+    try:
+        conf = open(cfg, "r")
+        config_read = conf.read()
+        conf.close()
+    except IOError:
+        print('Cannot read imported config file')
+
+    return render_template(
+        'waf.html',
+        h2=1, title=title, autorefresh=0, role=user_params['role'], user=user_params['user'], serv=server_ip,
+        servers=servers_waf,
+        servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'],
+        waf_rule_file=waf_rule_file, waf_rule_id=rule_id, config=config_read, cfg=cfg, token=user_params['token'],
+        config_file_name=config_file_name, service=service, lang=user_params['lang']
+    )
+
+
+@bp.route('/<service>/<server_ip>/rule/<rule_id>/save', methods=['POST'])
+@login_required
+def waf_save_config(service, server_ip, rule_id):
+    roxywi_auth.page_for_admin(level=2)
+    roxywi_common.check_is_server_in_group(server_ip)
+
+    configs_dir = sql.get_setting('tmp_config_path')
+    cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}"
+    config_file_name = request.form.get('config_file_name')
+    config = request.form.get('config')
+    oldcfg = request.form.get('oldconfig')
+    save = request.form.get('save')
+
+    try:
+        with open(cfg, "a") as conf:
+            conf.write(config)
+    except IOError:
+        print("error: Cannot read imported config file")
+
+    stderr = config_mod.master_slave_upload_and_restart(server_ip, cfg, save, 'waf', oldcfg=oldcfg, config_file_name=config_file_name)
+
+    config_mod.diff_config(oldcfg, cfg)
+
+    try:
+        os.system(f"/bin/rm -f {configs_dir}*.old")
+    except Exception as e:
+        return f'error: {e}'
+
+    if stderr:
+        return stderr
+
+    return
+
+
+@bp.route('/<server_ip>/rule/<int:rule_id>/<int:enable>')
+@login_required
+def enable_rule(server_ip, rule_id, enable):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return roxy_waf.switch_waf_rule(server_ip, enable, rule_id)
+
+
+@bp.route('/<service>/<server_ip>/rule/create', methods=['POST'])
+@login_required
+def create_rule(service, server_ip):
+    if service not in ('haproxy', 'nginx'):
+        return 'error: Wrong service'
+
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    return roxy_waf.create_waf_rule(server_ip, service)
+
+
+@bp.route('/<service>/mode/<server_name>/<waf_mode>')
+@login_required
+def change_waf_mode(service, server_name, waf_mode):
+    if service not in ('haproxy', 'nginx'):
+        return 'error: Wrong service'
+
+    server_name = common.checkAjaxInput(server_name)
+    waf_mode = common.checkAjaxInput(waf_mode)
+
+    return roxy_waf.change_waf_mode(waf_mode, server_name, service)
+
+
+@bp.route('/overview/<service>/<server_ip>')
+@login_required
+def overview_waf(service, server_ip):
+    server_ip = common.is_ip_or_dns(server_ip)
+
+    if service not in ('haproxy', 'nginx'):
+        return 'error: Wrong service'
+
+    return roxy_waf.waf_overview(server_ip, service)
+
+
+@bp.route('/metric/enable/<int:enable>/<server_name>')
+@login_required
+def enable_metric(enable, server_name):
+    server_name = common.checkAjaxInput(server_name)
+    return sql.update_waf_metrics_enable(server_name, enable)
diff --git a/app/runtimeapi.py b/app/runtimeapi.py
deleted file mode 100644
index 1fc76e5d..00000000
--- a/app/runtimeapi.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('runtimeapi.html')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
-except Exception as e:
-	print(f'error {e}')
-	sys.exit()
-
-form = common.form
-servbackend = form.getvalue('servbackend')
-serv = form.getvalue('serv')
-if servbackend is None:
-	servbackend = ""
-
-rendered_template = template.render(
-	h2=1, title="RunTime API", role=user_params['role'], user=user_params['user'], select_id="serv",
-	selects=user_params['servers'], token=user_params['token'], user_services=user_params['user_services'],
-	servbackend=servbackend, lang=user_params['lang']
-)
-print(rendered_template)
diff --git a/app/scripts/backup.sh b/app/scripts/backup.sh
index 4759b2c1..cc685016 100644
--- a/app/scripts/backup.sh
+++ b/app/scripts/backup.sh
@@ -12,8 +12,8 @@ do
             SERVER)    SERVER=${VALUE} ;;
             USER)    USER=${VALUE} ;;
             KEY)    KEY=${VALUE} ;;
-			DELJOB) DELJOB=${VALUE} ;;
-			SSH_PORT) SSH_PORT=${VALUE} ;;
+			      DELJOB) DELJOB=${VALUE} ;;
+			      SSH_PORT) SSH_PORT=${VALUE} ;;
             *)
     esac
 done
@@ -24,8 +24,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo '[backup]' > $PWD/$HOST
 echo "$HOST ansible_port=$SSH_PORT" >> $PWD/$HOST
 echo '[haproxy_wi]' >> $PWD/$HOST
diff --git a/app/scripts/git_backup.sh b/app/scripts/git_backup.sh
index fc744409..181a5cd6 100644
--- a/app/scripts/git_backup.sh
+++ b/app/scripts/git_backup.sh
@@ -27,11 +27,9 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" >> $PWD/$HOST
 
-
 ansible-playbook $PWD/roles/git_backup.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST DELJOB=$DELJOB SERVICE=$SERVICE INIT=$INIT REPO=$REPO BRANCH=$BRANCH PERIOD=$PERIOD CONFIG_DIR=$CONFIG_DIR PROXY=$PROXY KEY=$KEY" -i $PWD/$HOST
 
 if [ $? -gt 0 ]
diff --git a/app/scripts/install_apache.sh b/app/scripts/install_apache.sh
index ce937918..32dbd21f 100644
--- a/app/scripts/install_apache.sh
+++ b/app/scripts/install_apache.sh
@@ -36,8 +36,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/install_apache_exporter.sh b/app/scripts/install_apache_exporter.sh
index 4f3feaff..455b47cf 100644
--- a/app/scripts/install_apache_exporter.sh
+++ b/app/scripts/install_apache_exporter.sh
@@ -27,8 +27,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/install_grafana.sh b/app/scripts/install_grafana.sh
index 0f1cba70..6083a1c9 100644
--- a/app/scripts/install_grafana.sh
+++ b/app/scripts/install_grafana.sh
@@ -32,8 +32,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 
 ansible-playbook $PWD/roles/grafana.yml -e "PROXY=$PROXY"
 
diff --git a/app/scripts/install_haproxy_exporter.sh b/app/scripts/install_haproxy_exporter.sh
index 92859ca4..689c78b0 100644
--- a/app/scripts/install_haproxy_exporter.sh
+++ b/app/scripts/install_haproxy_exporter.sh
@@ -38,8 +38,7 @@ export ANSIBLE_HOST_KEY_CHECKING=False
 export ANSIBLE_DISPLAY_SKIPPED_HOSTS=False
 export ACTION_WARNINGS=False
 export ANSIBLE_DEPRECATION_WARNINGS=False
-PWD=$(pwd)
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > "$PWD"/"$HOST"
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/install_haproxy_geoip.sh b/app/scripts/install_haproxy_geoip.sh
index d85203a4..c9b066a0 100644
--- a/app/scripts/install_haproxy_geoip.sh
+++ b/app/scripts/install_haproxy_geoip.sh
@@ -24,8 +24,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=$(pwd)
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $maxmind_key == "" ]]; then
diff --git a/app/scripts/install_keepalived_exporter.sh b/app/scripts/install_keepalived_exporter.sh
index f6e20670..56be5da2 100644
--- a/app/scripts/install_keepalived_exporter.sh
+++ b/app/scripts/install_keepalived_exporter.sh
@@ -23,8 +23,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/install_nginx_exporter.sh b/app/scripts/install_nginx_exporter.sh
index 2b46b975..4b522a8e 100644
--- a/app/scripts/install_nginx_exporter.sh
+++ b/app/scripts/install_nginx_exporter.sh
@@ -40,8 +40,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/install_nginx_geoip.sh b/app/scripts/install_nginx_geoip.sh
index 4fb251bb..fbb0a05f 100644
--- a/app/scripts/install_nginx_geoip.sh
+++ b/app/scripts/install_nginx_geoip.sh
@@ -24,8 +24,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=$(pwd)
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $maxmind_key == "" ]]; then
diff --git a/app/scripts/install_node_exporter.sh b/app/scripts/install_node_exporter.sh
index 015bd1a9..201f7a8f 100644
--- a/app/scripts/install_node_exporter.sh
+++ b/app/scripts/install_node_exporter.sh
@@ -23,8 +23,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/letsencrypt.sh b/app/scripts/letsencrypt.sh
index 139b7d8e..cc6c11d4 100644
--- a/app/scripts/letsencrypt.sh
+++ b/app/scripts/letsencrypt.sh
@@ -25,8 +25,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/s3_backup.sh b/app/scripts/s3_backup.sh
index 3f80acd2..8827d2e3 100644
--- a/app/scripts/s3_backup.sh
+++ b/app/scripts/s3_backup.sh
@@ -22,8 +22,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=`pwd`
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 
 ansible-playbook $PWD/roles/s3_backup.yml -e "SERVER=$SERVER S3_SERVER=$S3_SERVER BUCKET=$BUCKET SECRET_KEY=$SECRET_KEY ACCESS_KEY=$ACCESS_KEY TIME=$TIME" -t $TAG -i $PWD/$HOST
 
diff --git a/app/scripts/waf.sh b/app/scripts/waf.sh
index a839365e..eb4bda01 100644
--- a/app/scripts/waf.sh
+++ b/app/scripts/waf.sh
@@ -31,8 +31,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=$(pwd)
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/scripts/waf_nginx.sh b/app/scripts/waf_nginx.sh
index 5f3adb63..31b7a9ef 100644
--- a/app/scripts/waf_nginx.sh
+++ b/app/scripts/waf_nginx.sh
@@ -24,8 +24,7 @@ export ACTION_WARNINGS=False
 export LOCALHOST_WARNING=False
 export COMMAND_WARNINGS=False
 
-PWD=$(pwd)
-PWD=$PWD/scripts/ansible/
+PWD=/var/www/haproxy-wi/app/scripts/ansible/
 echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
 
 if [[ $KEY == "" ]]; then
diff --git a/app/sections.py b/app/sections.py
deleted file mode 100644
index 98ef83f5..00000000
--- a/app/sections.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env python3
-import os
-import sys
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-import modules.config.section as section_mod
-import modules.config.config as config_mod
-import modules.roxy_wi_tools as roxy_wi_tools
-
-time_zone = sql.get_setting('time_zone')
-get_date = roxy_wi_tools.GetDate(time_zone)
-get_config_var = roxy_wi_tools.GetConfigVar()
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=['jinja2.ext.loopcontrols'])
-template = env.get_template('sections.html')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
-except Exception as e:
-	print(f'error {e}')
-	sys.exit()
-
-form = common.form
-serv = form.getvalue('serv')
-section = form.getvalue('section')
-is_serv_protected = sql.is_serv_protected(serv)
-sections = ""
-config_read = ""
-cfg = ""
-stderr = ""
-error = ""
-aftersave = ""
-start_line = ""
-end_line = ""
-warning = ''
-is_restart = ''
-
-hap_configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir')
-
-if serv is not None and open is not None:
-	cfg = f"{hap_configs_dir}{serv}-{get_date.return_date('config')}.cfg"
-	error = config_mod.get_config(serv, cfg)
-	sections = section_mod.get_sections(cfg)
-
-if serv is not None and section is not None:
-
-	try:
-		roxywi_common.logging(serv, "sections.py open config")
-	except Exception:
-		pass
-
-	start_line, end_line, config_read = section_mod.get_section_from_config(cfg, section)
-	server_id = sql.select_server_id_by_ip(serv)
-	is_restart = sql.select_service_setting(server_id, 'haproxy', 'restart')
-
-	os.system(f"/bin/mv {cfg} {cfg}.old")
-
-if serv is not None and form.getvalue('config') is not None:
-	try:
-		roxywi_common.logging(serv, "sections.py edited config")
-	except Exception:
-		pass
-
-	config = form.getvalue('config')
-	oldcfg = form.getvalue('oldconfig')
-	save = form.getvalue('save')
-	start_line = form.getvalue('start_line')
-	end_line = form.getvalue('end_line')
-	aftersave = 1
-
-	if save == 'delete':
-		config = ''
-		save = 'reload'
-
-	config = section_mod.rewrite_section(start_line, end_line, oldcfg, config)
-
-	try:
-		with open(cfg, "w") as conf:
-			conf.write(config)
-	except IOError:
-		error = "Can't read import config file"
-
-	stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, oldcfg=oldcfg)
-
-	if "is valid" in stderr:
-		warning = stderr
-		stderr = ''
-
-	config_mod.diff_config(oldcfg, cfg)
-
-	os.system(f"/bin/rm -f {hap_configs_dir}*.old")
-
-if user_params['lang'] == 'ru':
-	title = 'Работа с секциями HAProxy'
-elif user_params['lang'] == 'fr':
-	title = 'Utilisation des sections de configuration HAProxy'
-else:
-	title = 'Working with HAProxy config sections'
-
-rendered_template = template.render(
-	h2=1, title=title, role=user_params['role'], action="sections.py", user=user_params['user'],
-	select_id="serv", serv=serv, aftersave=aftersave, config=config_read, cfg=cfg, selects=user_params['servers'],
-	stderr=stderr, error=error, start_line=start_line, end_line=end_line, section=section, sections=sections,
-	is_serv_protected=is_serv_protected, user_services=user_params['user_services'], token=user_params['token'],
-	warning=warning, is_restart=is_restart, lang=user_params['lang']
-)
-print(rendered_template)
diff --git a/app/servers.py b/app/servers.py
deleted file mode 100644
index 64e9bb79..00000000
--- a/app/servers.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-import pytz
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('servers.html')
-form = common.form
-
-print('Content-type: text/html\n')
-user_params = roxywi_common.get_users_params()
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception:
-	print('error: your session is expired')
-	sys.exit()
-
-roxywi_auth.page_for_admin(level=2)
-
-ldap_enable = sql.get_setting('ldap_enable')
-user_group = roxywi_common.get_user_group(id=1)
-settings = sql.get_setting('', all=1)
-geoip_country_codes = sql.select_geoip_country_codes()
-services = sql.select_services()
-gits = sql.select_gits()
-servers = roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1)
-masters = sql.select_servers(get_master_servers=1, uuid=user_params['user_uuid'].value)
-is_needed_tool = common.is_tool('ansible')
-user_roles = sql.select_user_roles_by_group(user_group)
-backups = sql.select_backups()
-s3_backups = sql.select_s3_backups()
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-if user_params['lang'] == 'ru':
-	title = 'Сервера: '
-else:
-	title = "Servers: "
-
-rendered_template = template.render(
-	h2=1, title=title, role=user_params['role'], user=user_params['user'], users=sql.select_users(group=user_group),
-	groups=sql.select_groups(), servers=servers, roles=sql.select_roles(), sshs=sql.select_ssh(group=user_group),
-	masters=masters, group=user_group, services=services, timezones=pytz.all_timezones, guide_me=1,
-	token=user_params['token'], settings=settings, backups=backups, s3_backups=s3_backups, page="servers.py",
-	geoip_country_codes=geoip_country_codes, user_services=user_params['user_services'], ldap_enable=ldap_enable,
-	user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], gits=gits,
-	is_needed_tool=is_needed_tool, lang=user_params['lang'], user_roles=user_roles
-)
-print(rendered_template)
diff --git a/app/smon.py b/app/smon.py
deleted file mode 100644
index 247457d0..00000000
--- a/app/smon.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/env python3
-import sys
-
-from datetime import datetime
-from pytz import timezone
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-import modules.server.server as server_mod
-
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('smon.html')
-
-print('Content-type: text/html\n')
-user_params = roxywi_common.get_users_params()
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception as e:
-	print(f'error {e}')
-	sys.exit()
-
-roxywi_common.check_user_group()
-form = common.form
-action = form.getvalue('action')
-sort = form.getvalue('sort')
-autorefresh = 0
-lang = user_params['lang']
-telegrams = ''
-slacks = ''
-pds = ''
-user_group = roxywi_common.get_user_group(id=1)
-cmd = "systemctl is-active roxy-wi-smon"
-smon_status, stderr = server_mod.subprocess_execute(cmd)
-smon_statuses = ''
-smon_ping = ''
-smon_tcp = ''
-smon_http = ''
-smon_dns = ''
-smon = ''
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-if action == 'add':
-	telegrams = sql.get_user_telegram_by_group(user_group)
-	slacks = sql.get_user_slack_by_group(user_group)
-	pds = sql.get_user_pd_by_group(user_group)
-	smon = sql.select_smon(user_group)
-	smon_ping = sql.select_smon_ping(user_group)
-	smon_tcp = sql.select_smon_tcp(user_group)
-	smon_http = sql.select_smon_http(user_group)
-	smon_dns = sql.select_smon_dns(user_group)
-	roxywi_auth.page_for_admin(level=3)
-	if lang == 'ru':
-		title = "SMON: Админка"
-	elif lang == 'fr':
-		title = "SMON: Administratrice"
-	else:
-		title = "SMON: Admin"
-elif action == 'history':
-	if form.getvalue('host'):
-		needed_host = common.is_ip_or_dns(form.getvalue('host'))
-		smon = sql.alerts_history('SMON', user_group, host=needed_host)
-	else:
-		smon = sql.alerts_history('SMON', user_group)
-	if lang == 'ru':
-		title = "SMON: История"
-	elif lang == 'fr':
-		title = "SMON: Histoire"
-	else:
-		title = "SMON: History"
-elif action == 'checker_history':
-	smon = sql.alerts_history('Checker', user_group)
-	if lang == 'ru':
-		title = "Checker: История"
-	elif lang == 'fr':
-		title = "Checker: Histoire"
-	else:
-		title = "Checker: History"
-elif action == 'dashboard':
-	dashboard_id = int(form.getvalue('dashboard_id'))
-	check_id = int(form.getvalue('check_id'))
-	smon_name = sql.get_smon_service_name_by_id(dashboard_id)
-	check_interval = sql.get_setting('smon_check_interval')
-	smon = sql.select_one_smon(dashboard_id, check_id)
-	present = datetime.now(timezone('UTC'))
-	present = present.strftime('%b %d %H:%M:%S %Y %Z')
-	present = datetime.strptime(present, '%b %d %H:%M:%S %Y %Z')
-	cert_day_diff = 'N/A'
-	count_checks = sql.get_smon_history_count_checks(dashboard_id, check_id)
-	try:
-		uptime = round(count_checks['up'] * 100 / count_checks['total'], 2)
-	except Exception:
-		uptime = 0
-	try:
-		avg_res_time = round(sql.get_avg_resp_time(dashboard_id, check_id), 2)
-	except Exception:
-		avg_res_time = 0
-	try:
-		last_resp_time = round(sql.get_last_smon_res_time_by_check(dashboard_id, check_id), 2)
-	except Exception:
-		last_resp_time = 0
-	template = env.get_template('include/smon/smon_history.html')
-
-	for s in smon:
-		if s.smon_id.ssl_expire_date is not None:
-			ssl_expire_date = datetime.strptime(s.smon_id.ssl_expire_date, '%Y-%m-%d %H:%M:%S')
-			cert_day_diff = (ssl_expire_date - present).days
-
-	rendered_template = template.render(
-		h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], smon=smon, group=user_group, lang=lang,
-		user_status=user_subscription['user_status'], check_interval=check_interval, user_plan=user_subscription['user_plan'],
-		token=user_params['token'], uptime=uptime, user_services=user_params['user_services'], avg_res_time=avg_res_time,
-		smon_name=smon_name, cert_day_diff=cert_day_diff, check_id=check_id, dashboard_id=dashboard_id, last_resp_time=last_resp_time
-	)
-	print(rendered_template)
-	sys.exit()
-else:
-	smon = sql.smon_list(user_group)
-	if lang == 'ru':
-		title = "SMON: Дашборд"
-	elif lang == 'fr':
-		title = "SMON: Tableau de bord"
-	else:
-		title = "SMON: Dashboard"
-	autorefresh = 1
-
-rendered_template = template.render(
-	h2=1, title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], group=user_group,
-	telegrams=telegrams, slacks=slacks, pds=pds, lang=lang, smon=smon, smon_status=smon_status, smon_error=stderr,
-	action=action, sort=sort, user_services=user_params['user_services'], user_status=user_subscription['user_status'],
-	user_plan=user_subscription['user_plan'], token=user_params['token'], smon_ping=smon_ping, smon_tcp=smon_tcp,
-	smon_http=smon_http, smon_dns=smon_dns
-
-)
-print(rendered_template)
diff --git a/inc/images/favicon/android-icon-144x144.png b/app/static/images/favicon/android-icon-144x144.png
similarity index 100%
rename from inc/images/favicon/android-icon-144x144.png
rename to app/static/images/favicon/android-icon-144x144.png
diff --git a/inc/images/favicon/android-icon-192x192.png b/app/static/images/favicon/android-icon-192x192.png
similarity index 100%
rename from inc/images/favicon/android-icon-192x192.png
rename to app/static/images/favicon/android-icon-192x192.png
diff --git a/inc/images/favicon/android-icon-36x36.png b/app/static/images/favicon/android-icon-36x36.png
similarity index 100%
rename from inc/images/favicon/android-icon-36x36.png
rename to app/static/images/favicon/android-icon-36x36.png
diff --git a/inc/images/favicon/android-icon-48x48.png b/app/static/images/favicon/android-icon-48x48.png
similarity index 100%
rename from inc/images/favicon/android-icon-48x48.png
rename to app/static/images/favicon/android-icon-48x48.png
diff --git a/inc/images/favicon/android-icon-72x72.png b/app/static/images/favicon/android-icon-72x72.png
similarity index 100%
rename from inc/images/favicon/android-icon-72x72.png
rename to app/static/images/favicon/android-icon-72x72.png
diff --git a/inc/images/favicon/android-icon-96x96.png b/app/static/images/favicon/android-icon-96x96.png
similarity index 100%
rename from inc/images/favicon/android-icon-96x96.png
rename to app/static/images/favicon/android-icon-96x96.png
diff --git a/inc/images/favicon/apple-icon-114x114.png b/app/static/images/favicon/apple-icon-114x114.png
similarity index 100%
rename from inc/images/favicon/apple-icon-114x114.png
rename to app/static/images/favicon/apple-icon-114x114.png
diff --git a/inc/images/favicon/apple-icon-120x120.png b/app/static/images/favicon/apple-icon-120x120.png
similarity index 100%
rename from inc/images/favicon/apple-icon-120x120.png
rename to app/static/images/favicon/apple-icon-120x120.png
diff --git a/inc/images/favicon/apple-icon-144x144.png b/app/static/images/favicon/apple-icon-144x144.png
similarity index 100%
rename from inc/images/favicon/apple-icon-144x144.png
rename to app/static/images/favicon/apple-icon-144x144.png
diff --git a/inc/images/favicon/apple-icon-152x152.png b/app/static/images/favicon/apple-icon-152x152.png
similarity index 100%
rename from inc/images/favicon/apple-icon-152x152.png
rename to app/static/images/favicon/apple-icon-152x152.png
diff --git a/inc/images/favicon/apple-icon-180x180.png b/app/static/images/favicon/apple-icon-180x180.png
similarity index 100%
rename from inc/images/favicon/apple-icon-180x180.png
rename to app/static/images/favicon/apple-icon-180x180.png
diff --git a/inc/images/favicon/apple-icon-57x57.png b/app/static/images/favicon/apple-icon-57x57.png
similarity index 100%
rename from inc/images/favicon/apple-icon-57x57.png
rename to app/static/images/favicon/apple-icon-57x57.png
diff --git a/inc/images/favicon/apple-icon-60x60.png b/app/static/images/favicon/apple-icon-60x60.png
similarity index 100%
rename from inc/images/favicon/apple-icon-60x60.png
rename to app/static/images/favicon/apple-icon-60x60.png
diff --git a/inc/images/favicon/apple-icon-72x72.png b/app/static/images/favicon/apple-icon-72x72.png
similarity index 100%
rename from inc/images/favicon/apple-icon-72x72.png
rename to app/static/images/favicon/apple-icon-72x72.png
diff --git a/inc/images/favicon/apple-icon-76x76.png b/app/static/images/favicon/apple-icon-76x76.png
similarity index 100%
rename from inc/images/favicon/apple-icon-76x76.png
rename to app/static/images/favicon/apple-icon-76x76.png
diff --git a/inc/images/favicon/apple-icon-precomposed.png b/app/static/images/favicon/apple-icon-precomposed.png
similarity index 100%
rename from inc/images/favicon/apple-icon-precomposed.png
rename to app/static/images/favicon/apple-icon-precomposed.png
diff --git a/inc/images/favicon/apple-icon.png b/app/static/images/favicon/apple-icon.png
similarity index 100%
rename from inc/images/favicon/apple-icon.png
rename to app/static/images/favicon/apple-icon.png
diff --git a/inc/images/favicon/browserconfig.xml b/app/static/images/favicon/browserconfig.xml
similarity index 100%
rename from inc/images/favicon/browserconfig.xml
rename to app/static/images/favicon/browserconfig.xml
diff --git a/inc/images/favicon/favicon-16x16.png b/app/static/images/favicon/favicon-16x16.png
similarity index 100%
rename from inc/images/favicon/favicon-16x16.png
rename to app/static/images/favicon/favicon-16x16.png
diff --git a/inc/images/favicon/favicon-32x32.png b/app/static/images/favicon/favicon-32x32.png
similarity index 100%
rename from inc/images/favicon/favicon-32x32.png
rename to app/static/images/favicon/favicon-32x32.png
diff --git a/inc/images/favicon/favicon-96x96.png b/app/static/images/favicon/favicon-96x96.png
similarity index 100%
rename from inc/images/favicon/favicon-96x96.png
rename to app/static/images/favicon/favicon-96x96.png
diff --git a/inc/images/favicon/favicon.ico b/app/static/images/favicon/favicon.ico
similarity index 100%
rename from inc/images/favicon/favicon.ico
rename to app/static/images/favicon/favicon.ico
diff --git a/inc/images/favicon/manifest.json b/app/static/images/favicon/manifest.json
similarity index 100%
rename from inc/images/favicon/manifest.json
rename to app/static/images/favicon/manifest.json
diff --git a/inc/images/favicon/ms-icon-144x144.png b/app/static/images/favicon/ms-icon-144x144.png
similarity index 100%
rename from inc/images/favicon/ms-icon-144x144.png
rename to app/static/images/favicon/ms-icon-144x144.png
diff --git a/inc/images/favicon/ms-icon-150x150.png b/app/static/images/favicon/ms-icon-150x150.png
similarity index 100%
rename from inc/images/favicon/ms-icon-150x150.png
rename to app/static/images/favicon/ms-icon-150x150.png
diff --git a/inc/images/favicon/ms-icon-310x310.png b/app/static/images/favicon/ms-icon-310x310.png
similarity index 100%
rename from inc/images/favicon/ms-icon-310x310.png
rename to app/static/images/favicon/ms-icon-310x310.png
diff --git a/inc/images/favicon/ms-icon-70x70.png b/app/static/images/favicon/ms-icon-70x70.png
similarity index 100%
rename from inc/images/favicon/ms-icon-70x70.png
rename to app/static/images/favicon/ms-icon-70x70.png
diff --git a/inc/images/loading.gif b/app/static/images/loading.gif
similarity index 100%
rename from inc/images/loading.gif
rename to app/static/images/loading.gif
diff --git a/inc/images/logo_footer.png b/app/static/images/logo_footer.png
similarity index 100%
rename from inc/images/logo_footer.png
rename to app/static/images/logo_footer.png
diff --git a/inc/images/logo_index.png b/app/static/images/logo_index.png
similarity index 100%
rename from inc/images/logo_index.png
rename to app/static/images/logo_index.png
diff --git a/inc/images/logo_login.png b/app/static/images/logo_login.png
similarity index 100%
rename from inc/images/logo_login.png
rename to app/static/images/logo_login.png
diff --git a/inc/images/logo_menu.png b/app/static/images/logo_menu.png
similarity index 100%
rename from inc/images/logo_menu.png
rename to app/static/images/logo_menu.png
diff --git a/inc/images/no_servers.png b/app/static/images/no_servers.png
similarity index 100%
rename from inc/images/no_servers.png
rename to app/static/images/no_servers.png
diff --git a/inc/images/oops.png b/app/static/images/oops.png
similarity index 100%
rename from inc/images/oops.png
rename to app/static/images/oops.png
diff --git a/app/statsview.py b/app/statsview.py
deleted file mode 100644
index 674e1141..00000000
--- a/app/statsview.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env python3
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('statsview.html')
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
-
-form = common.form
-serv = form.getvalue('serv')
-service = form.getvalue('service')
-
-try:
-	if serv is None:
-		first_serv = user_params['servers']
-		for i in first_serv:
-			serv = i[2]
-			break
-except Exception:
-	pass
-
-if service in ('haproxy', 'nginx', 'apache'):
-	service_desc = sql.select_service(service)
-	if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
-		servers = roxywi_common.get_dick_permit(service=service_desc.slug)
-else:
-	print('<meta http-equiv="refresh" content="0; url=/app/overview.py">')
-
-
-
-rendered_template = template.render(
-	h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], onclick="showStats()",
-	selects=servers, serv=serv, service=service, user_services=user_params['user_services'],
-	token=user_params['token'], select_id="serv", lang=user_params['lang'], service_desc=service_desc
-)
-print(rendered_template)
diff --git a/app/templates/404.html b/app/templates/404.html
index 25b38d4a..b1b19bec 100644
--- a/app/templates/404.html
+++ b/app/templates/404.html
@@ -1,65 +1,5 @@
-<html lang="en">
-<head>
-    <title>404 - Page not found - Roxy-WI</title>
-    <meta charset="UTF-8">
-    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
-    <meta http-equiv="Pragma" content="no-cache" />
-    <meta http-equiv="Expires" content="0" />
-    <link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" />
-    <link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png">
-    <link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png">
-    <link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png">
-    <link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png">
-    <link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png">
-    <link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png">
-    <link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png">
-    <link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png">
-    <link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png">
-    <link rel="icon" type="image/png" sizes="192x192"  href="/inc/images/favicon/android-icon-192x192.png">
-    <link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png">
-    <link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png">
-    <link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png">
-    <link rel="manifest" href="/inc/images/favicon/manifest.json">
-    <meta name="msapplication-TileColor" content="#ffffff">
-    <meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png">
-    <meta name="theme-color" content="#ffffff">
-    <script>
-        FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };
-    </script>
-    <script defer src="/inc/fa-solid.min.js"></script>
-    <script defer src="/inc/fontawesome.min.js"></script>
-    <script defer src="/inc/ion.sound.min.js"></script>
-    <link href="/inc/css/awesome-6.3.9.css" rel="stylesheet">
-    <link href="/inc/css/style-6.3.9.css" rel="stylesheet">
-    <link href="/inc/css/nprogress.css" rel="stylesheet">
-    <link href="/inc/css/jquery-ui.css" rel="stylesheet">
-    <script src="/inc/jquery-1.12.4.js"></script>
-    <script src="/inc/jquery-ui.js"></script>
-    <script src="/inc/js.cookie.min.js"></script>
-    <script src="/inc/script-6.3.9.js"></script>
-    <script src="/inc/nprogress.js"></script>
-    <link href="/inc/css/toastr.css" rel="stylesheet"/>
-    <script src="/inc/toastr.js"></script>
-</head>
-<body>
-    <div class="top-menu">
-        <div class="LogoText">
-                    <span id="logo_text">
-                        <a href="https://roxy-wi.org" title="Roxy-WI site" target="_blank">
-                            <img src="/inc/images/logo_menu.png" alt="logo" width="110" />
-                        </a>
-                    </span>
-        </div>
-        <div id="top-link" class="top-link">
-            <nav id="menu">
-                <ul class="menu">
-                    <li><a href="/app/overview.py" title="Server and service status" class="overview-link">Overview</a></li>
-                </ul>
-            </nav>
-        </div>
-    </div>
-    <div id="cover"></div>
-    <div class="container">
+{% extends "base.html" %}
+{% block content %}
         <h2>
             404 - Page not found
         </h2>
@@ -75,37 +15,6 @@
             <h4>Sorry, but page not found. Try another page</h4>
         </center>
         <div id="oops_div">
-            <img src="/inc/images/oops.png" alt="Oops">
+            <img src="{{ url_for('static', filename='images/oops.png')}}" alt="Oops">
         </div>
-    </div>
-    <div class="footer">
-        <a href="#" id="hide_menu" title="Hide menu" style="float: left;">
-				<span class="ui-state-default ui-corner-all">
-					<span class="ui-icon ui-icon-arrowthick-1-w" id="arrow"></span>
-				</span>
-        </a>
-            <div class="show_menu" style="display: none; float: left;">
-                <a href="#" id="show_menu" title="Show menu">
-					<span class="ui-state-default ui-corner-all">
-						<span class="ui-icon ui-icon-arrowthick-1-e" id="arrow"></span>
-					</span>
-                </a>
-            </div>
-            <div id="logo_footer">
-                <a href="https://roxy-wi.org" title="Roxy-WI official site" target="_blank">
-                    <img src="/inc/images/logo_footer.png" alt="logo" id="logo_footer_img" />
-                </a>
-            </div>
-            <div class="footer-div">
-                <a href="https://roxy-wi.org/cabinet.py" class="footer-link" target="_blank" title="Privet cabinet for donaters">Cabinet</a>
-                <a href="https://github.com/Aidaho12/haproxy-wi/issues" class="footer-link" target="_blank">Help</a>
-                <a href="https://roxy-wi.org/contacts.py" class="footer-link" target="_blank">Contact</a>
-                <a href="https://roxy-wi.org" class="footer-link" target="_blank" title="About Roxy-WI">About</a>
-                <a href="https://roxy-wi.org/cloud.py" class="footer-link" target="_blank" title="Roxy-WI Cloud">Cloud</a>
-            </div>
-        </div>
-        <div id="current-user-groups-dialog" style="display: none;">
-            <div id="current-user-groups-form"></div>
-        </div>
-</body>
-</html>
\ No newline at end of file
+{% endblock %}
diff --git a/app/templates/500.html b/app/templates/500.html
index baae21ed..d67f014d 100644
--- a/app/templates/500.html
+++ b/app/templates/500.html
@@ -1,65 +1,5 @@
-<html lang="en">
-<head>
-    <title>500 - Internal error - Roxy-WI</title>
-    <meta charset="UTF-8">
-    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
-    <meta http-equiv="Pragma" content="no-cache" />
-    <meta http-equiv="Expires" content="0" />
-    <link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" />
-    <link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png">
-    <link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png">
-    <link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png">
-    <link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png">
-    <link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png">
-    <link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png">
-    <link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png">
-    <link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png">
-    <link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png">
-    <link rel="icon" type="image/png" sizes="192x192"  href="/inc/images/favicon/android-icon-192x192.png">
-    <link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png">
-    <link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png">
-    <link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png">
-    <link rel="manifest" href="/inc/images/favicon/manifest.json">
-    <meta name="msapplication-TileColor" content="#ffffff">
-    <meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png">
-    <meta name="theme-color" content="#ffffff">
-    <script>
-        FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };
-    </script>
-    <script defer src="/inc/fa-solid.min.js"></script>
-    <script defer src="/inc/fontawesome.min.js"></script>
-    <script defer src="/inc/ion.sound.min.js"></script>
-    <link href="/inc/css/awesome-6.3.9.css" rel="stylesheet">
-    <link href="/inc/css/style-6.3.9.css" rel="stylesheet">
-    <link href="/inc/css/nprogress.css" rel="stylesheet">
-    <link href="/inc/css/jquery-ui.css" rel="stylesheet">
-    <script src="/inc/jquery-1.12.4.js"></script>
-    <script src="/inc/jquery-ui.js"></script>
-    <script src="/inc/js.cookie.min.js"></script>
-    <script src="/inc/script-6.3.9.js"></script>
-    <script src="/inc/nprogress.js"></script>
-    <link href="/inc/css/toastr-6.3.9.css" rel="stylesheet"/>
-    <script src="/inc/toastr.js"></script>
-</head>
-<body>
-<div class="top-menu">
-    <div class="LogoText">
-                    <span id="logo_text">
-                        <a href="https://roxy-wi.org" title="Roxy-WI site" target="_blank">
-                            <img src="/inc/images/logo_menu.png" alt="logo" width="110" />
-                        </a>
-                    </span>
-    </div>
-    <div id="top-link" class="top-link">
-        <nav id="menu">
-            <ul class="menu">
-                <li><a href="/app/overview.py" title="Server and service status" class="overview-link">Overview</a></li>
-            </ul>
-        </nav>
-    </div>
-</div>
-<div id="cover"></div>
-<div class="container">
+{% extends "base.html" %}
+{% block content %}
     <h2>
         500 - Internal error
     </h2>
@@ -76,39 +16,9 @@
             <a href="https://github.com/Aidaho12/haproxy-wi/issues" title="GitHub issues">create issue on GitHub</a>
             or write <a href="https://t.me/haproxy_wi" title="Roxy-WI chat">to the chat</a>
         </h4>
+        <div>Error: {{e}}</div>
         <div id="oops_div">
-            <img src="/inc/images/oops.png" alt="Oops">
+            <img src="{{ url_for('static', filename='images/oops.png')}}" alt="Oops">
         </div>
     </center>
-</div>
-<div class="footer">
-    <a href="#" id="hide_menu" title="Hide menu" style="float: left;">
-				<span class="ui-state-default ui-corner-all">
-					<span class="ui-icon ui-icon-arrowthick-1-w" id="arrow"></span>
-				</span>
-    </a>
-    <div class="show_menu" style="display: none; float: left;">
-        <a href="#" id="show_menu" title="Show menu">
-					<span class="ui-state-default ui-corner-all">
-						<span class="ui-icon ui-icon-arrowthick-1-e" id="arrow"></span>
-					</span>
-        </a>
-    </div>
-    <div id="logo_footer">
-        <a href="https://roxy-wi.org" title="Roxy-WI official site" target="_blank">
-            <img src="/inc/images/logo_footer.png" alt="logo" id="logo_footer_img" />
-        </a>
-    </div>
-    <div class="footer-div">
-        <a href="https://roxy-wi.org/cabinet.py" class="footer-link" target="_blank" title="Privet cabinet for donaters">Cabinet</a>
-        <a href="https://github.com/Aidaho12/haproxy-wi/issues" class="footer-link" target="_blank">Help</a>
-        <a href="https://roxy-wi.org/contacts.py" class="footer-link" target="_blank">Contact</a>
-        <a href="https://roxy-wi.org" class="footer-link" target="_blank" title="About Roxy-WI">About</a>
-        <a href="https://roxy-wi.org/cloud.py" class="footer-link" target="_blank" title="Roxy-WI Cloud">Cloud</a>
-    </div>
-</div>
-<div id="current-user-groups-dialog" style="display: none;">
-    <div id="current-user-groups-form"></div>
-</div>
-</body>
-</html>
\ No newline at end of file
+{% endblock %}
diff --git a/app/templates/add.html b/app/templates/add.html
index 2c2d3a08..1f88c5d5 100644
--- a/app/templates/add.html
+++ b/app/templates/add.html
@@ -38,7 +38,7 @@
 	<ul id='browse_histroy'></ul>
 	{% include 'include/add_proxy.html' %}
 	<div id="listen">
-		<form name="add-listener" id="add-listener" action="/app/add.py" method="post">
+		<form name="add-listener" id="add-listener" action="/app/add/haproxy/add" method="post">
 			<table class="add-table">
 				<caption><h3>{{lang.words.add|title()}} {{lang.words.listener}}</h3></caption>
 				<tr>
@@ -903,7 +903,7 @@
 		</div>
 	</div>
 	<div id="userlist">
-		<form name="add-userlist" id="add-userlist" action="/app/add.py" method="post">
+		<form name="add-userlist" id="add-userlist" action="/app/add/haproxy/userlist" method="post">
 		<table>
 			<caption><h3>{{lang.words.add|title()}} {{lang.words.userlists}}</h3></caption>
 			<tr>
@@ -996,7 +996,7 @@
 		</div>
 	</div>
 	<div id="peers">
-		<form name="add-peers" id="add-peers" action="/app/add.py" method="post">
+		<form name="add-peers" id="add-peers" action="/app/add/haproxy/peers" method="post">
 		<table>
 			<caption><h3>{{lang.words.add|title()}} Peer</h3></caption>
 			<tr>
diff --git a/app/templates/add_nginx.html b/app/templates/add_nginx.html
index 0bf933e2..ccf31416 100644
--- a/app/templates/add_nginx.html
+++ b/app/templates/add_nginx.html
@@ -14,7 +14,7 @@
 	<ul id='browse_histroy'></ul>
 	{% include 'include/add_nginx_proxy.html' %}
     <div id="upstream">
-        <form name="add-upstream" id="add-upstream" action="/app/add_nginx.py" method="post">
+        <form name="add-upstream" id="add-upstream" action="/app/add/nginx/upstream" method="post">
 			<table class="add-table">
 				<caption><h3>{{lang.words.add|title()}} upstream</h3></caption>
 				<tr>
diff --git a/app/templates/admin.html b/app/templates/admin.html
index 70deee32..c3d13dd9 100644
--- a/app/templates/admin.html
+++ b/app/templates/admin.html
@@ -12,12 +12,10 @@
 		<li><a href="#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups}} - Roxy-WI">{{lang.words.groups|title()}}</a></li>
 		<li><a href="#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers}} - Roxy-WI">{{lang.words.servers|title()}}</a></li>
 		<li><a href="#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds}} - Roxy-WI">SSH {{lang.words.creds}}</a></li>
-		<li><a href="#checker" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Checker - Roxy-WI">Checker</a></li>
 		<li><a href="#openvpn" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} OpenVPN - Roxy-WI" id="admin-tabs-vpn">OpenVPN</a></li>
 		<li><a href="#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings}} - Roxy-WI">{{lang.words.settings|title()}}</a></li>
-		<li><a href="#services" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.services}} - Roxy-WI">{{lang.words.services|title()}}</a></li>
+		<li><a href="#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}} - Roxy-WI">{{lang.words.tools|title()}}</a></li>
 		<li><a href="#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI - Roxy-WI">{{lang.words.w_update|title()}}</a></li>
-		<li><a href="#installmon" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} {{lang.words.service}} {{lang.words.installation}} - Roxy-WI" id="admin-tabs-mon">{{lang.words.monitoring|title()}} {{lang.words.installation}}</a></li>
 		<li><a href="#backup" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.backup|title()}} {{lang.words.configs}} - Roxy-WI" id="admin-tabs-backup">{{lang.words.backup|title()}}</a></li>
 	</ul>
 	<div id="users">
@@ -76,8 +74,6 @@
 	<div id="ssh">
 		{% include 'include/admin_ssh.html' %}
 	</div>
-	
-	<div id="checker"></div>
 
 	<div id="openvpn"></div>
 	
@@ -85,7 +81,7 @@
 		{% include 'include/admin_settings.html' %}
 	</div>
 	
-	<div id="services">
+	<div id="tools">
 		<table id="services_table" class="overview">
 			<thead>
 				<tr class="overviewHead">
@@ -134,9 +130,6 @@
 		<div id="ajax-update"></div>
 	</div>
 
-	<div id="installmon">
-		{% include 'include/mon_installation.html' %}
-	</div>
 	<div id="backup">
 		{% include 'include/admin_backup.html' %}
 	</div>
diff --git a/app/templates/ajax/check_version.html b/app/templates/ajax/check_version.html
index f9e61871..08a574f4 100644
--- a/app/templates/ajax/check_version.html
+++ b/app/templates/ajax/check_version.html
@@ -10,9 +10,9 @@
 		<span id="show-updates-button" class="new-version-exists">v{{current_ver}}</span>
 		<script defer src="/inc/fontawesome.min.js"></script>
 	{%- else %}
-		<a href="/app/users.py#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a>
+		<a href="/app/admin#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a>
 	{%- endif %}
 	</a>
 {%- else %}
-	<a href="/app/users.py#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a>
+	<a href="/app/admin#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a>
 {% endif -%}
diff --git a/app/templates/ajax/config_show.html b/app/templates/ajax/config_show.html
index 1a16e4a2..807db6c3 100644
--- a/app/templates/ajax/config_show.html
+++ b/app/templates/ajax/config_show.html
@@ -4,11 +4,13 @@
 		<p class="accordion-expand-holder">
 			{% if role <= 3 %}
 				{% if not is_serv_protected or role <= 2 %}
-				<a class="ui-button ui-widget ui-corner-all" title="Edit this run config" id="edit_link" href="config.py?service={{service}}&serv={{serv}}&open=open&config_file_name={{config_file_name}}">{{lang.words.edit|title()}}</a>
+				{% if not configver %}
+				<a class="ui-button ui-widget ui-corner-all" title="Edit this run config" id="edit_link" href="/app/config/{{service}}/{{serv}}/edit/{{config_file_name}}">{{lang.words.edit|title()}}</a>
+				{% endif %}
 				{% if service == 'haproxy' %}
-				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} {{lang.words.proxy}}" href="add.py#proxy">{{lang.words.add|title()}}</a>
+				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} {{lang.words.proxy}}" href="/app/add/haproxy#proxy">{{lang.words.add|title()}}</a>
 				{% elif service == 'keepalived' %}
-				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} VRRP" href="ha.py">{{lang.words.add|title()}}</a>
+				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} VRRP" href="/app/ha">{{lang.words.add|title()}}</a>
 				{% endif %}
 				{% endif %}
 			{% endif %}
@@ -209,7 +211,7 @@
 					{% if role %}
 						{% if service != 'keepalived' %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}</a>
 						</span>
 						{% endif %}
 					{% endif %}
@@ -220,7 +222,7 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-						<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}</a>
+						<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}</a>
 						</span>
 					{% endif %}
 					</span><div>
@@ -230,12 +232,12 @@
 				</div><span class="param">{{- line -}}
 					{% if role %}
 					<span class="accordion-link">
-						<a href="/app/sections.py?serv={{serv}}&section={{ line }}" target="_blank">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+						<a href="/app/config/section/haproxy/{{serv}}/{{ line }}" target="_blank">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 					</span>
 					{% endif %}
 					{%- set backend = line.split(' ') -%}
 					<span class="accordion-link">
-						<a href="/app/statsview.py?service=haproxy&serv={{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a>
+						<a href="/app/stats/haproxy/{{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a>
 					</span>
 					{%- set backend = backend|join('_') -%}
 					{%- do section_name.update({i: backend}) -%}
@@ -247,12 +249,12 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 						</span>
 					{% endif %}
 					{% set backend = line.split(' ') %}
 					<span class="accordion-link">
-						<a href="/app/statsview.py?serv={{serv}}#{{ backend[1]}}" target="_blank">{{lang.words.stats|title()}}</a>
+						<a href="/app/stats/haproxy/{{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a>
 					</span>
 					{% set backend = backend|join('_') %}
 					{% do section_name.update({i: backend}) %}
@@ -264,12 +266,12 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 						</span>
 					{% endif %}
 					{% set backend = line.split(' ') %}
 					<span class="accordion-link">
-						<a href="/app/statsview.py?serv={{serv}}#{{ backend[1]}}" target="_blank">{{lang.words.stats|title()}}</a>
+						<a href="/app/stats/haproxy/{{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a>
 					</span>
 					</span><div>
 				{% continue %}
@@ -278,7 +280,7 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 						</span>
 					{% endif %}
 				</span><div>
@@ -288,7 +290,7 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 						</span>
 					{% endif %}
 				</span><div>
@@ -298,7 +300,7 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 						</span>
 					{% endif %}
 				</span><div>
@@ -308,7 +310,7 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 						</span>
 					{% endif %}
 				</span><div>
@@ -318,7 +320,7 @@
 				</div><span class="param">{{ line }}
 					{% if role %}
 						<span class="accordion-link">
-							<a href="/app/sections.py?serv={{serv}}&section={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
+							<a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a>
 						</span>
 					{% endif %}
 				</span><div>
@@ -366,8 +368,9 @@
 	<br>
 		{% if role <= 3 %}
 		{% if not is_serv_protected or role <= 2 %}
-		<form action="versions.py?service={{service}}" method="post" class="left-space">
+		<form action="/app/config/versions/{{service}}/{{serv}}/{{configver}}/save" method="post" class="left-space">
 			<input type="hidden" value="{{serv}}" name="serv">
+			<input type="hidden" value="{{service}}" name="service">
 			<input type="hidden" value="{{configver}}" name="configver">
 			<input type="hidden" value="1" name="config">
 			<button type='submit' value='save' name='save' class='btn btn-default' title="{{lang.phrases.save_title}}">{{lang.words.save|title()}}</button>
diff --git a/app/templates/ajax/firewall_rules.html b/app/templates/ajax/firewall_rules.html
index 04f51c59..950c2601 100644
--- a/app/templates/ajax/firewall_rules.html
+++ b/app/templates/ajax/firewall_rules.html
@@ -18,7 +18,7 @@
     </ul>
     <div id="input">
         <table class="overview">
-           {{thead}}
+           {{thead|safe}}
             <tbody>
             {% for p in input_chain %}
             <tr class="{{ loop.cycle('odd', 'even') }}">
@@ -47,7 +47,7 @@
     </div>
     <div id="IN_public_allow">
         <table class="overview">
-            {{thead}}
+            {{thead|safe}}
             <tbody>
             {% for p in IN_public_allow %}
             <tr class="{{ loop.cycle('odd', 'even') }}">
@@ -76,7 +76,7 @@
     </div>
     <div id="output">
         <table class="overview">
-            {{thead}}
+            {{thead|safe}}
             <tbody>
             {% for p in output_chain %}
             <tr class="{{ loop.cycle('odd', 'even') }}">
diff --git a/app/templates/ajax/haproxyservers_backends.html b/app/templates/ajax/haproxyservers_backends.html
index 2252e8fa..8dfe51b2 100644
--- a/app/templates/ajax/haproxyservers_backends.html
+++ b/app/templates/ajax/haproxyservers_backends.html
@@ -1,3 +1,5 @@
+{% import 'languages/'+lang|default('en')+'.html' as lang %}
+{% from 'languages/languages.html' import languages %}
 <style>
 	.div-backends {
 		height: auto !important;
@@ -11,17 +13,17 @@
 	{% endif %}
 	{% for b in backends %}
 		{% if service == 'haproxy' %}
-		<a href="/app/sections.py?serv={{ serv}}&section={{b}}" title="Edit backend {{b}}" target="_blank" style="padding-right: 10px;">
+		<a href="/app/config/section/{{serv}}/{{b}}" title="{{lang.words.edit|title()}} {{lang.words.backend}} {{b}}" target="_blank" style="padding-right: 10px;">
 			{{b}}
 		</a>
 		{% elif service == 'nginx' or service == 'apache' %}
 			{% set full_file = b.split(' ')[0] | replace ('/', '92') %}
 			{% set full_file = full_file.replace(':', '') %}
-			<a href="/app/config.py?service={{ service }}&serv={{serv}}&open=open&config_file_name={{full_file}}" title="Edit config {{b.split(' ')[0]}}" target="_blank" style="padding-right: 10px;">
+			<a href="/app/config/{{ service }}/{{serv}}/{{full_file}}" title="{{lang.words.edit|title()}} {{lang.words.config}} {{b.split(' ')[0]}}" target="_blank" style="padding-right: 10px;">
 				{{b.split(' ')[1] | replace(';', '')}}
 			</a>
 		{% else %}
 			{{b}}
 		{% endif %}
 	{% endfor %}
-{% endif %}
\ No newline at end of file
+{% endif %}
diff --git a/app/templates/ajax/load_telegram.html b/app/templates/ajax/load_telegram.html
index fa73f1bc..67fcfd08 100644
--- a/app/templates/ajax/load_telegram.html
+++ b/app/templates/ajax/load_telegram.html
@@ -34,7 +34,7 @@
                     {{lang.words.token|title()}}
                 </td>
                 <td style="width: 20%;">{{lang.words.channel|title()}}</td>
-                {% if page != "servers.py" %}
+                {% if role|int() == 1 %}
                 <td style="width: 25%;">{{lang.words.group|title()}}</td>
                 {% endif %}
                 <td style="width: 100%;"></td>
@@ -51,7 +51,7 @@
                     {% set id = 'telegram-chanel-' + telegram.id|string() %}
                     {{ input(id, value=telegram.chanel_name, size='30') }}
                 </td>
-                {% if page != "servers.py" %}
+                {% if role|int() == 1 %}
                 <td>
                     <select id="telegramgroup-{{telegram.id}}" name="telegramgroup-{{telegram.id}}">
                         <option disabled selected>------</option>
@@ -86,7 +86,7 @@
                     <span title="Token that has given with APP registration">{{lang.words.token|title()}}</span>
                 </td>
                 <td style="width: 20%;">{{lang.words.channel|title()}}</td>
-                {% if page != "servers.py" %}
+                {% if role|int() == 1 %}
                 <td style="width: 25%;">{{lang.words.group|title()}}</td>
                 {% endif %}
                 <td style="width: 100%;"></td>
@@ -103,7 +103,7 @@
                     {% set id = 'slack-chanel-' + slack.id|string() %}
                     {{ input(id, value=slack.chanel_name, size='30') }}
                 </td>
-                {% if page != "servers.py" %}
+                {% if role|int() == 1 %}
                 <td>
                     <select id="slackgroup-{{slack.id}}" name="slackgroup-{{slack.id}}">
                         <option disabled selected>------</option>
@@ -138,7 +138,7 @@
                     {{lang.words.key|title()}}
                 </td>
                 <td style="width: 20%;">{{lang.words.name|title()}}</td>
-                {% if page != "servers.py" %}
+                {% if role|int() == 1 %}
                 <td style="width: 25%;">{{lang.words.group|title()}}</td>
                 {% endif %}
                 <td style="width: 100%;"></td>
@@ -155,7 +155,7 @@
                     {% set id = 'pd-chanel-' + pd.id|string() %}
                     {{ input(id, value=pd.chanel_name, size='30') }}
                 </td>
-                {% if page != "servers.py" %}
+                {% if role|int() == 1 %}
                 <td>
                     <select id="pdgroup-{{pd.id}}" name="pdgroup-{{pd.id}}">
                         <option disabled selected>------</option>
@@ -212,9 +212,9 @@
             <caption><i class="fas fa-network-wired caption-icon"></i><h3>HAProxy {{lang.words.servers}}</h3></caption>
             <tr class="overviewHead">
                 <td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td>
                 <td class="checkbox-head" style="width: 10%;" title="{{lang.words.alert|title()}} {{lang.words.via}} {{lang.words.email}}">{{lang.words.email|title()}}</td>
                 <td class="checkbox-head" style="width: 10%;" title="{{lang.phrases.alert_service_change_status}}">{{lang.words.service|title()}}</td>
                 <td class="checkbox-head" style="width: 10%;" title="{{lang.phrases.alert_backend_change_status}}">{{lang.words.backend|title()}}</td>
@@ -304,9 +304,9 @@
             <caption><i class="fas fa-sitemap caption-icon"></i><h3>NGINX {{lang.words.servers}}</h3></caption>
             <tr class="overviewHead">
                 <td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td>
                 <td class="checkbox-head" style="width: 10%;" title="{{lang.words.alert|title()}} {{lang.words.via}} {{lang.words.email}}">{{lang.words.email|title()}}</td>
                 <td class="checkbox-head" style="width: 100%;" title={{lang.phrases.alert_service_change_status}}>{{lang.words.service|title()}}</td>
                 <td><span onclick="loadchecker(1)" class="refresh" title="{{lang.words.refresh2|title()}}"></span></td>
@@ -378,9 +378,9 @@
             <caption><i class="fas fa-feather-alt caption-icon"></i><h3>Apache {{lang.words.servers}}</h3></caption>
             <tr class="overviewHead">
                 <td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td>
                 <td class="checkbox-head" style="width: 10%;">{{lang.words.email|title()}}</td>
                 <td class="checkbox-head" style="width: 100%;" title="{{lang.phrases.alert_service_change_status}}">{{lang.words.service|title()}}</td>
                 <td><span onclick="loadchecker(1)" class="refresh" title="{{lang.words.refresh2|title()}}"></span></td>
@@ -452,9 +452,9 @@
             <caption><i class="fas fa-cloud caption-icon"></i><h3>Keepalived {{lang.words.servers}}</h3></caption>
             <tr class="overviewHead">
                 <td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td>
-                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td>
+                <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td>
                 <td class="checkbox-head" style="width: 10%;">{{lang.words.email|title()}}</td>
                 <td class="checkbox-head" style="width: 10%;" title="{{lang.phrases.alert_service_change_status}}">{{lang.words.service|title()}}</td>
                 <td class="checkbox-head" style="width: 100%;" title="{{lang.phrases.alert_master_backup}}">{{lang.words.status|title()}}</td>
@@ -537,3 +537,4 @@
 {% endif %}
 {% endfor %}
 {% endif %}
+{% include 'include/admins_dialogs.html' %}
diff --git a/app/templates/ajax/new_option.html b/app/templates/ajax/new_option.html
index 821f089e..2aa0ac3d 100644
--- a/app/templates/ajax/new_option.html
+++ b/app/templates/ajax/new_option.html
@@ -3,7 +3,7 @@
 		<td class="padding10 first-collumn">
 			{{ option.id }}
 		</td>
-		<td class="first-collumn" style="width: 77%;">
+		<td class="padding10 first-collumn" style="width: 77%;">
 			<input type="text" id="option-body-{{option.id}}" class="form-control" value="{{option.options}}" size="60">
 		</td>
 		<td>
diff --git a/app/templates/ajax/new_saved_servers.html b/app/templates/ajax/new_saved_servers.html
index 33d0f4be..38883840 100644
--- a/app/templates/ajax/new_saved_servers.html
+++ b/app/templates/ajax/new_saved_servers.html
@@ -3,7 +3,7 @@
 		<td class="padding10 first-collumn">
 			<input type="text" id="servers-ip-{{s.id}}" class="form-control" value="{{s.server}}" size="15">
 		</td>
-		<td class="first-collumn" style="width: 77%;">
+		<td class="padding10 first-collumn" style="width: 77%;">
 			<input type="text" id="servers-desc-{{s.id}}" class="form-control" value="{{s.description}}" size="50">
 		</td>
 		<td>
diff --git a/app/templates/ajax/overivewWaf.html b/app/templates/ajax/overivewWaf.html
index 2eed0d45..8191b108 100644
--- a/app/templates/ajax/overivewWaf.html
+++ b/app/templates/ajax/overivewWaf.html
@@ -16,9 +16,7 @@
 		{% else %}
 		<span class="serverDown server-status" title="WAF {{lang.words.is}} {{lang.words.stopped}} "></span>
 		{% endif %}
-		<a href="/app/logs.py?serv={{ service.1 }}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00&waf=1" title="{{lang.words.view|title()}} {{service.0 }}'s WAF {{lang.words.logs}}" class="logs_link">
 			{{ service.0 }}
-		</a>
 	{% else %}
 		<span class="serverNone server-status" title="WAF {{lang.words.is}} {{lang.words.not}} {{lang.words.installed}}"></span> <span title="WAF {{lang.words.is}} {{lang.words.not}} {{lang.words.installed}}">{{ service.0 }}</span>
 	{% endif %}
@@ -70,14 +68,14 @@
 		{% endif %}
 		<td>
 		{% if role <= 2 %}
-			<a href="/app/waf.py?service={{waf_service}}&manage_rules=1&serv={{service.1}}" class="ui-button ui-widget ui-corner-all">{{lang.words.open|title()}}</a>
+			<a href="/app/waf/{{waf_service}}/{{service.1}}/rules" class="ui-button ui-widget ui-corner-all">{{lang.words.open|title()}}</a>
 		{% endif %}
 		</td>
 		<td>
 			{% if waf_service == 'haproxy' %}
-			<a href="/app/logs.py?service={{waf_service}}&serv={{ service.1 }}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00&waf=1" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a>
+			<a href="/app/logs/{{waf_service}}/waf/{{ service.1 }}" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a>
 			{% elif waf_service == 'nginx' %}
-			<a href="/app/logs.py?service={{waf_service}}&serv={{ service.1 }}&rows=10&grep=ModSecurity&hour=00&minut=00&hour1=24&minut1=00&file=error.log&waf=0" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a>
+			<a href="/app/logs/{{waf_service}}/?serv={{ service.1 }}&rows=100&grep=ModSecurity&hour=00&minute=00&hour1=24&minute1=00&file=error.log&waf=0" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a>
 			{% endif %}
 		</td>
 		<td></td>
diff --git a/app/templates/ajax/overview.html b/app/templates/ajax/overview.html
index 665e8746..0804ec07 100644
--- a/app/templates/ajax/overview.html
+++ b/app/templates/ajax/overview.html
@@ -1,7 +1,7 @@
 {% import 'languages/'+lang|default('en')+'.html' as lang %}
 {% for service in service_status %}
 	<td class="padding10 first-collumn">
-		<a href="/app/history.py?service=server&serv={{ service.1 }}" title="{{service.0 }} history" class="logs_link">
+		<a href="/app/history/server/{{ service.1 }}" title="{{service.0 }} history" class="logs_link">
 			{{ service.0 }}
 		</a>
 	</td>
diff --git a/app/templates/ajax/overviewServers.html b/app/templates/ajax/overviewServers.html
index aeeb32d4..24a0ecbf 100644
--- a/app/templates/ajax/overviewServers.html
+++ b/app/templates/ajax/overviewServers.html
@@ -31,4 +31,4 @@
 			</div>	
 	</div>		
 </div>
-{% endfor %}
\ No newline at end of file
+{% endfor %}
diff --git a/app/templates/ajax/provisioning/aws_edit_dialog.html b/app/templates/ajax/provisioning/aws_edit_dialog.html
deleted file mode 100644
index 7eb61ddf..00000000
--- a/app/templates/ajax/provisioning/aws_edit_dialog.html
+++ /dev/null
@@ -1,167 +0,0 @@
-{% import 'languages/'+lang|default('en')+'.html' as lang %}
-{% from 'include/input_macros.html' import input, select, checkbox %}
-{% from 'include/provisioning/variables.html' import generate_opt_options, get_nice_name  %}
-{% for s in server %}
-<div id="aws_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview provisioning_table">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td colspan="2" class="headers">
-                <b>General information</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Server name
-            </td>
-            <td>
-                <span id="aws_edit_server_name">{{s.name}}</span>
-            </td>
-        </tr>
-            {{input('aws_edit_group', value=s.group_id, type='hidden')}}
-            {{input('aws_edit_id', value=s.id, type='hidden')}}
-        <tr>
-            <td class="padding20">
-                Provider credentials
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="aws_edit_id_provider">
-                {% for p in providers %}
-                    {% if p.2 == 'aws' %}
-                        {% if s.provider_id|int() == p.id|int() %}
-                        <option value="{{ p.id }}" selected>{{ p.name }}</option>
-                        {% else %}
-                        <option value="{{ p.id }}">{{ p.name }}</option>
-                        {% endif %}
-                    {% endif %}
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Region
-            </td>
-            <td>
-                <span id="aws_edit_region" style="display: none;">{{s.region}}</span>
-                {% set id = 'aws_edit_region-'+s.id|string() %}
-                {{get_nice_name(id, s.region, 'aws', 'region', params)}}
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Instance</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Instance type
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('aws_edit_size', size='26', value=s.instance_type)}}
-                <div class="tooltip tooltipTop tooltipTd">
-                    Instance types list is <a href="https://aws.amazon.com/ec2/instance-types/" title="Instance types list" target="_blank">here</a>
-                </div>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                OS
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('aws_edit_oss', 'aws', 'image', params, first=s.os) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                SSH key pair name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('aws_edit_ssh_name', size='26', value=s.ssh_key_name)}}
-                <div class="tooltip tooltipTop tooltipTd">The SSH key must exist in the region where the instance is being edited</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Volume</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Volume size
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('aws_edit_volume_size', size='26', value=s.volume_size, type='number')}}Gb
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Volume type
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('aws_edit_volume_type', 'aws', 'volume_type', params, first=s.volume_type) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">Delete on termination</td>
-            <td>
-                {% set checked='checked' %}
-                {% if s.delete_on_termination == 'false' %}
-                    {% set checked='' %}
-                {% endif %}
-                {{checkbox('aws_edit_delete_on_termination', checked=checked)}}
-                <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Network</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">Public IP</td>
-            <td>
-                <select id="aws_edit_public_ip">
-                    {% if s.public_ip == 'true' %}
-                    <option value="public" selected>Public IP</option>
-                    {% else %}
-                    <option value="public">Public IP</option>
-                    {% endif %}
-                    {% if s.floating_ip == 'true' %}
-                    <option value="elastic" selected>Elastic IP</option>
-                    {% else %}
-                    <option value="elastic">Elastic IP</option>
-                    {% endif %}
-                    {% if s.public_ip == 'false' and s.floating_ip == 'false' %}
-                    <option value="none" selected>None</option>
-                    {% else %}
-                    <option value="none">None</option>
-                    {% endif %}
-                </select>
-            </td>
-        </tr>
-        <tr>
-            {% set checked='checked' %}
-            {% if s.firewall == 'false' %}
-                {% set checked='' %}
-            {% endif %}
-            <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
-            <td>
-                {{checkbox('aws_edit_firewall', checked=checked)}}
-                <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise, all ports will be closed</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2">
-                <p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p>
-            </td>
-        </tr>
-    </table>
-</div>
-{% endfor %}
diff --git a/app/templates/ajax/provisioning/do_edit_dialog.html b/app/templates/ajax/provisioning/do_edit_dialog.html
deleted file mode 100644
index f0c04fbb..00000000
--- a/app/templates/ajax/provisioning/do_edit_dialog.html
+++ /dev/null
@@ -1,190 +0,0 @@
-{% import 'languages/'+lang|default('en')+'.html' as lang %}
-{% from 'include/input_macros.html' import input, select, checkbox %}
-{% from 'include/provisioning/variables.html' import get_nice_name, generate_opt_options  %}
-{% for s in server %}
-{% set region_name = [] %}
-<div id="do_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview provisioning_table">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td colspan="2" class="headers">
-                <b>General information</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Server name
-            </td>
-            <td>
-                <span id="do_edit_server_name">{{s.name}}</span>
-            </td>
-        </tr>
-            {{input('do_edit_group', value=s.group_id, type='hidden')}}
-            {{input('do_edit_id', value=s.id, type='hidden')}}
-        <tr>
-            <td class="padding20">
-                Provider credentials
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="do_edit_id_provider">
-                {% for p in providers %}
-                    {% if p.type == 'do' %}
-                        {% if s.provider_id|int() == p.id|int() %}
-                        <option value="{{ p.id }}" selected>{{ p.name }}</option>
-                        {% else %}
-                        <option value="{{ p.id }}">{{ p.name }}</option>
-                        {% endif %}
-                    {% endif %}
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Region
-            </td>
-            <td>
-                {% set id = 'do_edit_regions-' + id|string() %}
-                {{ get_nice_name(id, 'do', 'region', params) }}
-                <span id="do_edit_regions" style="display: none;">{{s.region}}</span>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Instance</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Size
-                <span class="need-field">*</span>
-            </td>
-            <td>{{ generate_opt_options('do_edit_size', 'do', 'size', params, first=s.instance_type) }}</td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                OS
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('do_edit_oss', 'do', 'image', params, first=s.os) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                SSH
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="do_edit_ssh_choose">
-                    {% if s.ssh_key_name != none %}
-                    <option value="ssh_name" selected>Set SSH key name</option>
-                    {% else %}
-                    <option value="ssh_name">Set SSH key name</option>
-                    {% endif %}
-                    {% if s.ssh_ids != none %}
-                    <option value="ssh_ids" selected>Set SSH key ids</option>
-                    {% else %}
-                    <option value="ssh_ids">Set SSH key ids</option>
-                    {% endif %}
-                </select>
-            </td>
-        </tr>
-        <tr id="do_edit_ssh_ids_tr" {% if s.ssh_ids == none %}style="display: none;"{% endif %}>
-            <td class="padding20 padding-top20">
-                SSH key ids
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('do_edit_ssh_ids', size='30', value=s.ssh_ids)}}
-                <div class="tooltip tooltipTop tooltipTd">List comma separated. Required if SSH key name is empty</div>
-            </td>
-        </tr>
-        <tr id="do_edit_ssh_name_tr" {% if s.ssh_key_name is none %}style="display: none;"{% endif %}>
-            <td class="padding20 padding-top20">
-                SSH key name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('do_edit_ssh_name', size='30', value=s.ssh_key_name)}}
-                <div class="tooltip tooltipTop tooltipTd">Required if SSH key ids is empty</div>
-            </td>
-        </tr>
-        <tr>
-            {% set checked='checked' %}
-            {% if s.monitoring == 0 %}
-                {% set checked='' %}
-            {% endif %}
-            <td class="padding20">Monitoring</td>
-            <td>
-                {{checkbox('do_edit_monitoring', checked=checked)}}
-            </td>
-        </tr>
-        <tr>
-            {% set checked='checked' %}
-            {% if s.backup == 0 %}
-                {% set checked='' %}
-            {% endif %}
-            <td class="padding20">Backup</td>
-            <td>
-                {{checkbox('do_edit_backup', checked=checked)}}
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Network</b>
-            </td>
-        </tr>
-        <tr>
-            {% set checked='checked' %}
-            {% if s.private_networking == 0 %}
-                {% set checked='' %}
-            {% endif %}
-            <td class="padding20">Private IP</td>
-            <td>
-                {{checkbox('do_edit_private_networking', checked=checked)}}
-            </td>
-        </tr>
-        <tr>
-            {% set checked='checked' %}
-            {% if s.floating_ip == 0 %}
-                {% set checked='' %}
-            {% endif %}
-            <td class="padding20">Floating Ip</td>
-            <td>
-                {{checkbox('do_edit_floating_ip', checked=checked)}}
-            </td>
-        </tr>
-        <tr>
-            {% set checked='checked' %}
-            {% if s.firewall == 0 %}
-                {% set checked='' %}
-            {% endif %}
-            <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
-            <td>
-                {{checkbox('do_edit_firewall', checked=checked)}}
-                <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2">
-                <p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p>
-            </td>
-        </tr>
-    </table>
-    <script>
-    $( function() {
-        $('#do_edit_ssh_choose').on('selectmenuchange', function (){
-            if ($('#do_edit_ssh_choose option:selected').val() == 'ssh_name') {
-                $('#do_edit_ssh_name_tr').show();
-                $('#do_edit_ssh_ids_tr').hide();
-            } else if ($('#do_edit_ssh_choose option:selected').val() == 'ssh_ids') {
-                $('#do_edit_ssh_name_tr').hide();
-                $('#do_edit_ssh_ids_tr').show();
-            }
-        });
-    });
-    </script>
-</div>
-{% endfor %}
diff --git a/app/templates/ajax/provisioning/gcore_edit_dialog.html b/app/templates/ajax/provisioning/gcore_edit_dialog.html
deleted file mode 100644
index 839356db..00000000
--- a/app/templates/ajax/provisioning/gcore_edit_dialog.html
+++ /dev/null
@@ -1,192 +0,0 @@
-{% import 'languages/'+lang|default('en')+'.html' as lang %}
-{% from 'include/input_macros.html' import input, select, checkbox %}
-{% from 'include/provisioning/variables.html' import generate_opt_options, get_nice_name  %}
-{% for s in server %}
-{% set region_name = [] %}
-{% set os_nice_name = [] %}
-<div id="gcore_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview provisioning_table">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td colspan="2" class="headers">
-                <b>General information</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Server name
-            </td>
-            <td>
-                <span id="gcore_edit_server_name">{{s.name}}</span>({{s.name_template}})
-            </td>
-        </tr>
-            {{input('gcore_edit_group', value=s.group_id, type='hidden')}}
-            {{input('gcore_edit_id', value=s.id, type='hidden')}}
-        <tr>
-            <td class="padding20">
-                Provider credentials
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="gcore_edit_id_provider">
-                {% for p in providers %}
-                    {% if p.type == 'gcore' %}
-                        {% if s.provider_id|int() == p.id|int() %}
-                        <option value="{{ p.id }}" selected>{{ p.name }}</option>
-                        {% else %}
-                        <option value="{{ p.id }}">{{ p.name }}</option>
-                        {% endif %}
-                    {% endif %}
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Region
-            </td>
-            <td>
-                <span id="gcore_edit_region" style="display: none;">{{s.region}}</span>
-                {% set id = 'gcore_edit_region-'+s.id|string() %}
-                {{get_nice_name(id, s.region, 'gcore', 'region', params)}}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Project name
-            </td>
-            <td>
-                <span id="gcore_edit_project_name">{{s.project}}</span>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Instance</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Flavor
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('gcore_edit_size', 'gcore', 'size', params, first=s.instance_type) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                OS
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <span id="gcore_edit_oss" style="display: none;">{{s.os}}</span>
-                {% set id = 'gcore_edit_oss-'+s.id|string() %}
-                {{get_nice_name(id, s.os, 'gcore', 'image', params)}}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                SSH key pair name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('gcore_edit_ssh_name', size='26', value=s.ssh_key_name)}}
-                <div class="tooltip tooltipTop tooltipTd">The SSH key must exist in the region where the instance is being edited</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Volume</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Volume size
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('gcore_edit_volume_size', size='26', value=s.volume_size, type='number')}}Gb
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Volume type
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('gcore_edit_volume_type', 'gcore', 'volume_type', params, first=s.volume_type) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">Delete on termination</td>
-            <td>
-                {% set checked='checked' %}
-                {% if s.delete_on_termination == 'false' %}
-                    {% set checked='' %}
-                {% endif %}
-                {{checkbox('gcore_edit_delete_on_termination', checked=checked)}}
-                <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div>
-            </td>
-        </tr>
-         <tr>
-            <td colspan="2" class="headers">
-                <b>Network</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">Network Type</td>
-            <td>
-                <select id="gcore_edit_network_type">
-                    {% if s.public_ip == 1 %}
-                    <option value="external" selected>External IP</option>
-                    {% else %}
-                    <option value="external">External IP</option>
-                    {% endif %}
-                    {% if s.public_ip == 0 %}
-                    <option value="any_subnet" selected>Custom network</option>
-                    {% set style = 'display: table-row;' %}
-                    {% else %}
-                    <option value="any_subnet">Custom network</option>
-                    {% set style = 'display: none;' %}
-                    {% endif %}
-                </select>
-            </td>
-        </tr>
-        <tr id="gcore_edit_any_subnet" style="{{style}}">
-            <td class="padding20">
-                Network name
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_edit_network_name', size='26', value=s.network_name)}}</td>
-        </tr>
-        <tr>
-            {% set checked='checked' %}
-            {% if s.firewall == 'false' %}
-                {% set checked='' %}
-            {% endif %}
-            <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
-            <td>
-                {{checkbox('gcore_edit_firewall', checked=checked)}}
-                <div class="tooltip tooltipTop tooltipTd">Roxy-WI will edit Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2">
-                <p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p>
-            </td>
-        </tr>
-    </table>
-</div>
-<script>
-$( function() {
-    // $('select').selectmenu();
-    $('#gcore_edit_network_type').on('selectmenuchange', function (){
-    	if ($('#gcore_edit_network_type option:selected').val() == 'any_subnet') {
-    		$('#gcore_edit_any_subnet').show();
-		} else if ($('#gcore_edit_network_type option:selected').val() == 'external') {
-    		$('#gcore_edit_any_subnet').hide();
-		}
-	});
-});
-</script>
-{% endfor %}
diff --git a/app/templates/ajax/provisioning/providers.html b/app/templates/ajax/provisioning/providers.html
deleted file mode 100644
index 5b383908..00000000
--- a/app/templates/ajax/provisioning/providers.html
+++ /dev/null
@@ -1,44 +0,0 @@
-{% from 'include/provisioning/variables.html' import get_nice_name %}
-{% for p in providers %}
-<tr id="provider-{{p.id}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newprovider{% endif %}">
-    <td class="padding10 first-collumn"><span id="provider-name-{{p.id}}">{{p.name}}</span></td>
-    <td style="width: 10%">
-        <span id="provider-type-{{p.id}}">
-            {% set id = "provider-type-nice-" + id|string() %}
-            {{ get_nice_name(id, p.type, p.type, 'provider', params) }}
-        {% if p.type == 'do' %}
-            {% set onclickEditAction = 'editDoProvider' %}
-        {% elif p.type == 'aws' %}
-            {% set onclickEditAction = 'editAwsProvider' %}
-        {% elif p.type == 'gcore' %}
-            {% set onclickEditAction = 'editGcoreProvider' %}
-        {% endif %}
-        </span>
-    </td>
-    {% if role == 1 %}
-    <td style="width: 10%">
-        {% for g in groups %}
-            {% if adding %}
-            {% if user_group|int() == g.group_id|int() %}
-		        <span id="provider-group-{{p.id}}">{{ g.name }}</span>
-            {% endif %}
-            {% else %}
-            {% if p.group|int() == g.group_id|int() %}
-		        <span id="provider-group-{{p.id}}">{{ g.name }}</span>
-            {% endif %}
-            {% endif %}
-        {% endfor %}
-    </td>
-    {% else %}
-        <span id="provider-group-{{p.id}}" style="display: none;">user_group</span>
-    {% endif %}
-    <td id="provider-created-date-{{p.id}}" style="width: 15%">{{p.create_date}}</td>
-    <td id="provider-edited-date-{{p.id}}" style="width: 100%">{{p.edit_date}}</td>
-    <td>
-	    <a class="edit" onclick="{{onclickEditAction}}({{p.id}})" title="Edit provider {{p.name}}" style="cursor: pointer;"></a>
-	</td>
-	<td>
-	    <a class="delete" onclick="confirmDeleteProvider({{p.id}})" title="Delete provider {{p.name}}" style="cursor: pointer;"></a>
-	</td>
-</tr>
-{% endfor %}
diff --git a/app/templates/ajax/provisioning/provisioned_servers.html b/app/templates/ajax/provisioning/provisioned_servers.html
deleted file mode 100644
index 5f29b25f..00000000
--- a/app/templates/ajax/provisioning/provisioned_servers.html
+++ /dev/null
@@ -1,84 +0,0 @@
-{% from 'include/provisioning/variables.html' import get_nice_name %}
-{% from 'include/input_macros.html' import copy_to_clipboard %}
-{% for s in servers %}
-    {% if s.type == 'do' %}
-        {% set onclickEditAction = 'editDoServer' %}
-    {% elif s.type == 'aws' %}
-        {% set onclickEditAction = 'editAwsServer' %}
-    {% elif s.type == 'gcore' %}
-        {% set onclickEditAction = 'editGcoreServer' %}
-    {% endif %}
-<tr id="server-{{s.id}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newserver{% endif %}">
-    <td class="padding10 first-collumn">
-        <span id="server-name-{{s.id}}">{{s.name}}</span>
-        {% if s.type == 'gcore' and s.name_template is defined %}
-            ({{s.name_template}})
-        {% endif %}
-    </td>
-    <td style="width: 10%">
-        {% for p in providers %}
-            {% if p.id|int() == s.provider_id|int() %}
-		        <span>{{ p.name }}</span>
-                <span id="server-provider-{{s.id}}" style="display: none;">{{p.id}}</span>
-            {% endif %}
-        {% endfor %}
-     </td>
-    {% if role == 1 %}
-     <td style="width: 5%">
-        {% for g in groups %}
-            {% if adding %}
-                {% if user_group|int() == g.group_id|int() %}
-                    {{ g.name }}
-                    <span id="server-group-{{s.id}}" style="display: none;">{{ g.group_id }}</span>
-                {% endif %}
-            {% else %}
-                {% if s.group_id|int() == g.group_id|int() %}
-                    {{ g.name }}
-                    <span id="server-group-{{s.id}}" style="display: none;">{{ g.group_id }}</span>
-                {% endif %}
-            {% endif %}
-        {% endfor %}
-     </td>
-     {% endif %}
-    <td style="width: 10%">
-        {% if role != 1 %}
-        <span id="server-group-{{s.id}}" style="display: none;">{{user_group}}</span>
-        {% endif %}
-        {{get_nice_name(id, s.type, s.type, 'provider', params)}}
-        <span id="server-cloud-{{s.id}}" style="display: none;">{{s.type}}</span>
-    </td>
-    <td style="width: 10%">
-        {% set id = "server-region-" + s.id|string() %}
-        {{get_nice_name(id, s.region, s.type, 'region', params)}}
-    </td>
-    <td style="width: 10%">
-        {% set id = "server-os-" + s.id|string() %}
-        {{get_nice_name(id, s.os, s.type, 'image', params)}}
-    </td>
-    <td style="width: 15%">
-        {% set id = "server-ip-" + s.id|string() %}
-        {{ copy_to_clipboard(id=id, value=s.IP) }}
-    </td>
-    <td style="width: 10%">
-        {% set id = "server-size-" + s.id|string() %}
-        {{ copy_to_clipboard(id=id, value=s.instance_type) }}
-    </td>
-    <td style="width: 5%">
-        {% if s.status == 'Created' %}
-        {% set style='color: var(--green-color);' %}
-        {% elif s.status == 'Error ' %}
-        {% set style='color: red;cursor: help;' %}
-        {% endif %}
-        <span id="sever-status-{{s.id}}" title="Last error: {{s.last_error}}" style="font-weight: bold;{{style}}">{{s.status}}</span>
-    </td>
-    <td style="width: 100%">
-        {{s.date}}
-    </td>
-    <td>
-	    <a class="edit" onclick="{{onclickEditAction}}({{s.id}})" title="Edit server {{s.name}}" style="cursor: pointer;"></a>
-	</td>
-	<td>
-	    <a class="delete" onclick="confirmDeleteProvisionedServer({{s.id}})" title="Delete server {{s.name}}" style="cursor: pointer;"></a>
-    </td>
-</tr>
-{% endfor %}
diff --git a/app/templates/ajax/show_service_settings.html b/app/templates/ajax/service_settings.html
similarity index 100%
rename from app/templates/ajax/show_service_settings.html
rename to app/templates/ajax/service_settings.html
diff --git a/app/templates/ajax/show_compare_configs.html b/app/templates/ajax/show_compare_configs.html
index 4d1778d2..ea3db79f 100644
--- a/app/templates/ajax/show_compare_configs.html
+++ b/app/templates/ajax/show_compare_configs.html
@@ -7,11 +7,7 @@
 			<select autofocus required name="left" id="left">
 				<option disabled selected>{{ lang.phrases.select_older_config }}</option>
 				{% for file in return_files %}
-					{% if file == left %}
-						<option value="{{ file }}" selected>{{ file.split('-', maxsplit=1)[1] }}</option>
-					{% else %}
-						<option value="{{ file }}">{{ file.split('-', maxsplit=1)[1] }}</option>
-					{% endif %}
+					<option value="{{ file }}">{{ file.split('-', maxsplit=1)[1] }}</option>
 				{% endfor %}
 			</select>
 
@@ -22,7 +18,6 @@
 				{% endfor %}
 			</select>
 			{{ input('serv', type='hidden', value=serv) }}
-			{{ input('open', type='hidden', value='open') }}
 			<a class="ui-button ui-widget ui-corner-all" id="show" title="{{ lang.words.compare|title() }}" onclick="showCompare()">{{ lang.words.compare|title() }}</a>
 		</p>
 	</div>
diff --git a/app/templates/ajax/show_configs_files.html b/app/templates/ajax/show_configs_files.html
index 2cbea466..39b3c7d1 100644
--- a/app/templates/ajax/show_configs_files.html
+++ b/app/templates/ajax/show_configs_files.html
@@ -11,9 +11,9 @@
 				<option disabled selected>{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.config}} {{lang.words.file}}</option>
 				{% for file in return_files.split() %}
 					{% if file == config_file_name %}
-					<option value="{{ file }}" selected>{{ file.split('/', maxsplit=3)[3] }}</option>
+					<option value="{{ file.replace('/', '92') }}" selected>{{ file.split('/', maxsplit=3)[3] }}</option>
 					{% else %}
-					<option value="{{ file }}">{{ file.split('/', maxsplit=3)[3] }}</option>
+					<option value="{{ file.replace('/', '92') }}">{{ file.split('/', maxsplit=3)[3] }}</option>
 					{% endif %}
 				{% endfor %}
 			</select>
@@ -27,7 +27,7 @@
 		</form>
 	<form action="" method="post" id="finding_words_from">
 		<p id="find_p" style="display: none;">
-			{{ input('words', type='text', style='height: 32.5px;') }}
+			{{ input('words', type='text', style='height: 25.5px;width: 250px;') }}
 			<button type="submit" name="find" id="find_in_configs" value="Find" title="Find in configs">{{lang.words.find|title()}}</button>
 		</p>
 		{% else %}
@@ -57,7 +57,7 @@
 				return false;
 			}
 			findInConfig(words);
-			window.history.pushState("Find in config", "Find in config", cur_url[0] + '?service='+ $('#service').val()+'&serv='+$('#serv').val()+'&showConfigFiles&findInConfig='+ words);
+			// window.history.pushState("Find in config", "Find in config", cur_url[0] + '?service='+ $('#service').val()+'&serv='+$('#serv').val()+'&showConfigFiles&findInConfig='+ words);
 			return false;
 		});
 		$( "input[type=submit], button" ).button()
@@ -96,7 +96,7 @@
 						serv = escapeHtml(serv);
 						path_dir = escapeHtml(path_dir);
 						config_file_name = escapeHtml(config_file_name);
-						window.location.replace('config.py?service=' + service + '&serv=' + serv + '&open=open&config_file_name=' + path_dir + '92' + config_file_name + '.conf&new_config=1');
+						window.location.replace('/app/config/' + service + '/' + serv + '/edit/' + path_dir + '92' + config_file_name + '.conf/new');
 						$(this).dialog("close");
 					}
 				}, {
diff --git a/app/templates/ajax/show_list_version.html b/app/templates/ajax/show_list_version.html
index 31630f61..c28c5b98 100644
--- a/app/templates/ajax/show_list_version.html
+++ b/app/templates/ajax/show_list_version.html
@@ -24,7 +24,7 @@
             $("form input[type='checkbox']").attr("checked",false).change();
         }
     });
-    $.getScript('/inc/script-6.3.9.js');
+    $.getScript('/inc/script.js');
     function show_diff(id) {
         if ($('#show_diff_'+id).css('display') == 'none') {
             $('#show_diff_'+id).show();
@@ -76,7 +76,7 @@
         <tr>
             <td style="padding-left: 15px">
                 <label for="{{c.id}}" id="select_{{c.id}}"></label>
-                <input type="checkbox" value="{{c.local_path}}" name="{{c.local_path}}" id="{{c.id}}">
+                <input type="checkbox" value="{{c.local_path}}" name="do_delete" id="{{c.id}}">
             </td>
             <td>
                 {% for u in users %}
@@ -103,7 +103,7 @@
             </td>
             <td>{{c.date}}</td>
             <td style="padding-top: 10px;">
-                <a href="/app/versions.py?service={{service}}&serv={{serv}}&open=open&configver={{c.local_path.split('/')[-1]}}"
+                <a href="/app/config/versions/{{service}}/{{server_ip}}/{{c.local_path.split('/')[-1]}}"
                    class="ui-button ui-widget ui-corner-all" title="{{lang1.phrases.view_and_upload}}" style="margin-top: -6px;">
                     {{lang1.words.view|title()}}/{{lang1.words.upload|title()}}
                 </a>
@@ -112,10 +112,9 @@
         {% endfor %}
         </tbody>
     </table>
-    <input type="hidden" value="{{serv}}" name="serv">
+    <input type="hidden" value="{{server_ip}}" name="server_ip">
     <input type="hidden" value="open" name="open">
     <input type="hidden" value="del" name="del">
-    <input type="hidden" value="{{style}}" name="style">
     <p>
         <button type="submit" value="" name="" class="btn btn-default">{{lang1.words.delete|title()}}</button>
     </p>
@@ -126,6 +125,7 @@
     <select autofocus required name="configver" id="configver">
         <option disabled selected>------</option>
         {% for file in return_files %}
+        {{file}}
         {% if file == configver %}
         <option value="{{file}}" selected>{{file.split('-', maxsplit=1)[1]}}</option>
         {% else %}
@@ -133,7 +133,7 @@
         {% endif %}
         {% endfor %}
     </select>
-    <input type="hidden" value="{{serv}}" name="serv">
+    <input type="hidden" value="{{server_ip}}" name="server_ip">
     <input type="hidden" value="open" name="open">
     <input type="hidden" value="{{service}}" name="service" id="service">
     <a class="ui-button ui-widget ui-corner-all" id="show" title="{{lang1.words.enter|title()}}" onclick="showUploadConfig()">{{lang1.words.select2|title()}}</a>
diff --git a/app/templates/ajax/show_system_info.html b/app/templates/ajax/show_system_info.html
index d75ccda2..daf5bdb8 100644
--- a/app/templates/ajax/show_system_info.html
+++ b/app/templates/ajax/show_system_info.html
@@ -18,7 +18,7 @@
                 <td class="padding10 first-collumn-wi">Linux</td>
                 <td>{{s_i.os_info}}</td>
             </tr>
-            {% set base_info = string_to_dict(s_i.sys_info) %}
+            {% set base_info = s_i.sys_info|string_to_dict %}
             <tr class="even">
                 <td class="padding10 first-collumn-wi" style="width: 20%;">
                     Hostname
@@ -44,7 +44,7 @@
                     </a>
                 </td>
             </tr>
-            {% set ram_info = string_to_dict(s_i.ram) %}
+            {% set ram_info = s_i.ram|string_to_dict %}
             <tr class="odd">
                 <td class="padding10 first-collumn-wi" style="width: 20%;">
                     Slots
@@ -65,7 +65,7 @@
                     CPU
                 </td>
             </tr>
-            {% set cpu_info = string_to_dict(s_i.cpu) %}
+            {% set cpu_info = s_i.cpu|string_to_dict %}
             <tr class="odd">
                 <td class="padding10 first-collumn-wi">Model</td>
                 <td>{{cpu_info.cpu_model}}</td>
@@ -90,7 +90,7 @@
             </tr>
         </table>
 
-        {% set disks_info = string_to_dict(s_i.disks) %}
+        {% set disks_info = s_i.disks|string_to_dict %}
         {% for v,d in disks_info.items() %}
         <table class="overview-wi">
             <tr class="overviewHead" colspan=2>
@@ -125,7 +125,7 @@
             </tr>
         </table>
         {% endfor %}
-        {% set network_info = string_to_dict(s_i.network) %}
+        {% set network_info = s_i.network|string_to_dict %}
         {% for v,d in network_info.items() %}
         <table class="overview-wi">
             <tr class="overviewHead" colspan=2>
diff --git a/app/templates/ajax/smon/smon_dashboard.html b/app/templates/ajax/smon/smon_dashboard.html
index bcf2095d..ed0e77f9 100644
--- a/app/templates/ajax/smon/smon_dashboard.html
+++ b/app/templates/ajax/smon/smon_dashboard.html
@@ -80,9 +80,9 @@
     <div class="smon_services {{additional_classes}}" data-help="{{checks}}" title="{{checks}}">
     <div class="ip">
         <span style="{{additional_style}}">
-            <a href="smon.py?action=dashboard&dashboard_id={{s.id}}&check_id={{check_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="link">{{s.name.strip("'")}}</a>
+            <a href="/app/smon/dashboard/{{s.id}}/{{check_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="link">{{s.name.strip("'")}}</a>
         </span>
-        <span class="server-action"><a href="smon.py?action=history&host={{s.name}}" title="{{lang.words.view|title()}} {{lang.words.alerts}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="history"></a></span>
+        <span class="server-action"><a href="/app/smon/history/host/{{s.name}}" title="{{lang.words.view|title()}} {{lang.words.alerts}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="history"></a></span>
     </div>
     <div class="desc">
         {% if s.desc %}
diff --git a/app/templates/ajax/show_user_current_group.html b/app/templates/ajax/user_current_group.html
similarity index 100%
rename from app/templates/ajax/show_user_current_group.html
rename to app/templates/ajax/user_current_group.html
diff --git a/app/templates/ajax/show_user_groups_and_roles.html b/app/templates/ajax/user_groups_and_roles.html
similarity index 100%
rename from app/templates/ajax/show_user_groups_and_roles.html
rename to app/templates/ajax/user_groups_and_roles.html
diff --git a/app/templates/ajax/show_user_services.html b/app/templates/ajax/user_services.html
similarity index 100%
rename from app/templates/ajax/show_user_services.html
rename to app/templates/ajax/user_services.html
diff --git a/app/templates/base.html b/app/templates/base.html
index 1d5fbbfa..f15bd78c 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -24,23 +24,23 @@
 		{% if title == 'Login page' %}
 		<meta name="viewport" content="width=device-width, user-scalable=1">
 		{% endif %}
-		<link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" />
-		<link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png">
-		<link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png">
-		<link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png">
-		<link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png">
-		<link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png">
-		<link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png">
-		<link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png">
-		<link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png">
-		<link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png">
-		<link rel="icon" type="image/png" sizes="192x192"  href="/inc/images/favicon/android-icon-192x192.png">
-		<link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png">
-		<link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png">
-		<link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png">
-		<link rel="manifest" href="/inc/images/favicon/manifest.json">
+		<link rel="icon" type="image/png" href="{{ url_for('static', filename='images/favicon/favicon.ico') }}" />
+		<link rel="apple-touch-icon" sizes="57x57" href="{{ url_for('static', filename='images/favicon/apple-icon-57x57.png') }}">
+		<link rel="apple-touch-icon" sizes="60x60" href="{{ url_for('static', filename='images/favicon/apple-icon-60x60.png') }}">
+		<link rel="apple-touch-icon" sizes="72x72" href="{{ url_for('static', filename='images/favicon/apple-icon-72x72.png') }}">
+		<link rel="apple-touch-icon" sizes="76x76" href="{{ url_for('static', filename='images/favicon/apple-icon-76x76.png') }}">
+		<link rel="apple-touch-icon" sizes="114x114" href="{{ url_for('static', filename='images/favicon/apple-icon-114x114.png') }}">
+		<link rel="apple-touch-icon" sizes="120x120" href="{{ url_for('static', filename='images/favicon/apple-icon-120x120.png') }}">
+		<link rel="apple-touch-icon" sizes="144x144" href="{{ url_for('static', filename='images/favicon/apple-icon-144x144.png') }}">
+		<link rel="apple-touch-icon" sizes="152x152" href="{{ url_for('static', filename='images/favicon/apple-icon-152x152.png') }}">
+		<link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='images/favicon/apple-icon-180x180.png') }}">
+		<link rel="icon" type="image/png" sizes="192x192"  href="{{ url_for('static', filename='images/favicon/android-icon-192x192.png') }}">
+		<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='images/favicon/favicon-32x32.png') }}">
+		<link rel="icon" type="image/png" sizes="96x96" href="{{ url_for('static', filename='images/favicon/favicon-96x96.png') }}">
+		<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='images/favicon/favicon-16x16.png') }}">
+		<link rel="manifest" href="{{ url_for('static', filename='images/favicon/manifest.json') }}">
 		<meta name="msapplication-TileColor" content="#ffffff">
-		<meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png">
+		<meta name="msapplication-TileImage" content="{{ url_for('static', filename='images/favicon/ms-icon-144x144.png') }}">
 		<meta name="theme-color" content="#ffffff">
 		<script defer src="/inc/fa-solid.min.js"></script>
 		<script defer src="/inc/fontawesome.min.js"></script>
@@ -62,7 +62,7 @@
 		<script src="/inc/hotkeys.js"></script>
 		<link href="/inc/css/select2.css" rel="stylesheet" />
 		<script src="/inc/select2.js"></script>
-		<script src="/inc/script-6.3.9.js"></script>
+		<script src="/inc/script.js"></script>
 		<script src="/inc/nprogress.js"></script>
 		<link href="/inc/css/toastr-6.3.9.css" rel="stylesheet"/>
 		<script src="/inc/toastr.js"></script>
@@ -74,7 +74,7 @@
 			<div class="LogoText">
 				<span id="logo_text">
 					<a href="https://roxy-wi.org" title="Roxy-WI site" target="_blank">
-						<img src="/inc/images/logo_menu.png" alt="logo" width="110" />
+						<img src="{{ url_for('static', filename='images/logo_menu.png') }}" alt="logo" width="110" />
 					</a>
 				</span>
 			</div>
@@ -82,57 +82,57 @@
 				<nav id="menu">
 					<ul class="menu">
 						{% if user %}
-						<li><a href="/app/overview.py" title="{{lang.menu_links.overview.title}}" class="overview-link ">{{lang.menu_links.overview.link}}</a></li>
+						<li><a href="/app/" title="{{lang.menu_links.overview.title}}" class="overview-link ">{{lang.menu_links.overview.link}}</a></li>
 						{% if '1' in user_services %}
 						<li class="p_menu">
-							<a href="/app/hapservers.py?service=haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="config-show">HAProxy</a>
+							<a href="/app/service/haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="config-show">HAProxy</a>
 							<ul class="v_menu">
-								<li><a href="/app/hapservers.py?service=haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li>
-								<li><a href="/app/config.py?service=haproxy" title="{{lang.menu_links.config.haproxy.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
-								<li><a href="/app/statsview.py?service=haproxy" title="{{lang.menu_links.stats.haproxy.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
-								<li><a href="/app/logs.py?service=haproxy" title="HAProxy {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
-								<li><a href="/app/runtimeapi.py" title="Runtime API" class="runtime head-submenu">Runtime API</a></li>
-								<li><a href="/app/metrics.py?service=haproxy" title="HAProxy {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
+								<li><a href="/app/service/haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li>
+								<li><a href="/app/config/haproxy" title="{{lang.menu_links.config.haproxy.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
+								<li><a href="/app/stats/haproxy" title="{{lang.menu_links.stats.haproxy.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
+								<li><a href="/app/logs/haproxy" title="HAProxy {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
+								<li><a href="/app/runtimeapi" title="Runtime API" class="runtime head-submenu">Runtime API</a></li>
+								<li><a href="/app/metrics/haproxy" title="HAProxy {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
 							{% if role <= 3 %}
-								<li><a href="/app/add.py#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu" id="add1">{{lang.menu_links.add_proxy.link}}</a></li>
-								<li><a href="/app/versions.py?service=haproxy" title="{{lang.menu_links.versions.haproxy.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
-								<li><a href="/app/add.py#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li>
-								<li><a href="/app/add.py#lists" title="{{lang.menu_links.lists.title}}" class="lists head-submenu" id="add7">{{lang.menu_links.lists.link}}</a></li>
-								<li><a href="/app/waf.py?service=haproxy" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li>
+								<li><a href="/app/add/haproxy#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu" id="add1">{{lang.menu_links.add_proxy.link}}</a></li>
+								<li><a href="/app/config/versions/haproxy" title="{{lang.menu_links.versions.haproxy.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
+								<li><a href="/app/add/haproxy#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li>
+								<li><a href="/app/add/haproxy#lists" title="{{lang.menu_links.lists.title}}" class="lists head-submenu" id="add7">{{lang.menu_links.lists.link}}</a></li>
+								<li><a href="/app/waf/haproxy" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li>
 							{% endif %}
 							</ul>
 						</li>
 						{% endif %}
 						{% if '2' in user_services %}
 						<li class="p_menu">
-							<a href="/app/hapservers.py?service=nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="nginx-menu">NGINX</a>
+							<a href="/app/service/nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="nginx-menu">NGINX</a>
 							<ul class="v_menu">
-								<li><a href="/app/hapservers.py?service=nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li>
-								<li><a href="/app/config.py?service=nginx" title="{{lang.menu_links.config.nginx.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
-								<li><a href="/app/statsview.py?service=nginx" title="{{lang.menu_links.stats.nginx.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
-								<li><a href="/app/logs.py?service=nginx" title="NGINX {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
-								<li><a href="/app/metrics.py?service=nginx" title="NGINX {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
+								<li><a href="/app/service/nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li>
+								<li><a href="/app/config/nginx" title="{{lang.menu_links.config.nginx.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
+								<li><a href="/app/stats/nginx" title="{{lang.menu_links.stats.nginx.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
+								<li><a href="/app/logs/nginx" title="NGINX {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
+								<li><a href="/app/metrics/nginx" title="NGINX {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
 								{% if role <= 3 %}
-								<li><a href="/app/add_nginx.py#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu">{{lang.menu_links.add_proxy.link}}</a></li>
-								<li><a href="/app/versions.py?service=nginx" title="{{lang.menu_links.versions.nginx.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
-								<li><a href="/app/add.py?service=nginx#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu">{{lang.menu_links.ssl.link}}</a></li>
-								<li><a href="/app/waf.py?service=nginx" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li>
+								<li><a href="/app/add/nginx#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu">{{lang.menu_links.add_proxy.link}}</a></li>
+								<li><a href="/app/config/versions/nginx" title="{{lang.menu_links.versions.nginx.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
+								<li><a href="/app/add/haproxy?service=nginx#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu">{{lang.menu_links.ssl.link}}</a></li>
+								<li><a href="/app/waf/nginx" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li>
 								{% endif %}
 							</ul>
 						</li>
 						{% endif %}
 						{% if '4' in user_services %}
 						<li class="p_menu">
-							<a href="/app/hapservers.py?service=apache" title="{{lang.menu_links.hapservers.apache.title}}" class="apache-menu">Apache</a>
+							<a href="/app/service/apache" title="{{lang.menu_links.hapservers.apache.title}}" class="apache-menu">Apache</a>
 							<ul class="v_menu">
-								<li><a href="/app/hapservers.py?service=apache" title="{{lang.menu_links.hapservers.apache.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li>
-								<li><a href="/app/config.py?service=apache" title="{{lang.menu_links.config.apache.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
-								<li><a href="/app/statsview.py?service=apache" title="{{lang.menu_links.stats.apache.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
-								<li><a href="/app/logs.py?service=apache" title="Apache {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
-								<li><a href="/app/metrics.py?service=apache" title="Apache {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
+								<li><a href="/app/service/apache" title="{{lang.menu_links.hapservers.apache.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li>
+								<li><a href="/app/config/apache" title="{{lang.menu_links.config.apache.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
+								<li><a href="/app/stats/apache" title="{{lang.menu_links.stats.apache.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
+								<li><a href="/app/logs/apache" title="Apache {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
+								<li><a href="/app/metrics/apache" title="Apache {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
 								{% if role <= 3 %}
-								<li><a href="/app/versions.py?service=apache" title="{{lang.menu_links.versions.apache.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
-								<li><a href="/app/add.py?service=apache#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li>
+								<li><a href="/app/config/versions/apache" title="{{lang.menu_links.versions.apache.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
+								<li><a href="/app/add/haproxy?service=apache#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li>
 								{% endif %}
 							</ul>
 						</li>
@@ -140,60 +140,64 @@
 						{% if '3' in user_services %}
 						{% if role <= 2 %}
 						<li class="p_menu">
-							<a href="/app/hapservers.py?service=keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="ha">Keepalived</a>
+							<a href="/app/service/keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="ha">Keepalived</a>
 							<ul class="v_menu">
-								<li><a href="/app/hapservers.py?service=keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li>
-								<li><a href="/app/ha.py" title="{{lang.menu_links.ha.title}}" class="keepalived head-submenu">HA</a></li>
-								<li><a href="/app/config.py?service=keepalived" title="{{lang.menu_links.config.keepalived.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
-								<li><a href="/app/logs.py?service=keepalived" title="Keepalived {{lang.menu_links.stats.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
-								<li><a href="/app/versions.py?service=keepalived" title="{{lang.menu_links.versions.keepalived.title}}" class="version head-submenu keepalived_versions">{{lang.menu_links.versions.link}}</a></li>
+								<li><a href="/app/service/keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li>
+								<li><a href="/app/config/keepalived" title="{{lang.menu_links.config.keepalived.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li>
+								<li><a href="/app/logs/keepalived" title="Keepalived {{lang.menu_links.stats.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
+								<li><a href="/app/config/versions/keepalived" title="{{lang.menu_links.versions.keepalived.title}}" class="version head-submenu keepalived_versions">{{lang.menu_links.versions.link}}</a></li>
 							</ul>
 						</li>
 						{% endif %}
 						{% endif %}
 							<li class="p_menu">
-								<a href="/app/smon.py?action=view" title="{{lang.menu_links.monitoring.title}}" class="stats">{{lang.menu_links.monitoring.link}}</a>
+								<a href="/app/smon" title="{{lang.menu_links.monitoring.title}}" class="stats">{{lang.menu_links.monitoring.link}}</a>
 								<ul class="v_menu">
-									<li><a href="/app/smon.py?action=view" title="{{lang.menu_links.monitoring.smon.dashboard}}" class="overview-link head-submenu">{{lang.menu_links.monitoring.smon.dashboard}}</a></li>
-									<li><a href="/app/smon.py?action=history" title="{{lang.menu_links.monitoring.smon.history}}" class="lists head-submenu">{{lang.menu_links.monitoring.smon.history}}</a></li>
+									<li><a href="/app/smon/dashboard" title="{{lang.menu_links.monitoring.smon.dashboard}}" class="overview-link head-submenu">{{lang.menu_links.monitoring.smon.dashboard}}</a></li>
+									<li><a href="/app/smon/history" title="{{lang.menu_links.monitoring.smon.history}}" class="lists head-submenu">{{lang.menu_links.monitoring.smon.history}}</a></li>
 									{% if role <= 3 %}
-									<li><a href="/app/smon.py?action=add" title="{{lang.menu_links.monitoring.smon.admin}}" class="edit head-submenu">{{lang.menu_links.monitoring.smon.admin}}</a></li>
+									<li><a href="/app/smon/admin" title="{{lang.menu_links.monitoring.smon.admin}}" class="edit head-submenu">{{lang.menu_links.monitoring.smon.admin}}</a></li>
+									<li><a href="/app/checker/settings" title="Checker: {{lang.words.settings}}" class="checker head-submenu">Checker: {{lang.words.settings|title()}}</a></li>
 									{% endif %}
-									<li><a href="/app/smon.py?action=checker_history" title="{{lang.menu_links.monitoring.checker_history}}" class="lists head-submenu">{{lang.menu_links.monitoring.checker_history}}</a></li>
-									<li><a href="/app/portscanner.py" title="{{lang.menu_links.monitoring.port_scan}}" class="port-scanner head-submenu">{{lang.menu_links.monitoring.port_scan}}</a></li>
-									<li><a href="/app/nettools.py" title="{{lang.menu_links.monitoring.net_tools}}" class="net-tools head-submenu">{{lang.menu_links.monitoring.net_tools}}</a></li>
+									<li><a href="/app/checker/history" title="{{lang.menu_links.monitoring.checker_history}}" class="lists head-submenu">{{lang.menu_links.monitoring.checker_history}}</a></li>
+									<li><a href="/app/portscanner" title="{{lang.menu_links.monitoring.port_scan}}" class="port-scanner head-submenu">{{lang.menu_links.monitoring.port_scan}}</a></li>
+									<li><a href="/app/nettools" title="{{lang.menu_links.monitoring.net_tools}}" class="net-tools head-submenu">{{lang.menu_links.monitoring.net_tools}}</a></li>
 								</ul>
 							</li>
 						{% if role <= 2 %}
 							<li class="p_menu">
-								<a href="/app/servers.py#users" title="{{lang.menu_links.servers.title}}" class="runtime">{{lang.menu_links.servers.link}}</a>
+								<a href="/app/install" title="{{lang.menu_links.servers.title}}" class="hap-menu">{{lang.words.installation|title()}}</a>
 								<ul class="v_menu">
-									<li><a href="/app/servers.py#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu">{{lang.words.users|title()}}</a></li>
-									<li><a href="/app/servers.py#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu">{{lang.words.servers|title()}}</a></li>
-									<li><a href="/app/servers.py#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu">SSH {{lang.words.creds|title()}}</a></li>
-									<li><a href="/app/servers.py#checker" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Checker" class="checker head-submenu">Checker</a></li>
-									<li><a href="/app/servers.py#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu">{{lang.words.settings|title()}}</a></li>
-									<li><a href="/app/servers.py#installproxy" title="{{lang.words.servers|title()}}: {{lang.words.proxy|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu installproxy head-submenu">{{lang.words.proxy|title()}} {{lang.words.installation}}</a> </li>
-									<li><a href="/app/servers.py#installmon" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap1 installmon head-submenu">{{lang.words.monitoring|title()}} {{lang.words.installation}}</a> </li>
-									<li><a href="/app/provisioning.py" title="{{lang.words.servers|title()}}: {{lang.words.provisioning|title()}}" class="hap1 head-submenu">{{lang.words.servers|title()}} {{lang.words.provisioning|title()}}</a> </li>
-									<li><a href="/app/servers.py#backup" title="{{lang.words.servers|title()}}: {{lang.words.backup|title()}} {{lang.words.configs2}}" class="backup head-submenu">{{lang.words.backup|title()}}</a> </li>
-									<li><a href="/app/viewlogs.py?type=2" title="{{lang.words.servers|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li>
+									<li><a href="/app/install/ha" title="{{lang.menu_links.ha.title}}" class="keepalived head-submenu">HA {{lang.words.cluster}}</a></li>
+									<li><a href="/app/install#service" title="{{lang.words.servers|title()}}: {{lang.words.proxy|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu service installproxy head-submenu">{{lang.words.proxy|title()}} {{lang.words.services}}</a> </li>
+									<li><a href="/app/install#monitoring" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu monitoring installmon head-submenu">{{lang.words.monitoring|title()}}</a> </li>
+									<li><a href="/app/install#geolite2" title="{{lang.words.installation|title()}} GeoLite2" class="hap-menu geolite2 installgeo head-submenu">GeoLite2</a> </li>
+								</ul>
+							</li>
+							<li class="p_menu">
+								<a href="/app/servers#users" title="{{lang.menu_links.servers.title}}" class="runtime">{{lang.menu_links.servers.link}}</a>
+								<ul class="v_menu">
+									<li><a href="/app/servers#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu">{{lang.words.users|title()}}</a></li>
+									<li><a href="/app/servers#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu">{{lang.words.servers|title()}}</a></li>
+									<li><a href="/app/servers#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu">SSH {{lang.words.creds|title()}}</a></li>
+									<li><a href="/app/servers#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu">{{lang.words.settings|title()}}</a></li>
+									<li><a href="/app/servers#backup" title="{{lang.words.servers|title()}}: {{lang.words.backup|title()}} {{lang.words.configs2}}" class="backup head-submenu">{{lang.words.backup|title()}}</a> </li>
+									<li><a href="/app/logs/internal?type=2" title="{{lang.words.servers|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li>
 								</ul>
 							</li>
 						{% endif %}
 						{% if role <= 1 %}
 							<li class="p_menu" id="admin-area">
-								<a href="/app/users.py#users" title="{{lang.menu_links.admin_area.title}}" class="admin">{{lang.menu_links.admin_area.link}}</a>
+								<a href="/app/admin#users" title="{{lang.menu_links.admin_area.title}}" class="admin">{{lang.menu_links.admin_area.link}}</a>
 								<ul class="v_menu">
-									<li><a href="/app/users.py#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu" id="admin-area-users">{{lang.words.users|title()}}</a></li>
-									<li><a href="/app/users.py#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups3}}" class="group groups head-submenu" id="admin-area-groups">{{lang.words.groups|title()}}</a></li>
-									<li><a href="/app/users.py#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu" id="admin-area-servers">{{lang.words.servers|title()}}</a></li>
-									<li><a href="/app/users.py#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu" id="admin-area-ssh">SSH {{lang.words.creds|title()}}</a></li>
-									<li><a href="/app/users.py#checker" title="{{lang.words.admin_area|title()}}: Checker" class="checker head-submenu" id="admin-area-checker">Checker</a></li>
-									<li><a href="/app/users.py#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu" id="admin-area-settings">{{lang.words.settings|title()}}</a></li>
-									<li><a href="/app/users.py#services" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.services3}}" class="services head-submenu" id="admin-area-services">{{lang.words.services|title()}}</a></li>
-									<li><a href="/app/viewlogs.py" title="{{lang.words.admin_area|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu" id="admin-area-logs">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li>
-									<li><a href="/app/users.py#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI" class="upload updatehapwi head-submenu" id="admin-area-update">{{lang.words.w_update|title()}}</a></li>
+									<li><a href="/app/admin#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu" id="admin-area-users">{{lang.words.users|title()}}</a></li>
+									<li><a href="/app/admin#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups3}}" class="group groups head-submenu" id="admin-area-groups">{{lang.words.groups|title()}}</a></li>
+									<li><a href="/app/admin#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu" id="admin-area-servers">{{lang.words.servers|title()}}</a></li>
+									<li><a href="/app/admin#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu" id="admin-area-ssh">SSH {{lang.words.creds|title()}}</a></li>
+									<li><a href="/app/admin#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu" id="admin-area-settings">{{lang.words.settings|title()}}</a></li>
+									<li><a href="/app/admin#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}}" class="services head-submenu" id="admin-area-services">{{lang.words.tools|title()}}</a></li>
+									<li><a href="/app/logs/internal" title="{{lang.words.admin_area|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu" id="admin-area-logs">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li>
+									<li><a href="/app/admin#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI" class="upload updatehapwi head-submenu" id="admin-area-update">{{lang.words.w_update|title()}}</a></li>
 								</ul>
 							</li>
 						{% endif %}	
@@ -279,7 +283,7 @@
 		</div>	
 		<div id="show-updates" style="display: none;">	
 			<div>
-				{{lang.phrases.new_version}} <a href="/app/users.py#updatehapwi" class="link">{{lang.words.w_update|title()}}</a>
+				{{lang.phrases.new_version}} <a href="/app/admin#updatehapwi" class="link">{{lang.words.w_update|title()}}</a>
 			</div>
 		</div>	
 		<div class="footer">
@@ -298,7 +302,7 @@
 			<div id="version"></div>
 			<div id="logo_footer">
 				<a href="https://roxy-wi.org" title="Roxy-WI official site" target="_blank">
-					<img src="/inc/images/logo_footer.png" alt="logo" id="logo_footer_img" />
+					<img src="{{ url_for('static', filename='images/logo_footer.png')}}" alt="logo" id="logo_footer_img" />
 				</a>
 			</div>
 			<div class="footer-div">
diff --git a/app/templates/checker.html b/app/templates/checker.html
new file mode 100644
index 00000000..cf6f66fe
--- /dev/null
+++ b/app/templates/checker.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% block title %} Checker {{ lang.words.settings }} {% endblock %}
+{% block h2 %} Checker {{ lang.words.settings }} {% endblock %}
+{% block content %}
+{% from 'include/input_macros.html' import input, select, copy_to_clipboard, checkbox %}
+<script src="/inc/users.js"></script>
+<script src="/inc/fontawesome.min.js"></script>
+<div id="checker"></div>
+<script>
+    loadchecker();
+</script>
+{% endblock %}
diff --git a/app/templates/config.html b/app/templates/config.html
index 60ea93fa..86c4ca71 100644
--- a/app/templates/config.html
+++ b/app/templates/config.html
@@ -26,7 +26,7 @@
 <script src="/inc/codemirror/keymap/sublime.js"></script>
 <script src="/inc/configshow.js"></script>
 {% if is_serv_protected and role > 2 %}
-<meta http-equiv="refresh" content="0; url=/app/hapservers.py?service={{service}}">
+<meta http-equiv="refresh" content="0; url=/app/service">
 {% else %}
 	{% if selects|length == 0 %}
 		{% include 'include/getstarted.html' %}
@@ -36,22 +36,22 @@
 			<input type="hidden" id="service" value="{{service|default('haproxy', true)}}" />
 			{% include 'include/select.html' %}
 			{% if service == 'nginx' or service == 'apache' %}
-			<a class="ui-button ui-widget ui-corner-all" title="Show running config" onclick="showConfigFiles()">{{lang.words.open|title()}}</a>
+			<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="showConfigFiles()">{{lang.words.open|title()}}</a>
 			{% else %}
-			<a class="ui-button ui-widget ui-corner-all" title="Show running config" onclick="showConfig()">{{lang.words.open|title()}}</a>
+			<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="showConfig()">{{lang.words.open|title()}}</a>
 			{% endif %}
 			{% if service != 'keepalived' and service != 'apache' %}
-				<a class="ui-button ui-widget ui-corner-all" title="View stat" onclick="openStats()">{{lang.menu_links.stats.link}}</a>
+				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.stat}}" onclick="openStats()">{{lang.menu_links.stats.link}}</a>
 			{% endif %}
 			{% if service != 'keepalived' and service != 'nginx' and service != 'apache' %}
-				<a class="ui-button ui-widget ui-corner-all" title="Show map" onclick="showMap()">{{lang.words.map|title()}}</a>
+				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.map}}" onclick="showMap()">{{lang.words.map|title()}}</a>
 			{% endif %}
-				<a class="ui-button ui-widget ui-corner-all" title="Compare configs" onclick="showCompareConfigs()">{{lang.words.compare|title()}}</a>
+				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.compare|title()}} {{lang.words.configs}}" onclick="showCompareConfigs()">{{lang.words.compare|title()}}</a>
 			{% if role <= 3 %}
-				<a class="ui-button ui-widget ui-corner-all" title="Show versions" onclick="openVersions()">{{lang.menu_links.versions.link}}</a>
+				<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.versions}}" onclick="openVersions()">{{lang.menu_links.versions.link}}</a>
 			{% endif %}
 			{% if role <= 2 %}
-				<a href="/app/servers.py#backup" class="ui-button ui-widget ui-corner-all" title="Git">Git</a>
+				<a href="/app/servers#backup" class="ui-button ui-widget ui-corner-all" title="Git">Git</a>
 			{% endif %}
 		</form>
 	</p>
@@ -64,8 +64,8 @@
 
 	{% if config %}
 		{% if role <= 3 %}
-			<h4 class="left-space">{{lang.words.config|title()}} {% if config_file_name != 'undefined' %}{{config_file_name.replace('92', '/')}}{%endif%} {{lang.words.from}} {{ serv }}</h4>
-			<form action="config.py" name="saveconfig" id="saveconfig" method="post" class="left-space">
+			<h4 class="left-space">{{lang.words.config|title()}} {% if config_file_name and config_file_name != 'undefined' %}{{config_file_name.replace('92', '/')}}{%endif%} {{lang.words.from}} {{ serv }}</h4>
+			<form action="/app/config/{{service}}/{{serv}}/save" name="saveconfig" id="saveconfig" method="post" class="left-space">
 				<input type="hidden" value="{{ serv }}" name="serv">
 				<input type="hidden" value="{{ cfg }}.old" name="oldconfig">
 				<input type="hidden" value="{{ token }}" name="token">
@@ -75,7 +75,7 @@
 					<textarea name="config" id="config_text_area" class="config" rows="35" cols="100">{{ config }}</textarea>
 				</div>
 				<p>
-					<a href="config.py?service={{service}}&serv={{serv}}&showConfig" class="ui-button ui-widget ui-corner-all" title="{{lang.phrases.return_to_config}}">{{lang.words.back|title()}}</a>
+					<a href="/app/config/{{service}}/{{serv}}/show" class="ui-button ui-widget ui-corner-all" title="{{lang.phrases.return_to_config}}">{{lang.words.back|title()}}</a>
 					{% if service != 'keepalived' %}
 					<button type="submit" value="test" name="save" class="btn btn-default" title="{{lang.words.check|title()}} {{lang.words.config}} {{lang.words.without}} {{lang.words.saving}}">{{lang.phrases.check_config}}</button>
 					{% endif %}
@@ -92,19 +92,21 @@
 		{% endif %}
 	{% endif %}
 <script>
-	if (cur_url[1].split('&')[2] == 'showMap') {
+	var cur_url = window.location.href.split('/app/').pop();
+	cur_url = cur_url.split('/');
+	if (cur_url[1] == 'map') {
 		showMap();
 	}
-	if (cur_url[1].split('&')[1] == 'showCompare' || cur_url[1].split('&')[2] == 'showCompare') {
+	if (cur_url[1] == 'compare') {
 		showCompareConfigs();
 	}
-	if (cur_url[1].split('&')[2] == 'showConfig') {
+	if (cur_url[3] == 'show') {
 		showConfig();
 	}
-	if (cur_url[1].split('&')[2] == 'showConfigFiles') {
+	if (cur_url[3] == 'show-files') {
 		showConfigFiles();
 	}
-	if (cur_url[1].split('&')[3].split('=')[0] == 'findInConfig') {
+	if (cur_url[3] == 'findInConfig') {
 		var words = findGetParameter('findInConfig');
 		waitForElm('#finding_words_from').then((elm) => {
 			$('#find_p').show();
@@ -112,10 +114,10 @@
 			findInConfig(words);
 		});
 	}
-	if (cur_url[1].split('&')[3].split('=')[0] == 'config_file_name') {
+	if (cur_url[1] == 'config_file_name') {
 		showConfigFilesForEditing();
 	}
-	if (cur_url[1].split('&')[0] == 'service=haproxy' || cur_url[1].split('&')[0] == 'service=None') {
+	if (cur_url[1] == 'haproxy' && cur_url[3] == 'edit') {
 		var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("config_text_area"),
 				{
 					mode: "haproxy",
diff --git a/app/templates/configver.html b/app/templates/configver.html
index d4b8e023..6066ee34 100644
--- a/app/templates/configver.html
+++ b/app/templates/configver.html
@@ -3,7 +3,7 @@
 {% block h2 %}{{ lang.menu_links.versions.h2 }} {{ lang.words[service] }}{% endblock %}
 {% block content %}
 	<p>
-		<form action="{{ action }}" method="post" class="left-space">
+		<form action="/app/config/versions/{{service}}/{{serv}}" method="post" class="left-space">
 			<input type="hidden" id="service" value="{{service}}">
 			{% include 'include/select.html' %}
 			<button type="submit" value="open" name="open" class="btn btn-default">{{lang.words.open|title()}}</button>
@@ -13,8 +13,6 @@
 		{% if stderr %}
 			{% include 'include/errors.html' %}
 		{% endif %}
-	{% endif %}
-	{% if open %}
 		<div id="config_version_div"></div>
 		<script>showListOfVersion(0)</script>
 	{% endif %}
diff --git a/app/templates/delver.html b/app/templates/delver.html
index 9aa4c05b..5bf3018d 100644
--- a/app/templates/delver.html
+++ b/app/templates/delver.html
@@ -12,7 +12,7 @@
 			<input type="hidden" value="{{service}}" name="service" id="service">
 			{% include 'include/select.html' %}
 				<a class="ui-button ui-widget ui-corner-all" title="Open versions" onclick="showListOfVersion(1)">{{lang.words.open|title()}}</a>
-				<a href="config.py?service={{service}}" class="ui-button ui-widget ui-corner-all" title="Configs page">{{lang.words.configs|title()}}</a>
+				<a href="/app/config/{{service}}" class="ui-button ui-widget ui-corner-all" title="Configs page">{{lang.words.configs|title()}}</a>
 			{% if service != 'keepalived' %}
 				<a class="ui-button ui-widget ui-corner-all" title="View stat" onclick="openStats()">{{lang.words.stats|title()}}</a>
 			{% endif %}
@@ -36,7 +36,7 @@
 			{{lang.phrases.work_with_prev}} {{ service[0]|upper}}{{service[1:] }}. {{lang.phrases.roll_back}}
 		</div>
 	{% endif %}
-	{% if open and not aftersave %}
+	{% if serv and not aftersave %}
 	{% for select in selects %}
 		{% if select.2 == serv %}
 			<script>showListOfVersion(1)</script>
diff --git a/app/templates/ha.html b/app/templates/ha.html
index 5785493e..4364c095 100644
--- a/app/templates/ha.html
+++ b/app/templates/ha.html
@@ -5,16 +5,16 @@
 {% from 'include/input_macros.html' import input, checkbox %}
 <script src="/inc/users.js"></script>
 <script src="/inc/ha.js"></script>
-<link href="/inc/css/provisioning.css" rel="stylesheet">
+<link href="/inc/css/ha.css" rel="stylesheet">
 <style>
 	p {margin: 0;}
 </style>
 {% if user_status == 0 or user_plan == 'user' %}
-{% include 'include/no_sub.html' %}
+	{% include 'include/no_sub.html' %}
 {% elif not is_needed_tool %}
 	<div style="text-align: center;">
 		<h3>You have not installed Ansible</h3>.
-		<img src="/inc/images/no_servers.png" alt="There is no server">
+		<img src="{{ url_for('static', filename='images/no_servers.png')" alt="There is no server">
 		<h4>
 			Read <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.installing|title()}} Ansible" target="_blank">here</a> how to install Ansible.
 		</h4>
diff --git a/app/templates/hapservers.html b/app/templates/hapservers.html
index 2b2ad959..0b2d8eef 100644
--- a/app/templates/hapservers.html
+++ b/app/templates/hapservers.html
@@ -3,9 +3,9 @@
 {% block h2 %}{{ lang.menu_links.hapservers.h2 }} {{ service_desc.service }}{% endblock %}
 {% block content %}
 {% from 'include/input_macros.html' import input, checkbox, select, copy_to_clipboard %}
-<script src="/inc/overview-6.3.9.js"></script>
+<script src="/inc/overview.js"></script>
 <link href="/inc/css/chart.min.css" rel="stylesheet">
-<script src="/inc/metrics-6.3.16.0.js"></script>
+<script src="/inc/metrics.js"></script>
 <script src="/inc/chart.min-4.3.0.js"></script>
 {% if servers|length == 0 %} {% include 'include/getstarted.html' %} {% endif %}
 <style>
@@ -203,7 +203,7 @@
 				<input type="hidden" id="server-name-{{s.0}}" value="{{s.1}}" />
 				<input type="hidden" id="service" value="{{service}}" />
 				{% if not serv %}
-					<a href="/app/hapservers.py?service={{service}}&serv={{s.2}}" title="{{lang.words.more|title()}} {{lang.words.about}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a>
+					<a href="/app/service/{{service}}/{{s.2}}" title="{{lang.words.more|title()}} {{lang.words.about}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a>
 				{% else %}
 					{{s.1}}
 				{% endif %}
@@ -249,7 +249,7 @@
 					<a id="stop-{{ s.2 }}" class="stop" title="{{lang.words.stop|title()}} {{service}} {{lang.words.service}}">
 						<span class="service-stop" onclick="confirmAjaxAction('stop', '{{service}}', '{{s.2}}')"></span>
 					</a>
-					<a href="history.py?service={{service}}&serv={{s.2}}" title="{{lang.words.view|title()}} {{lang.words.history3}} {{s.1}}" class="history" style="margin: 0 5px 0 10px;"></a>
+					<a href="/app/history/{{service}}/{{s.2}}" title="{{lang.words.view|title()}} {{lang.words.history3}} {{s.1}}" class="history" style="margin: 0 5px 0 10px;"></a>
 					{% if service != 'keepalived' %}
 					<span class="menu-bar" onclick="serverSettings('{{s.0}}', '{{s.1}}')" title="{{lang.words.edit|title()}} {{lang.words.settings}} {{s.1}}"></span>
 					{% endif %}
@@ -342,20 +342,20 @@
 			</div>
 			<div class="server-act-links">
 				{% if service == 'nginx' or service == 'apache' %}
-				<a href="/app/config.py?service={{service}}&serv={{s.2}}&showConfigFiles" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.configs}}">{{lang.menu_links.config.link}}</a>
+				<a href="/app/config/{{service}}/{{s.2}}/show-files" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.configs}}">{{lang.menu_links.config.link}}</a>
 				{% else %}
-				<a href="/app/config.py?service={{service}}&serv={{s.2}}&showConfig" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.config}}">{{lang.menu_links.config.link}}</a>
+				<a href="/app/config/{{service}}/{{s.2}}/show/undefined" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.config}}">{{lang.menu_links.config.link}}</a>
 				{% endif %}
-				<a href="/app/config.py?service={{service}}&serv={{s.2}}&showCompare" {{compare_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.compare|title()}} {{lang.words.configs}}">{{lang.words.compare|title()}}</a>
+				<a href="/app/config/compare/{{service}}/{{s.2}}" {{compare_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.compare|title()}} {{lang.words.configs}}">{{lang.words.compare|title()}}</a>
 			{% if service == 'haproxy' %}
-				<a href="/app/config.py?service={{service}}&serv={{s.2}}&showMap" class="ui-button ui-widget ui-corner-all" {{map_id}} title="{{lang.words.show|title()}} {{lang.words.map}}">{{lang.words.map|title()}}</a>
+				<a href="/app/config/map/{{service}}/{{s.2}}" class="ui-button ui-widget ui-corner-all" {{map_id}} title="{{lang.words.show|title()}} {{lang.words.map}}">{{lang.words.map|title()}}</a>
 			{% endif %}
 			{% if service != 'keepalived' %}
-			<a href="/app/statsview.py?service={{service}}&serv={{s.2}}" class="ui-button ui-widget ui-corner-all" {{stats_id}} title="{{lang.words.view|title()}} {{service}} {{lang.words.statistics}}">{{lang.menu_links.stats.link}}</a>
+			<a href="/app/stats/{{service}}/{{s.2}}" class="ui-button ui-widget ui-corner-all" {{stats_id}} title="{{lang.words.view|title()}} {{service}} {{lang.words.statistics}}">{{lang.menu_links.stats.link}}</a>
 			{% endif %}
-			<a href="/app/logs.py?service={{service}}&serv={{s.2}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" {{logs_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{service}} {{lang.words.logs}}">{{lang.menu_links.logs.link}}</a>
+			<a href="/app/logs/{{service}}/" {{logs_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{service}} {{lang.words.logs}}">{{lang.menu_links.logs.link}}</a>
 			{% if role <= 2 %}
-				<a href="/app/versions.py?service={{service}}&serv={{s.2}}&open=open" class="ui-button ui-widget ui-corner-all" {{versions_id}} title="{{lang.words.view|title()}}/{{lang.words.rollback|title()}} {{lang.words.to}} {{lang.words.previous}} {{lang.words.config}}">{{lang.menu_links.versions.link}}</a>
+				<a href="/app/config/versions/{{service}}/{{s.2}}" class="ui-button ui-widget ui-corner-all" {{versions_id}} title="{{lang.words.view|title()}}/{{lang.words.rollback|title()}} {{lang.words.to}} {{lang.words.previous}} {{lang.words.config}}">{{lang.menu_links.versions.link}}</a>
 			{% endif %}
 			</div>
 		</div>
@@ -406,13 +406,11 @@
 		<div class="chart-container_overview http_metrics_div">
 			<canvas id="http_{{s.2}}" role="img"></canvas>
 		</div>
-		{% for waf_server in servers_waf %}
-		{% if waf_server.server.ip == s.2 %}
+		{% if waf_server == s.2 %}
 		<div id="waf_metrics_div" class="chart-container_overview">
 			<canvas id="waf_{{s.2}}" role="img"></canvas>
 		</div>
 		{% endif %}
-		{% endfor %}
 		{% elif service == 'nginx' and s.8.0.21 %}
 		<div id="nginx_metrics_div" class="chart-container" style="display: block; width: 90%; height: 300px;">
 			<canvas id="nginx_{{s.2}}" role="img"></canvas>
diff --git a/app/templates/include/admin_backup.html b/app/templates/include/admin_backup.html
index 6bef25c1..0e9a01be 100644
--- a/app/templates/include/admin_backup.html
+++ b/app/templates/include/admin_backup.html
@@ -1,7 +1,7 @@
 {% if not is_needed_tool %}
     <div style="text-align: center;">
 		<h3>{{lang.admin_page.desc.no_ansible}} Ansible</h3>.
-		<img src="/inc/images/no_servers.png" alt="There is no server">
+		<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
 		<h4>
 			{{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible.
 		</h4>
diff --git a/app/templates/include/admin_servers.html b/app/templates/include/admin_servers.html
index 41de747e..5ff28dae 100644
--- a/app/templates/include/admin_servers.html
+++ b/app/templates/include/admin_servers.html
@@ -140,7 +140,7 @@
 				{% endif %}
 			</td>
 			<td>
-				<a href="history.py?service=server&serv={{server.2}}" title="{{lang.words.view|title}} {{lang.words.history}} {{lang.words.for}} {{lang.words.this}} {{lang.words.server}}" class="history"></a>
+				<a href="/app/history/server/{{server.2}}" title="{{lang.words.view|title}} {{lang.words.history}} {{lang.words.for}} {{lang.words.this}} {{lang.words.server}}" class="history"></a>
 			</td>
 			<td style="min-width: 17px;">
 				<a class="info" onclick="showServerInfo('{{server.0}}', '{{server.2}}')" id="server_info_link-{{server.0}}" title="{{lang.words.show|title()}} {{lang.words.server}} {{lang.words.info}}" style="cursor: pointer; color: var(--green-color)"></a>
diff --git a/app/templates/include/admin_users.html b/app/templates/include/admin_users.html
index 22dfba19..946f41ef 100644
--- a/app/templates/include/admin_users.html
+++ b/app/templates/include/admin_users.html
@@ -78,7 +78,7 @@
 				<span title="{{lang.words.change2|title()}} {{lang.words.user3}} {{lang.words.services}}" style="cursor: pointer; margin-left: 15px;" class="div-pic" onclick="openChangeUserServiceDialog('{{user.user_id}}')"></span>
 			</td>
 			<td>
-				<a href="history.py?service=user&user_id={{user.user_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{lang.words.user2}}" class="history"></a>
+				<a href="/app/history/user/{{user.user_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{lang.words.user2}}" class="history"></a>
 			</td>
 			<td>
 				<a class="delete" onclick="confirmDeleteUser({{user.user_id}})" title="{{lang.words.delete|title()}} {{user.username}}" style="cursor: pointer;"></a>
diff --git a/app/templates/include/getstarted.html b/app/templates/include/getstarted.html
index 97acc2ac..87f83543 100644
--- a/app/templates/include/getstarted.html
+++ b/app/templates/include/getstarted.html
@@ -1,6 +1,6 @@
 <center>
 	<h4 style="font-size: 25px">Welcome and let's get started!</h4>
-	<img src="/inc/images/no_servers.png" alt="There is no server">
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
 	<br />
 	<br />
 	<h4>
@@ -8,9 +8,9 @@
 		Read how to <a href="https://roxy-wi.org/howto/add-existing-server" title="How to add an existing server">add an existing server</a>
 		or create <a href="https://roxy-wi.org/howto/add-new-server" title="How to add a new server">a new one</a>
 		{% if role == 2 %}
-			and go to the "<a href="servers.py#servers" title="Servers">Servers</a>"
+			and go to the "<a href="/app/servers#servers" title="Servers">Servers</a>"
 		{% elif role == 1 %}
-			and go to the "<a href="users.py#servers" title="Servers">Admin area</a>"
+			and go to the "<a href="/app/users#servers" title="Servers">Admin area</a>"
 		{% endif %}
 		to add your first server
 	</h4>
diff --git a/app/templates/include/login.html b/app/templates/include/login.html
index 9e7e9e46..545154ea 100644
--- a/app/templates/include/login.html
+++ b/app/templates/include/login.html
@@ -1,7 +1,7 @@
 {% if user %}
 	<span id="show-user-settings-button" class="user-circle login" title="{{lang.words.user3|title()}} {{lang.words.settings}}" style="margin-top: 5px;">{{user}}</span>
 {% else %}
-	<a href=/app/login.py title="Login" class="login"> Login</a>
+	<a href=/app/login title="Login" class="login"> Login</a>
 {% endif %}
 {% if guide_me %}
 	<style>
@@ -18,7 +18,7 @@
 	</style>
 	<span class="info guid_me" title="Guide me" onclick="startIntroAgain()"></span>
 {% endif %}
-<a href="/app/login.py?logout" title="{{lang.words.logout|title()}}" style="float: right;
+<a href="/app/logout" title="{{lang.words.logout|title()}}" style="float: right;
     right: 27px;
     position: absolute;
     top: 10px;
diff --git a/app/templates/include/mon_installation.html b/app/templates/include/mon_installation.html
deleted file mode 100644
index e5202d0d..00000000
--- a/app/templates/include/mon_installation.html
+++ /dev/null
@@ -1,203 +0,0 @@
-{% if not is_needed_tool %}
-    <div style="text-align: center;">
-		<h3>{{lang.admin_page.desc.no_ansible}} Ansible</h3>.
-		<img src="/inc/images/no_servers.png" alt="There is no server">
-		<h4>
-			{{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">here</a> {{lang.phrases.how_to_install}} Ansible.
-		</h4>
-	</div>
-{% else %}
-{% if page == 'users.py' %}
-    <table id="grafana-table">
-        <caption><i class="fas fa-chart-bar caption-icon2"></i><h3>Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}</h3></caption>
-        <tr class="overviewHead">
-            <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
-            <td class="padding10 first-collumn" style="width: 40%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.note|title()}}</td>
-            <td></td>
-            <td></td>
-        </tr>
-        <tr>
-            <td id="cur_grafana_ver" class="padding10 first-collumn">
-                {% if grafana == "active" %}
-                Grafana {{lang.words.and}} Prometheus {{lang.admin_page.desc.been_installed}}
-                {% else %}
-                {{lang.admin_page.desc.there_are_no}}
-                {% endif %}
-            </td>
-            <td class="padding10 first-collumn" style="width: 20%;">
-                {{lang.admin_page.desc.latest_repo}} Grafana {{lang.words.and}} Prometheus
-            </td>
-            <td class="padding10 first-collumn">
-                {{lang.admin_page.desc.before_install}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}
-            </td>
-            <td></td>
-            <td>
-                {% if grafana != "active" %}
-                <span class="ui-button ui-widget ui-corner-all" id="grafna_install" title="{{lang.words.install|title()}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}">{{lang.words.install|title()}}</span>
-                {% endif %}
-            </td>
-        </tr>
-    </table>
-{% endif %}
-    <table id="haproxy-table">
-        <caption><i class="fas fa-network-wired caption-icon2"></i><h3>HAProxy Exporter</h3></caption>
-        <tr class="overviewHead">
-            <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
-            <td class="help_cursor" style="width: 20%;" data-intro="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
-            <td></td>
-            <td></td>
-        </tr>
-        <tr>
-            <td id="cur_haproxy_exp_ver" class="padding10 first-collumn"></td>
-            <td class="padding10 first-collumn" style="width: 20%;">
-                {% set values = dict() %}
-                {% set values = {'0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0', '0.12.0':'0.12.0', '0.13.0':'0.13.0', '0.14.0':'0.14.0', '0.15.0':'0.15.0'} %}
-                {{ select('hapexpver',  values=values, selected='0.15.0') }}
-            </td>
-            <td class="padding10 first-collumn">
-                <select autofocus required name="haproxy_exp_addserv" id="haproxy_exp_addserv">
-                    <option disabled selected>------</option>
-                    {% for select in servers %}
-                    <option value="{{ select.2 }}">{{ select.1 }}</option>
-                    {% endfor %}
-                </select>
-            </td>
-            <td style="padding-left: 50px;">{{ checkbox('haproxy_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
-            <td>
-                <span class="ui-button ui-widget ui-corner-all" id="haproxy_exp_install" title="{{lang.words.install|title()}} HAProxy Exporter">{{lang.words.install|title()}}</span>
-            </td>
-        </tr>
-    </table>
-    <table id="nginx-table">
-        <caption><i class="fas fa-sitemap caption-icon2"></i><h3>NGINX Exporter</h3></caption>
-        <tr class="overviewHead">
-            <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
-            <td class="help_cursor" style="width: 20%;" data-help="lang.admin_page.desc.ext_prom">{{lang.words.external|title()}} Prometheus</td>
-            <td></td>
-            <td></td>
-        </tr>
-        <tr>
-            <td id="cur_nginx_exp_ver" class="padding10 first-collumn"></td>
-            <td class="padding10 first-collumn" style="width: 20%;">
-                {% set values = dict() %}
-                {% set values = {'0.6.0':'0.6.0', '0.7.0':'0.7.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0'} %}
-                {{ select('nginxexpver',  values=values, selected='0.11.0') }}
-            </td>
-            <td class="padding10 first-collumn">
-                <select autofocus required name="nginx_exp_addserv" id="nginx_exp_addserv">
-                    <option disabled selected>------</option>
-                    {% for select in servers %}
-                    <option value="{{ select.2 }}">{{ select.1 }}</option>
-                    {% endfor %}
-                </select>
-            </td>
-            <td style="padding-left: 50px;">{{ checkbox('nginx_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
-            <td>
-                <span class="ui-button ui-widget ui-corner-all" id="nginx_exp_install" title="{{lang.words.install|title()}} NGINX Exporter">{{lang.words.install|title()}}</span>
-            </td>
-        </tr>
-    </table>
-    <table id="apache-table">
-        <caption><i class="fas fa-feather-alt caption-icon2"></i><h3>Apache Exporter</h3></caption>
-        <tr class="overviewHead">
-            <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
-            <td class="help_cursor" style="width: 20%;" data-help="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
-            <td></td>
-            <td></td>
-        </tr>
-        <tr>
-            <td id="cur_apache_exp_ver" class="padding10 first-collumn"></td>
-            <td class="padding10 first-collumn" style="width: 20%;">
-                {% set values = dict() %}
-                {% set values = {'0.10.0':'0.10.0', '0.13.4':'0.13.4', '1.0.1':'1.0.1'} %}
-                {{ select('apacheexpver',  values=values, selected='1.0.1') }}
-            </td>
-            <td class="padding10 first-collumn">
-                <select autofocus required name="apache_exp_addserv" id="apache_exp_addserv">
-                    <option disabled selected>------</option>
-                    {% for select in servers %}
-                    <option value="{{ select.2 }}">{{ select.1 }}</option>
-                    {% endfor %}
-                </select>
-            </td>
-            <td style="padding-left: 50px;">{{ checkbox('apache_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
-            <td>
-                <span class="ui-button ui-widget ui-corner-all" id="apache_exp_install" title="{{lang.words.install|title()}} Apache Exporter">{{lang.words.install|title()}}</span>
-            </td>
-        </tr>
-    </table>
-    <table id="keepalived-table">
-        <caption><i class="fas fa-cloud caption-icon2"></i><h3>Keepalived Exporter</h3></caption>
-        <tr class="overviewHead">
-            <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
-            <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
-            <td></td>
-            <td></td>
-        </tr>
-        <tr>
-            <td id="cur_keepalived_exp_ver" class="padding10 first-collumn"></td>
-            <td class="padding10 first-collumn" style="width: 20%;">
-                {% set values = dict() %}
-                {% set values = {'0.1.0':'0.1.0', '0.2.0':'0.2.0', '0.3.0':'0.3.0', '0.4.0':'0.4.0', '0.5.0':'0.5.0'} %}
-                {{ select('keepalivedexpver',  values=values, selected='0.5.0') }}
-            </td>
-            <td class="padding10 first-collumn">
-                <select autofocus required name="keepalived_exp_addserv" id="keepalived_exp_addserv">
-                    <option disabled selected>------</option>
-                    {% for select in servers %}
-                    <option value="{{ select.2 }}">{{ select.1 }}</option>
-                    {% endfor %}
-                </select>
-            </td>
-            <td style="padding-left: 50px;">{{ checkbox('keepalived_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
-            <td>
-                <span class="ui-button ui-widget ui-corner-all" id="keepalived_exp_install" title="{{lang.words.install|title()}} Keepalived Exporter">{{lang.words.install|title()}}</span>
-            </td>
-        </tr>
-    </table>
-    <table style="margin-top: 20px" id="node-table">
-        <caption><i class="fas fa-server caption-icon2"></i><h3>Node Exporter</h3></caption>
-        <tr class="overviewHead">
-            <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
-            <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
-            <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
-            <td></td>
-            <td></td>
-        </tr>
-        <tr>
-            <td id="cur_node_exp_ver" class="padding10 first-collumn"></td>
-            <td class="padding10 first-collumn" style="width: 20%;">
-                {% set values = dict() %}
-                {% set values = {'1.2.0':'1.2.0', '1.2.2':'1.2.2', '1.3.0':'1.3.0', '1.3.1':'1.3.1', '1.5.0':'1.5.0', '1.6.1':'1.6.1'} %}
-                {{ select('nodeexpver',  values=values, selected='1.6.1') }}
-            </td>
-            <td class="padding10 first-collumn">
-                <select autofocus required name="node_exp_addserv" id="node_exp_addserv">
-                    <option disabled selected>------</option>
-                    {% for select in servers %}
-                    <option value="{{ select.2 }}">{{ select.1 }}</option>
-                    {% endfor %}
-                </select>
-            </td>
-            <td style="padding-left: 50px;">{{ checkbox('node_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
-            <td>
-                <span class="ui-button ui-widget ui-corner-all" id="node_exp_install" title="{{lang.words.install|title()}} Node Exporter">{{lang.words.install|title()}}</span>
-            </td>
-        </tr>
-    </table>
-    <div id="ajaxmon"></div>
-    <div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
-        {{lang.words.read|title()}} <a href="https://roxy-wi.org/services/grafana" title="About Grafana and Prometheus servers" target="_blank">{{lang.words.about|title()}} Grafana and Prometheus servers</a>
-        {{lang.words.and}} <a href="https://roxy-wi.org/howto/exporters" title="About Exporters" target="_blank">{{lang.words.about|title()}} Exporters</a>
-    </div>
-{% endif %}
diff --git a/app/templates/include/port_scan_history.html b/app/templates/include/port_scan_history.html
index 0cd8e876..47d8ee36 100644
--- a/app/templates/include/port_scan_history.html
+++ b/app/templates/include/port_scan_history.html
@@ -1,5 +1,16 @@
+{% extends "base.html" %}
+{% block title %}{{ lang.p_s_page.p_s_title_history }}{% endblock %}
+{% block h2 %}{{ lang.p_s_page.p_s_title_history }}{% endblock %}
+{% block content %}
 <link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
 <script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
+<style>
+@media (max-width: 1280px) {
+	.div-pannel {
+		height: 430px !important;
+	}
+}
+</style>
 <script>
     $(document).ready(function() {
         $('#scan_history').on( 'page.dt' )
@@ -16,6 +27,9 @@
             } );
     } );
 </script>
+{% if user_status == 0 %}
+	{% include 'include/no_sub.html' %}
+{% else %}
 <table class="overview hover order-column display compact" id="scan_history">
     <thead>
         <tr class="overviewHead">
@@ -28,8 +42,8 @@
         </tr>
     </thead>
     <tbody>
-    {% if port_scanner_settings != '' %}
-    {% for t in port_scanner_settings %}
+    {% if history != '' %}
+    {% for t in history %}
     {% set date_time = t.date|string %}
     <tr>
         <td class="padding10" style="width: 10%; padding: 7px 7px 7px 10px;">
@@ -52,4 +66,6 @@
     <span class="alert alert-warning" style="margin-bottom: 0px;">Table is empty</span>
     {% endif %}
     </tbody>
-</table>
\ No newline at end of file
+</table>
+{% endif %}
+{% endblock %}
diff --git a/app/templates/include/provisioning/creating_dialogs.html b/app/templates/include/provisioning/creating_dialogs.html
deleted file mode 100644
index 44fb4167..00000000
--- a/app/templates/include/provisioning/creating_dialogs.html
+++ /dev/null
@@ -1,494 +0,0 @@
-{% from 'include/provisioning/variables.html' import generate_opt_options %}
-<div id="do_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview provisioning_table">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td colspan="2" class="headers">
-                <b>General information</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Server name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('do_create_server_name', required='required', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div>
-            </td>
-        </tr>
-         {% if role == 1 %}
-        <tr>
-            <td class="padding20">
-                Group
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="do_create_group">
-                {% for group in groups %}
-					<option value="{{ group.group_id }}">{{ group.name }}</option>
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        {% else %}
-            {{input('do_create_group', value=groups, type='hidden')}}
-        {% endif %}
-        <tr>
-            <td class="padding20">
-                Provider credentials
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="do_create_provider">
-                {% for p in providers %}
-                    {% if p.type == 'do' %}
-					<option value="{{ p.id }}">{{ p.name }}</option>
-                    {% endif %}
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Region
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('do_create_regions', 'do', 'region', params) }}
-                <div class="tooltip tooltipTop tooltipTd">Not all regions may be active</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Instance</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Size
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('do_create_size', 'do', 'size', params) }}
-                {{input('do_create_size_text', size='26', style='display: none')}}
-                <a class="link" id="do-instance-enter">Enter manually</a>
-                <a class="link" id="do-instance-enter-select" style="display: none; margin-left: 27px;">Change to select</a>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                OS
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('do_create_oss', 'do', 'image', params) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                SSH
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="do_create_ssh_choose">
-                    <option value="none" disabled selected>Choose SSH</option>
-                    <option value="ssh_name">Set SSH key name</option>
-                    <option value="ssh_ids">Set SSH key ids</option>
-                </select>
-            </td>
-        </tr>
-        <tr id="do_create_ssh_ids_tr" style="display: none;">
-            <td class="padding20 padding-top20"">
-                SSH key ids
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('do_create_ssh_ids', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">List comma separated. Required if SSH key name is empty</div>
-            </td>
-        </tr>
-        <tr id="do_create_ssh_name_tr" style="display: none;">
-            <td class="padding20 padding-top20">
-                SSH key name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('do_create_ssh_name', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">Required if SSH key ids is empty</div>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">Monitoring</td>
-            <td>{{checkbox('do_create_monitoring', checked='checked')}}</td>
-        </tr>
-        <tr>
-            <td class="padding20">Backup</td>
-            <td>{{checkbox('do_create_backup')}}</td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Network</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">Private IP</td>
-            <td>{{checkbox('do_create_private_net', checked='checked')}}</td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">Floating IP</td>
-            <td>{{checkbox('do_create_floating_net')}}<div class="tooltip tooltipTop tooltipTd">If unchecked then will be used public IP</div></td>
-        </tr>
-        <tr>
-            <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
-            <td>
-                {{checkbox('do_create_firewall', checked='checked')}}
-                <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create firewall and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be opened</div>
-            </td>
-        </tr>
-    </table>
-</div>
-<div id="aws_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview provisioning_table">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td colspan="2" class="headers">
-                <b>General information</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Server name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('aws_create_server_name', required='required', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div>
-            </td>
-        </tr>
-         {% if role == 1 %}
-        <tr>
-            <td class="padding20">
-                Group
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="aws_create_group">
-                {% for group in groups %}
-					<option value="{{ group.group_id }}">{{ group.name }}</option>
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        {% else %}
-            {{input('aws_create_group', value=groups, type='hidden')}}
-        {% endif %}
-        <tr>
-            <td class="padding20">
-                Provider credentials
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="aws_create_provider">
-                {% for p in providers %}
-                    {% if p.type == 'aws' %}
-					<option value="{{ p.id }}">{{ p.name }}</option>
-                    {% endif %}
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Region
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('aws_create_regions', 'aws', 'region', params) }}
-                <div class="tooltip tooltipTop tooltipTd">Not all regions may be active</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Instance</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Instance type
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('aws_create_size', required='required', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">
-                    Instance types list is <a href="https://aws.amazon.com/ec2/instance-types/" title="Instance types list" target="_blank">here</a>
-                </div>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                OS
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('aws_create_oss', 'aws', 'image', params) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                SSH key pair name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('aws_create_ssh_name', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">SSH key must exists in region where instance create</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Volume</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Volume size
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('aws_create_volume_size', size='26', value='10', type='number')}}Gb
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Volume type
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('aws_create_volume_type', 'aws', 'volume_type', params) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">Delete on termination</td>
-            <td>
-                {{checkbox('aws_create_delete_on_termination', checked='checked')}}
-                <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Network</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">Public IP</td>
-            <td>
-                <select id="aws_create_public_ip">
-                    <option value="public">Public IP</option>
-                    <option value="elastic">Elastic IP</option>
-                    <option value="none">None</option>
-                </select>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
-            <td>
-                {{checkbox('aws_create_firewall', checked='checked')}}
-                <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise, all ports will be closed</div>
-            </td>
-        </tr>
-    </table>
-</div>
-<div id="gcore_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview provisioning_table">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td colspan="2" class="headers">
-                <b>General information</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                Server name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('gcore_create_server_name', required='required', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div>
-            </td>
-        </tr>
-         {% if role == 1 %}
-        <tr>
-            <td class="padding20">
-                Group
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="gcore_create_group">
-                {% for group in groups %}
-					<option value="{{ group.group_id }}">{{ group.name }}</option>
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        {% else %}
-            {{input('gcore_create_group', value=groups, type='hidden')}}
-        {% endif %}
-        <tr>
-            <td class="padding20">
-                Provider credentials
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="gcore_create_provider">
-                {% for p in providers %}
-                    {% if p.type == 'gcore' %}
-					<option value="{{ p.id }}">{{ p.name }}</option>
-                    {% endif %}
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Region
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('gcore_create_regions', 'gcore', 'region', params) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Project name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('gcore_create_project_name', size='26', value='default')}}
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Instance</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Flavor
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('gcore_create_size', 'gcore', 'size', params) }}
-                {{ input('gcore_create_size_text', size='26', style='display: none') }}
-                <a class="link" id="gcore-instance-enter">Enter manually</a>
-                <a class="link" id="gcore-instance-enter-select" style="display: none; margin-left: 27px;">Change to select</a>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                OS
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('gcore_create_oss', 'gcore', 'image', params) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">
-                SSH key pair name
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('gcore_create_ssh_name', size='26')}}
-                <div class="tooltip tooltipTop tooltipTd">SSH key must exists in region where instance create</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Volume</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Volume size
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{input('gcore_create_volume_size', size='26', value='10', type='number')}}Gb
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                Volume type
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                {{ generate_opt_options('gcore_create_volume_type', 'gcore', 'volume_type', params) }}
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20 padding-top20">Delete on termination</td>
-            <td>
-                {{checkbox('gcore_create_delete_on_termination', checked='checked')}}
-                <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div>
-            </td>
-        </tr>
-        <tr>
-            <td colspan="2" class="headers">
-                <b>Network</b>
-            </td>
-        </tr>
-        <tr>
-            <td class="padding20">Network Type</td>
-            <td>
-                <select id="gcore_create_network_type">
-                    <option value="external">External IP</option>
-                    <option value="any_subnet">Custom Network</option>
-                </select>
-            </td>
-        </tr>
-        <tr id="gcore_any_subnet" style="display: none">
-            <td class="padding20">
-                Network name
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_create_network_name', size='26')}}</td>
-        </tr>
-        <tr>
-            <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td>
-            <td>
-                {{checkbox('gcore_create_firewall', checked='checked')}}
-                <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise will be used the default SG</div>
-            </td>
-        </tr>
-    </table>
-</div>
-<div id="server_creating" style="display: none;">
-    <ul style="padding: 20px 20px 0px 20px;font-size: 15px;">
-        <li id="creating-init" class="server-creating">Creating environment...</li>
-        <li id="creating-vars" class="server-creating">Creating vars...</li>
-        <li id="creating-validate" class="server-creating">Validation...</li>
-        <li id="creating-workspace" class="server-creating">Creating workspace...</li>
-        <li id="creating-server" class="server-creating">Creating server...</li>
-    </ul>
-    <div id="wait-mess"></div>
-    <div id="created-mess" class="alert alert-success" style="display:none;"></div>
-    <div id="creating-error" class="alert alert-danger" style="display:none;"></div>
-    <div class="progress-bar-striped">
-        <div id="creating-progress" style="width: 0%;"></div>
-    </div>
-</div>
-<div id="server_editing" style="display: none;">
-    <ul style="padding: 20px 20px 0px 20px;font-size: 15px;">
-        <li id="editing-init" class="server-creating">Updating environment...</li>
-        <li id="editing-vars" class="server-creating">Updating vars...</li>
-        <li id="editing-validate" class="server-creating">Validation...</li>
-        <li id="editing-workspace" class="server-creating">Updating workspace...</li>
-        <li id="editing-server" class="server-creating">Updating server...</li>
-    </ul>
-    <div id="editing-wait-mess"></div>
-    <div id="edited-mess" class="alert alert-success" style="display:none;"></div>
-    <div id="editing-error" class="alert alert-danger" style="display:none;"></div>
-    <div class="progress-bar-striped">
-        <div id="editing-progress" style="width: 0%;"></div>
-    </div>
-</div>
diff --git a/app/templates/include/provisioning/providers_dialogs.html b/app/templates/include/provisioning/providers_dialogs.html
deleted file mode 100644
index 41c02c25..00000000
--- a/app/templates/include/provisioning/providers_dialogs.html
+++ /dev/null
@@ -1,212 +0,0 @@
-{% from 'include/provisioning/variables.html' import generate_opt_options %}
-<div id="add_providers_choosing" style="display: none;">
-    {{ generate_opt_options('add_select_providers', 'all', 'provider', params, optgroup=false) }}
-</div>
-<div id="create_providers_choosing" style="display: none;">
-    {{ generate_opt_options('create_select_providers', 'all', 'provider', params, optgroup=false) }}
-</div>
-<div id="aws_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.provider|title()}} {{lang.words.name}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('aws_new_name', required='required', size='30')}}</td>
-        </tr>
-        {% if role == 1 %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.group|title()}}
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="aws_new_group">
-                {% for group in groups %}
-					<option value="{{ group.group_id }}">{{ group.name }}</option>
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        {% else %}
-            {{input('aws_new_group', value=groups, type='hidden')}}
-        {% endif %}
-        <tr>
-            <td class="padding20">
-                ACCESS_KEY
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('aws_new_key', required='required', size='30')}}</td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                SECRET_KEY
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('aws_new_secret', required='required', size='30')}}</td>
-        </tr>
-    </table>
-    <div class="alert alert-info">
-        How to get the AWS access key read <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html" target="_blank"><b>here</b></a>
-    </div>
-</div>
-<div id="do_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.provider|title()}} {{lang.words.name}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('do_new_name', required='required', size='30')}}</td>
-        </tr>
-        {% if role == 1 %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.group|title()}}
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="do_new_group">
-                {% for group in groups %}
-					<option value="{{ group.group_id }}">{{ group.name }}</option>
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        {% else %}
-            {{input('do_new_group', value=groups, type='hidden')}}
-        {% endif %}
-        <tr>
-            <td class="padding20">
-                TOKEN
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('do_new_token', required='required', size='30')}}</td>
-        </tr>
-    </table>
-    <div class="alert alert-info">
-        How to get the DigitalOcean token read <a href="https://www.digitalocean.com/docs/apis-clis/api/create-personal-access-token" target="_blank"><b>here</b></a>
-    </div>
-</div>
-<div id="gcore_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.provider|title()}} {{lang.words.name}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_new_name', required='required', size='30')}}</td>
-        </tr>
-        {% if role == 1 %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.group|title()}}
-                <span class="need-field">*</span>
-            </td>
-            <td>
-                <select id="gcore_new_group">
-                {% for group in groups %}
-					<option value="{{ group.group_id }}">{{ group.name }}</option>
-                {% endfor %}
-                </select>
-            </td>
-        </tr>
-        {% else %}
-            {{input('gcore_new_group', value=groups, type='hidden')}}
-        {% endif %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.username|title()}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_new_user', required='required', size='30')}}</td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                {{lang.words.password|title()}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_new_pass', required='required', type='password', size='30')}}</td>
-        </tr>
-    </table>
-</div>
-<div id="aws_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.provider|title()}} {{lang.words.name}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('aws_edit_provider_name', required='required', size='30')}}</td>
-        </tr>
-        {{input('aws_edit_provider_group', value=groups, type='hidden')}}
-        {{input('aws_edit_provider_id', type='hidden')}}
-        <tr>
-            <td class="padding20">
-                ACCESS_KEY
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('aws_edit_provider_key', required='required', size='30')}}</td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                SECRET_KEY
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('aws_edit_provider_secret', required='required', size='30')}}</td>
-        </tr>
-    </table>
-</div>
-<div id="do_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.provider|title()}} {{lang.words.name}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('do_edit_provider_name', required='required', size='30')}}</td>
-        </tr>
-        {{input('do_edit_provider_group', value=groups, type='hidden')}}
-        {{input('do_edit_provider_id', type='hidden')}}
-        <tr>
-            <td class="padding20">
-                TOKEN
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('do_edit_provider_token', required='required', size='30')}}</td>
-        </tr>
-    </table>
-</div>
-<div id="gcore_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;">
-    <table class="overview">
-        {% include 'include/tr_validate_tips.html' %}
-        <tr>
-            <td class="padding20">
-                {{lang.words.provider|title()}} {{lang.words.name}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_edit_provider_name', required='required', size='30')}}</td>
-        </tr>
-        {{input('gcore_edit_provider_group', value=groups, type='hidden')}}
-        {{input('gcore_edit_provider_id', type='hidden')}}
-        <tr>
-            <td class="padding20">
-                {{lang.words.username|title()}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_edit_provider_user', required='required', size='30')}}</td>
-        </tr>
-        <tr>
-            <td class="padding20">
-                {{lang.words.password|title()}}
-                <span class="need-field">*</span>
-            </td>
-            <td>{{input('gcore_edit_provider_password', required='required', type='password', size='30')}}</td>
-        </tr>
-    </table>
-</div>
diff --git a/app/templates/include/provisioning/variables.html b/app/templates/include/provisioning/variables.html
deleted file mode 100644
index 1eb13e06..00000000
--- a/app/templates/include/provisioning/variables.html
+++ /dev/null
@@ -1,98 +0,0 @@
-{% from 'include/input_macros.html' import copy_to_clipboard %}
-
-{%- macro generate_opt_options(id, provider, param_section, params, name='', required='', first='', class='', selected='', disabled='true', optgroup=true) -%}
-	{% if name == '' %}
-		{% set name = id %}
-	{% endif %}
-	{% if disabled == 'true' %}
-		{% set disabled = 'disabled' %}
-	{% else %}
-		{% set disabled = '' %}
-	{% endif %}
-    {% set section = namespace(section='') %}
-    <select id="{{id}}" name="{{name}}" {{required}}>
-    {% for p in params %}
-        {% if (p.provider == provider and p.section == param_section) or (provider == 'all' and p.section == param_section) %}
-            {% if optgroup %}
-                {% if section.section|string() != p.optgroup|string() %}
-                    <optgroup label="{{p.optgroup}}">
-                {% endif %}
-            {% endif %}
-            {% set section.section = p.optgroup %}
-            {% if first == value %}
-                <option value="{{p.param}}" selected data-class="avatar" data-style="background-image: url(&apos;{{p.image}}&apos;)">{{p.name}}</option>
-            {% else %}
-                <option value="{{p.param}}" data-class="avatar" data-style="background-image: url(&apos;{{p.image}}&apos;)">{{p.name}}</option>
-            {% endif %}
-        {% endif %}
-    {% endfor %}
-    </select>
-    <script>
-        $( function() {
-            $('#{{id}}').selectmenu('destroy');
-            $.widget( "custom.iconselectmenu", $.ui.selectmenu, {
-                _renderItem: function( ul, item ) {
-                    var li = $( "<li>" ),
-                    wrapper = $( "<div>", { text: item.label } );
-
-                    if ( item.disabled ) {
-                        li.addClass( "ui-state-disabled" );
-                    }
-                    $( "<span>", {
-                        style: item.element.attr( "data-style" ),
-                        "class": "ui-icon " + item.element.attr( "data-class" )
-                    }).appendTo( wrapper );
-
-                    return li.append( wrapper ).appendTo( ul );
-                }
-            });
-            $( "#{{id}}" )
-                .iconselectmenu()
-                .iconselectmenu( "menuWidget")
-                .addClass( "ui-menu-icons avatar" );
-        } );
-  </script>
-  <style>
-      /* select with custom icons */
-      .ui-selectmenu-menu .ui-menu.customicons .ui-menu-item-wrapper {
-          padding: 0.5em 0 0.5em 3em;
-      }
-      /* select with CSS avatar icons */
-      option.avatar {
-          background-repeat: no-repeat !important;
-          padding-left: 20px;
-      }
-      .avatar .ui-icon {
-          background-position: left top;
-          height: 15px;
-          width: 23px;
-          top: -0.1em;
-      }
-  </style>
-{%- endmacro %}
-
-{%- macro get_nice_name(id, value, provider, section, params) -%}
-    {% for p in params %}
-        {% if p.section == section and p.provider == provider and p.param == value %}
-            <span style="background-image: url('{{p.image}}')" class="avatar ui-icon"></span>
-            {{ copy_to_clipboard(id=id, value=p.param, show=p.name) }}
-        {% endif %}
-    {% endfor %}
-    <style>
-      /* select with custom icons */
-      .ui-selectmenu-menu .ui-menu.customicons .ui-menu-item-wrapper {
-          padding: 0.5em 0 0.5em 3em;
-      }
-      /* select with CSS avatar icons */
-      option.avatar {
-          background-repeat: no-repeat !important;
-          padding-left: 20px;
-      }
-      .avatar .ui-icon {
-          background-position: left top;
-          height: 15px;
-          width: 23px;
-          top: -0.1em;
-      }
-  </style>
-{%- endmacro %}
diff --git a/app/templates/include/smon/smon_history.html b/app/templates/include/smon/smon_history.html
index df7d7907..6e88d9e7 100644
--- a/app/templates/include/smon/smon_history.html
+++ b/app/templates/include/smon/smon_history.html
@@ -10,8 +10,8 @@
 <link href="/inc/css/chart.min.css" rel="stylesheet">
 <link href="/inc/css/smon.css" rel="stylesheet">
 <script src="/inc/chart.min-4.3.0.js"></script>
-<script src="/inc/metrics-6.3.16.0.js"></script>
-<script src="/inc/smon-6.3.16.js"></script>
+<script src="/inc/metrics.js"></script>
+<script src="/inc/smon.js"></script>
 <div class="row wrap1">
 {% for s in smon %}
     <div id="smon_name" class="col-md-8">
diff --git a/app/templates/include/smon/smon_http_server.html b/app/templates/include/smon/smon_http_server.html
index df66acb0..cc3931c9 100644
--- a/app/templates/include/smon/smon_http_server.html
+++ b/app/templates/include/smon/smon_http_server.html
@@ -19,7 +19,7 @@
         {{ input(id, value=s_service.body, size='20') }}
     </td>
     <td>
-        {% set id = 'smon-http-method-' + s.id|string() %}
+        {% set id = 'smon-http_method-' + s.id|string() %}
         {% set http_methods = {'get': 'GET', 'post': 'POST', 'put': 'PUT', 'patch': 'PATCH', 'delete': 'DELETE',
         'head': 'HEAD', 'options': 'OPTIONS'} %}
         {{ select(id, values=http_methods, selected=s_service.method) }}
diff --git a/app/templates/include/tr_validate_tips.html b/app/templates/include/tr_validate_tips.html
index d15db958..635ac2a3 100644
--- a/app/templates/include/tr_validate_tips.html
+++ b/app/templates/include/tr_validate_tips.html
@@ -1,7 +1,7 @@
 <tr>
     <td colspan="2">
         <p class="validateTips alert alert-success">
-            {{lang.phrases.fields_mark}} "<span class="need-field">*</span>"  {{lang.phrases.are_required}}.
+            {{lang.phrases.fields_mark}} "<span class="need-field">*</span>" {{lang.phrases.are_required}}.
         </p>
     </td>
 </tr>
diff --git a/app/templates/install.html b/app/templates/install.html
new file mode 100644
index 00000000..28f63d77
--- /dev/null
+++ b/app/templates/install.html
@@ -0,0 +1,413 @@
+{% extends "base.html" %}
+{% block title %}{{lang.words.admin_area|title()}}{% endblock %}
+{% block h2 %}{{lang.words.admin_area|title()}}{% endblock %}
+{% block content %}
+{% from 'include/input_macros.html' import select, checkbox %}
+<script src="/inc/users.js"></script>
+<script src="/inc/fontawesome.min.js"></script>
+<div id="tabs">
+	<ul id="admin-tabs">
+        <li><a href="#service" title="{{lang.words.proxy|title()}} {{lang.words.service}} - Roxy-WI">{{lang.words.proxy|title()}} {{lang.words.service}}</a></li>
+        <li><a href="#monitoring" title="{{lang.words.monitoring|title()}} - Roxy-WI">{{lang.words.monitoring|title()}}</a></li>
+        <li><a href="#geolite2" title="GeoLite2 - Roxy-WI">GeoLite2</a></li>
+    </ul>
+
+    <div id="service">
+		{% if not is_needed_tool %}
+			<div style="text-align: center;">
+				<h3>{{lang.admin_page.desc.no_ansible}}</h3>.
+				<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+				<h4>
+					{{lang.words.install|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible.
+				</h4>
+			</div>
+		{% else %}
+		<table class="overview">
+			<caption><h3>{{lang.words.install|title()}} HAProxy</h3></caption>
+			<tr class="overviewHead">
+				<td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td>
+				<td class="padding10 first-collumn help_cursor" style="width: 30%;" title="{{lang.words.for|title()}} Ubuntu {{lang.admin_page.desc.latest_repo}}">
+					{{lang.words.available|title()}} {{lang.words.versions}} (?)
+				</td>
+				<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td>
+				<td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}">{{lang.words.use|title()}} Docker</td>
+				<td>SYN-flood {{lang.words.protection}}</td>
+				<td></td>
+			</tr>
+			<tr>
+				<td id="cur_haproxy_ver" class="padding10 first-collumn">
+				</td>
+				<td class="padding10 first-collumn" style="width: 20%;">
+					{% set values = dict() %}
+					{% set values = {'2.4.23-1':'2.4.23-1','2.5.14-1':'2.5.14-1', '2.6.14-1':'2.6.14-1','2.7.9-1':'2.7.9-1','2.8.1-1':'2.8.1-1'} %}
+					{{ select('hapver',  values=values, selected='2.8.1-1', required='required') }}
+				</td>
+				<td class="padding10 first-collumn">
+					<select autofocus required name="haproxyaddserv" id="haproxyaddserv">
+						<option disabled selected>------</option>
+						{% for select in servers %}
+								<option value="{{ select.2 }}">{{ select.1 }}</option>
+						{% endfor %}
+					</select>
+				</td>
+				<td style="padding-left: 25px;">
+					{{ checkbox('haproxy_docker', title=lang.admin_page.desc.install_as_docker) }}
+				</td>
+				<td class="syn-flood-protection-field">
+					{{ checkbox('syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
+				</td>
+				<td>
+					<span class="ui-button ui-widget ui-corner-all" id="install" title="{{lang.words.install|title()}} HAProxy">{{lang.words.install|title()}}</span>
+				</td>
+			</tr>
+		</table>
+		<table>
+			<caption><h3>{{lang.words.install|title()}} NGINX</h3></caption>
+			<tr class="overviewHead">
+				<td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td>
+				<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+				<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td>
+				<td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td>
+				<td>SYN-flood {{lang.words.protection}}</td>
+				<td></td>
+			</tr>
+			<tr>
+				<td id="cur_nginx_ver" class="padding10 first-collumn">
+				</td>
+				<td class="padding10 first-collumn" style="width: 20%;">
+					{{lang.admin_page.desc.latest_repo}}
+				</td>
+				<td class="padding10 first-collumn">
+					<select autofocus required name="nginxaddserv" id="nginxaddserv">
+						<option disabled selected>------</option>
+						{% for select in servers %}
+								<option value="{{ select.2 }}">{{ select.1 }}</option>
+						{% endfor %}
+					</select>
+				</td>
+				<td style="padding-left: 25px;">
+					{{ checkbox('nginx_docker', title=lang.admin_page.desc.install_as_docker) }}
+				</td>
+				<td class="syn-flood-protection-field">
+					{{ checkbox('nginx_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
+				</td>
+				<td>
+					<span class="ui-button ui-widget ui-corner-all" id="nginx_install" title="{{lang.words.install|title()}} NGINX">{{lang.words.install|title()}}</span>
+				</td>
+			</tr>
+		</table>
+		<table>
+			<caption><h3>{{lang.words.install|title()}} Apache</h3></caption>
+			<tr class="overviewHead">
+				<td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td>
+				<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+				<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td>
+				<td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td>
+				<td>SYN-flood {{lang.words.protection}}</td>
+				<td></td>
+			</tr>
+			<tr>
+				<td id="cur_apache_ver" class="padding10 first-collumn">
+				</td>
+				<td class="padding10 first-collumn" style="width: 20%;">
+					{{lang.admin_page.desc.latest_repo}}
+				</td>
+				<td class="padding10 first-collumn">
+					<select autofocus required name="apacheaddserv" id="apacheaddserv">
+						<option disabled selected>------</option>
+						{% for select in servers %}
+								<option value="{{ select.2 }}">{{ select.1 }}</option>
+						{% endfor %}
+					</select>
+				</td>
+				<td style="padding-left: 25px;">
+					{{ checkbox('apache_docker', title=lang.admin_page.desc.install_as_docker) }}
+				</td>
+				<td class="syn-flood-protection-field">
+					{{ checkbox('apache_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
+				</td>
+				<td>
+					<span class="ui-button ui-widget ui-corner-all" id="apache_install" title="{{lang.words.install|title()}} Apache">{{lang.words.install|title()}}</span>
+				</td>
+			</tr>
+		</table>
+		<div id="ajax"></div>
+		{% endif %}
+    </div>
+
+    <div id="monitoring">
+        {% if not is_needed_tool %}
+        <div style="text-align: center;">
+            <h3>{{lang.admin_page.desc.no_ansible}} Ansible</h3>.
+            <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+            <h4>
+                {{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">here</a> {{lang.phrases.how_to_install}} Ansible.
+            </h4>
+        </div>
+        {% else %}
+        {% if role|int() == 1 %}
+        <table id="grafana-table">
+            <caption><i class="fas fa-chart-bar caption-icon2"></i><h3>Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}</h3></caption>
+            <tr class="overviewHead">
+                <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
+                <td class="padding10 first-collumn" style="width: 40%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.note|title()}}</td>
+                <td></td>
+                <td></td>
+            </tr>
+            <tr>
+                <td id="cur_grafana_ver" class="padding10 first-collumn">
+                    {% if grafana == "active" %}
+                    Grafana {{lang.words.and}} Prometheus {{lang.admin_page.desc.been_installed}}
+                    {% else %}
+                    {{lang.admin_page.desc.there_are_no}}
+                    {% endif %}
+                </td>
+                <td class="padding10 first-collumn" style="width: 20%;">
+                    {{lang.admin_page.desc.latest_repo}} Grafana {{lang.words.and}} Prometheus
+                </td>
+                <td class="padding10 first-collumn">
+                    {{lang.admin_page.desc.before_install}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}
+                </td>
+                <td></td>
+                <td>
+                    {% if grafana != "active" %}
+                    <span class="ui-button ui-widget ui-corner-all" id="grafna_install" title="{{lang.words.install|title()}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}">{{lang.words.install|title()}}</span>
+                    {% endif %}
+                </td>
+            </tr>
+        </table>
+    {% endif %}
+        <table id="haproxy-table">
+            <caption><i class="fas fa-network-wired caption-icon2"></i><h3>HAProxy Exporter</h3></caption>
+            <tr class="overviewHead">
+                <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
+                <td class="help_cursor" style="width: 20%;" data-intro="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
+                <td></td>
+                <td></td>
+            </tr>
+            <tr>
+                <td id="cur_haproxy_exp_ver" class="padding10 first-collumn"></td>
+                <td class="padding10 first-collumn" style="width: 20%;">
+                    {% set values = dict() %}
+                    {% set values = {'0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0', '0.12.0':'0.12.0', '0.13.0':'0.13.0', '0.14.0':'0.14.0', '0.15.0':'0.15.0'} %}
+                    {{ select('hapexpver',  values=values, selected='0.15.0') }}
+                </td>
+                <td class="padding10 first-collumn">
+                    <select autofocus required name="haproxy_exp_addserv" id="haproxy_exp_addserv">
+                        <option disabled selected>------</option>
+                        {% for select in servers %}
+                        <option value="{{ select.2 }}">{{ select.1 }}</option>
+                        {% endfor %}
+                    </select>
+                </td>
+                <td style="padding-left: 50px;">{{ checkbox('haproxy_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
+                <td>
+                    <span class="ui-button ui-widget ui-corner-all" id="haproxy_exp_install" title="{{lang.words.install|title()}} HAProxy Exporter">{{lang.words.install|title()}}</span>
+                </td>
+            </tr>
+        </table>
+        <table id="nginx-table">
+            <caption><i class="fas fa-sitemap caption-icon2"></i><h3>NGINX Exporter</h3></caption>
+            <tr class="overviewHead">
+                <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
+                <td class="help_cursor" style="width: 20%;" data-help="lang.admin_page.desc.ext_prom">{{lang.words.external|title()}} Prometheus</td>
+                <td></td>
+                <td></td>
+            </tr>
+            <tr>
+                <td id="cur_nginx_exp_ver" class="padding10 first-collumn"></td>
+                <td class="padding10 first-collumn" style="width: 20%;">
+                    {% set values = dict() %}
+                    {% set values = {'0.6.0':'0.6.0', '0.7.0':'0.7.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0'} %}
+                    {{ select('nginxexpver',  values=values, selected='0.11.0') }}
+                </td>
+                <td class="padding10 first-collumn">
+                    <select autofocus required name="nginx_exp_addserv" id="nginx_exp_addserv">
+                        <option disabled selected>------</option>
+                        {% for select in servers %}
+                        <option value="{{ select.2 }}">{{ select.1 }}</option>
+                        {% endfor %}
+                    </select>
+                </td>
+                <td style="padding-left: 50px;">{{ checkbox('nginx_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
+                <td>
+                    <span class="ui-button ui-widget ui-corner-all" id="nginx_exp_install" title="{{lang.words.install|title()}} NGINX Exporter">{{lang.words.install|title()}}</span>
+                </td>
+            </tr>
+        </table>
+        <table id="apache-table">
+            <caption><i class="fas fa-feather-alt caption-icon2"></i><h3>Apache Exporter</h3></caption>
+            <tr class="overviewHead">
+                <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
+                <td class="help_cursor" style="width: 20%;" data-help="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
+                <td></td>
+                <td></td>
+            </tr>
+            <tr>
+                <td id="cur_apache_exp_ver" class="padding10 first-collumn"></td>
+                <td class="padding10 first-collumn" style="width: 20%;">
+                    {% set values = dict() %}
+                    {% set values = {'0.10.0':'0.10.0', '0.13.4':'0.13.4', '1.0.1':'1.0.1'} %}
+                    {{ select('apacheexpver',  values=values, selected='1.0.1') }}
+                </td>
+                <td class="padding10 first-collumn">
+                    <select autofocus required name="apache_exp_addserv" id="apache_exp_addserv">
+                        <option disabled selected>------</option>
+                        {% for select in servers %}
+                        <option value="{{ select.2 }}">{{ select.1 }}</option>
+                        {% endfor %}
+                    </select>
+                </td>
+                <td style="padding-left: 50px;">{{ checkbox('apache_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
+                <td>
+                    <span class="ui-button ui-widget ui-corner-all" id="apache_exp_install" title="{{lang.words.install|title()}} Apache Exporter">{{lang.words.install|title()}}</span>
+                </td>
+            </tr>
+        </table>
+        <table id="keepalived-table">
+            <caption><i class="fas fa-cloud caption-icon2"></i><h3>Keepalived Exporter</h3></caption>
+            <tr class="overviewHead">
+                <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
+                <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
+                <td></td>
+                <td></td>
+            </tr>
+            <tr>
+                <td id="cur_keepalived_exp_ver" class="padding10 first-collumn"></td>
+                <td class="padding10 first-collumn" style="width: 20%;">
+                    {% set values = dict() %}
+                    {% set values = {'0.1.0':'0.1.0', '0.2.0':'0.2.0', '0.3.0':'0.3.0', '0.4.0':'0.4.0', '0.5.0':'0.5.0'} %}
+                    {{ select('keepalivedexpver',  values=values, selected='0.5.0') }}
+                </td>
+                <td class="padding10 first-collumn">
+                    <select autofocus required name="keepalived_exp_addserv" id="keepalived_exp_addserv">
+                        <option disabled selected>------</option>
+                        {% for select in servers %}
+                        <option value="{{ select.2 }}">{{ select.1 }}</option>
+                        {% endfor %}
+                    </select>
+                </td>
+                <td style="padding-left: 50px;">{{ checkbox('keepalived_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
+                <td>
+                    <span class="ui-button ui-widget ui-corner-all" id="keepalived_exp_install" title="{{lang.words.install|title()}} Keepalived Exporter">{{lang.words.install|title()}}</span>
+                </td>
+            </tr>
+        </table>
+        <table style="margin-top: 20px" id="node-table">
+            <caption><i class="fas fa-server caption-icon2"></i><h3>Node Exporter</h3></caption>
+            <tr class="overviewHead">
+                <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
+                <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
+                <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
+                <td></td>
+                <td></td>
+            </tr>
+            <tr>
+                <td id="cur_node_exp_ver" class="padding10 first-collumn"></td>
+                <td class="padding10 first-collumn" style="width: 20%;">
+                    {% set values = dict() %}
+                    {% set values = {'1.2.0':'1.2.0', '1.2.2':'1.2.2', '1.3.0':'1.3.0', '1.3.1':'1.3.1', '1.5.0':'1.5.0', '1.6.1':'1.6.1'} %}
+                    {{ select('nodeexpver',  values=values, selected='1.6.1') }}
+                </td>
+                <td class="padding10 first-collumn">
+                    <select autofocus required name="node_exp_addserv" id="node_exp_addserv">
+                        <option disabled selected>------</option>
+                        {% for select in servers %}
+                        <option value="{{ select.2 }}">{{ select.1 }}</option>
+                        {% endfor %}
+                    </select>
+                </td>
+                <td style="padding-left: 50px;">{{ checkbox('node_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td>
+                <td>
+                    <span class="ui-button ui-widget ui-corner-all" id="node_exp_install" title="{{lang.words.install|title()}} Node Exporter">{{lang.words.install|title()}}</span>
+                </td>
+            </tr>
+        </table>
+        <div id="ajaxmon"></div>
+        <div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
+            {{lang.words.read|title()}} <a href="https://roxy-wi.org/services/grafana" title="About Grafana and Prometheus servers" target="_blank">{{lang.words.about|title()}} Grafana and Prometheus servers</a>
+            {{lang.words.and}} <a href="https://roxy-wi.org/howto/exporters" title="About Exporters" target="_blank">{{lang.words.about|title()}} Exporters</a>
+        </div>
+    </div>
+    <div id="geolite2">
+		<table>
+			{% if not is_needed_tool %}
+				<div style="text-align: center;">
+					<h3>{{lang.admin_page.desc.no_ansible}}</h3>.
+					<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+					<h4>
+						{{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible.
+					</h4>
+				</div>
+			{% else %}
+			<caption><h3>Install GeoLite2</h3></caption>
+			<tr class="overviewHead">
+				<td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
+				<td class="padding10 first-collumn">{{lang.words.service|title()}}</td>
+				<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
+				<td class="" style="width: 30%;" title="GeoLite2 DB is released every Tuesday. Should Roxy-WI update it?">{{lang.words.updating|title()}}</td>
+				<td></td>
+				<td></td>
+			</tr>
+			<tr>
+				<td class="padding10 first-collumn">
+					<select autofocus required name="geoipserv" id="geoipserv">
+						<option disabled selected>------</option>
+						{% for select in servers %}
+						<option value="{{ select.2 }}">{{ select.1 }}</option>
+						{% endfor %}
+					</select>
+				</td>
+				<td class="padding10 first-collumn">
+					<select autofocus required name="geoip_service" id="geoip_service">
+						<option disabled selected>------</option>
+						<option value="haproxy">HAProxy</option>
+						<option value="nginx">NGINX</option>
+					</select>
+				</td>
+				<td id="cur_geoip" class="padding10"></td>
+				<td class="checkbox">
+					{{ checkbox('updating_geoip', title="Update the database?", checked='checked') }}
+				</td>
+				<td>
+					<span class="ui-button ui-widget ui-corner-all" id="geoip_install" title="{{lang.words.install|title()}} GeoLite2" style="display: none;">{{lang.words.install|title()}}</span>
+				</td>
+			</tr>
+			{% endif %}
+		</table>
+		<div id="ajax-geoip"></div>
+		<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px; margin-bottom: 15px;">
+			{{lang.phrases.howto_user}} {{lang.words.read}} {{lang.words.in}} {{lang.words.this2}} <a href="https://roxy-wi.org/howto/geoip" title="GeoLite2 {{lang.words.descr|title()}}" target="_blank">{{lang.words.article}}</a>
+		</div>
+		<table style="min-width: 40%;">
+			<tr class="overviewHead">
+				<th colspan=13 style="background-color: #d1ecf1; padding: 10px;">
+					<span id="table_metrics_head" style="margin-left: 5px;">{{lang.admin_page.desc.country_codes}}</span>
+					<select id="geoip_select">
+					{% for code in geoip_country_codes %}
+					<option>{{code.name}} {{code.code}}</option>
+					{% endfor %}
+					</select>
+				</th>
+			</tr>
+		</table>
+	</div>
+</div>
+{% endif %}
+<script>
+    $('#geoip_select').select2();
+    $( function() {
+        $("#geoip_select").selectmenu("destroy");
+    });
+</script>
+{% endblock %}
diff --git a/app/templates/languages/en.html b/app/templates/languages/en.html
index 5d4dbc52..75dce292 100644
--- a/app/templates/languages/en.html
+++ b/app/templates/languages/en.html
@@ -472,6 +472,8 @@
         "is_enabled_and_down": "Port scanner is enabled, but service is DOWN",
         "scanning_ports": "Scanning open/filtered ports for the server",
         "total_open_ports": "Total opened ports",
+        "p_s_title": "Port scanner dashboard",
+        "p_s_title_history": "Port scanner history for",
         }
     }
 %}
@@ -877,5 +879,6 @@
     "maps": "maps",
     "map": "map",
     "method": "method",
+    "tools": "tools",
     }
 %}
diff --git a/app/templates/languages/fr.html b/app/templates/languages/fr.html
index 74f9361c..09a02d13 100644
--- a/app/templates/languages/fr.html
+++ b/app/templates/languages/fr.html
@@ -472,6 +472,8 @@
         "is_enabled_and_down": "Le scanner de port est activé, mais le service est DOWN",
         "scanning_ports": "Analyse des ports ouverts/filtrés pour le serveur",
         "total_open_ports": "Total des ports ouverts",
+        "p_s_title": "Tableau de bord du scanner de ports",
+        "p_s_title_history": "Historique du scanner de ports pour",
         }
     }
 %}
@@ -877,5 +879,6 @@
     "maps": "cartes",
     "map": "carte",
     "method": "méthode",
+    "tools": "outils",
     }
 %}
diff --git a/app/templates/languages/pt-br.html b/app/templates/languages/pt-br.html
index 0db8b357..5f5f4b01 100644
--- a/app/templates/languages/pt-br.html
+++ b/app/templates/languages/pt-br.html
@@ -472,6 +472,8 @@
         "is_enabled_and_down": "O port scanner está ativado, mais o serviço está DOWN",
         "scanning_ports": "Verificando portas abertas/filtradas para o servidor",
         "total_open_ports": "Número total de portas abertas",
+        "p_s_title": "Painel do scanner de porta",
+        "p_s_title_history": "Histórico do scanner de porta para",
         }
     }
 %}
@@ -877,5 +879,6 @@
     "maps": "mapas",
     "map": "mapa",
     "method": "método",
+    "tools": "ferramentas",
     }
 %}
diff --git a/app/templates/languages/ru.html b/app/templates/languages/ru.html
index ab8487ce..c32ebc4e 100644
--- a/app/templates/languages/ru.html
+++ b/app/templates/languages/ru.html
@@ -472,6 +472,8 @@
         "is_enabled_and_down": "Port scanner включен, но сервис отключен",
         "scanning_ports": "Сканирование открытых/фильтрованных портов для сервера",
         "total_open_ports": "Всего открыто портов",
+        "p_s_title": "Дашборд Port scanner",
+        "p_s_title_history": "История Port scanner для",
         }
     }
 %}
@@ -877,5 +879,6 @@
     "maps": "карты",
     "map": "карта",
     "method": "метод",
+    "tools": "инструменты",
     }
 %}
diff --git a/app/templates/login.html b/app/templates/login.html
index d31a73f7..8087b08d 100644
--- a/app/templates/login.html
+++ b/app/templates/login.html
@@ -59,9 +59,11 @@ body, .container {
 <div id="main_div">
 	<div id="login-form" style="padding-top: 40px; padding-bottom: 50px; height: 250px; color: #000;">
 		<span id="logo_span">
-			<img src="/inc/images/logo_login.png">
+			<img src="{{ url_for('static', filename='images/logo_login.png')}}">
 		</span>
-		<form name="auth" id="auth" action="login.py" class="form-horizontal" method="post" style="margin-top: 60px;left: 0;float: left;margin-left: 93px;">
+		<form class="form-horizontal" id="auth" method="post" style="margin-top: 60px;left: 0;float: left;margin-left: 93px;">
+			<span style="color: white;font-weight: bold;padding-left: 10px;">Login/Password admin/admin</span>
+			<br>
 			<div class="fontuser">
 				{{ input('login', class='form-login', placeholder=lang.words.login|title(), required='required', autofocus='autofocus') }}
 				<i class="fa fa-user fa-lg"></i>
@@ -83,6 +85,11 @@ body, .container {
 			{{error}}
 		</div>
 		{% endif %}
+		{% with messages = get_flashed_messages(with_categories=true) %}
+          {% for category, message in messages %}
+            <div class="{{ category }}" style="width: 15%;">{{ message }}</div>
+          {% endfor %}
+        {% endwith %}
 		<div class="alert alert-danger wrong-login alert-one-row" id="wrong-login">
 			{{lang.phrases.login_or_pass_incorrect}}
 			<br />
diff --git a/app/templates/logs.html b/app/templates/logs.html
index 0dca6764..599d5dd4 100644
--- a/app/templates/logs.html
+++ b/app/templates/logs.html
@@ -8,16 +8,12 @@
 <table class="overview">
 	<tr class="overviewHead">
 		<td class="padding10 first-collumn" style="width: 10%;">
-			{% if select_id == 'viewlogs' %}
-				{{lang.words.log|title()}}
-			{% else %}
-				{{lang.words.server|title()}}
-			{% endif %}
+			{{lang.words.server|title()}}
 		</td>
-		{% if waf != '1' and select_id != 'viewlogs' %}
+		{% if not waf %}
 		<td style="width: 10%;">{{lang.words.log|title()}} {{lang.words.files|title()}}</td>
 		{% endif %}
-		{% if select_id != 'viewlogs' and service != 'nginx' %}
+		{% if service != 'nginx' %}
 		{% endif %}
 		<td style="width: 10%;">{{lang.words.number|title()}} {{lang.words.rows}}</td>
 		<td class="help_cursor" style="width: 10%;" title="" data-help="{{lang.phrases.find_in_log}}">{{lang.words.find|title()}}</td>
@@ -32,32 +28,9 @@
 	<tr>
 		<td class="padding10 first-collumn" style="width: 10%;">
 			<form action="" method="post" id="show_log_form">
-				{% if select_id == 'viewlogs' %}
-					<select autofocus required name="serv" id="{{ select_id }}">
-						<option disabled selected>------</option>
-						{% for select in selects %}
-							{% if page == 'for_editor' %}
-								{% if select.1.startswith('roxy-wi') or select.1.startswith('config_edit') or select.1.startswith('port_sca') %}
-									{% if select.0 == serv %}
-										<option value="{{ select.0 }}" selected>{{ select.1 }}</option>
-									{% else %}
-										<option value="{{ select.0 }}">{{ select.1 }}</option>
-									{% endif %}
-								{% endif %}
-							{% else %}
-								{% if select.0|int() == serv|int() %}
-									<option value="{{ select.0 }}" selected>{{ select.1 }}</option>
-								{% else %}
-									<option value="{{ select.0 }}">{{ select.1 }}</option>
-								{% endif %}
-							{% endif %}
-						{% endfor %}
-					</select>
-				{% else %}
-					{% include 'include/select.html' %}
-				{% endif %}
+				{% include 'include/select.html' %}
 		</td>
-		{% if waf != '1' and select_id != 'viewlogs' %}
+		{% if not waf %}
 		<td id="remote_log_files"></td>
 		{% endif %}
 		<td style="width: 10%;">
@@ -79,31 +52,11 @@
 	</tr>
 </table>
 <div id="ajax"></div>
-{% if select_id == 'viewlogs' and serv != '' and viewlogs != '' and viewlogs != 'roxy-wi.error.log' and viewlogs != 'roxy-wi.access.log' %}
-	<script>
-		viewLogs()
-		if (window.matchMedia('(max-width: 786px)').matches || window.matchMedia('(max-width: 1024px)').matches || window.matchMedia('(max-width: 667px)').matches) {
-			$( "#viewlogs" ).selectmenu({
-				  width: 150
-			});
-		}
-	</script>
-	<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
-		{{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a>
-	</div>
-{% elif serv == 'roxy-wi.error.log' or serv == 'roxy-wi.access.log' %}
-	<script>
-		showApacheLog('{{serv}}');
-	</script>
-	<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
-		{{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a>
-	</div>
-{% else %}
-	<script>
-		{% if waf == '1' %}
+<script>
+		{% if waf %}
 			$('#waf').prop('checked', true);
 		{% endif %}
-		{% if waf != '1' %}
+		{% if not waf %}
 			{% if remote_file %}
 				showLog()
 			{% else %}
@@ -117,13 +70,12 @@
 		{% endif %}
 
 		if (window.matchMedia('(max-width: 786px)').matches || window.matchMedia('(max-width: 1024px)').matches || window.matchMedia('(max-width: 667px)').matches) {
-			$( "#serv" ).selectmenu({
+				$( "#serv" ).selectmenu({
 				  width: 150
 			});
 			$( "#log_files" ).selectmenu({
 				  width: 150
 			});
 		}
-	</script>
-{% endif %}
-{% endblock %}
\ No newline at end of file
+</script>
+{% endblock %}
diff --git a/app/templates/logs_internal.html b/app/templates/logs_internal.html
new file mode 100644
index 00000000..f105e6c8
--- /dev/null
+++ b/app/templates/logs_internal.html
@@ -0,0 +1,76 @@
+{% extends "base.html" %}
+{% block title %}{{lang.words.internal|title()}} {{lang.words.logs}}{% endblock %}
+{% block h2 %}{{lang.words.internal|title()}} {{lang.words.logs}}{% endblock %}
+{% block content %}
+{% from 'include/input_macros.html' import input, checkbox %}
+<script src="/inc/users.js"></script>
+<input type="hidden" id="service" value="{{service}}" />
+<table class="overview">
+	<tr class="overviewHead">
+		<td class="padding10 first-collumn" style="width: 10%;">
+			{{lang.words.log|title()}}
+		</td>
+		<td style="width: 10%;">{{lang.words.number|title()}} {{lang.words.rows}}</td>
+		<td class="help_cursor" style="width: 10%;" title="" data-help="{{lang.phrases.find_in_log}}">{{lang.words.find|title()}}</td>
+		<td class="help_cursor" style="width: 10%;" title="" data-help="{{lang.phrases.exclude_in_log}}">{{lang.words.exclude|title()}}</td>
+		<td style="width: 10%;">
+			<label for="time_range_out_hour" style="padding: 0">{{lang.words.time_range|title()}}:</label>
+			{{ input('time_range_out_hour', value=hour, class='time-range', readonly='readonly') }}:{{ input('time_range_out_minut', value=minut, class='time-range', readonly='readonly') }}
+			{{ input('time_range_out_hour1', value=hour1, class='time-range', readonly='readonly') }}:{{ input('time_range_out_minut1', value=minut1, class='time-range', readonly='readonly') }}
+		</td>
+		<td></td>
+	</tr>
+	<tr>
+		<td class="padding10 first-collumn" style="width: 10%;">
+			<form action="" method="post" id="show_internal_log_form">
+				<select autofocus required name="serv" id="viewlogs">
+				    <option selected>------</option>
+                    {% for select in selects %}
+                    {% if select.0 == serv %}
+                    <option value="{{ select.0 }}" selected>{{ select.1 }}</option>
+                    {% else %}
+                    <option value="{{ select.0 }}">{{ select.1 }}</option>
+                    {% endif %}
+                    {% endfor %}
+                </select>
+		</td>
+		<td style="width: 10%;">
+			{{ input('rows', type='number', value='10', required='required', style='width: 110px;') }}
+		</td>
+		<td style="width: 10%;">
+			{{ input('grep', value=grep, style='width: 110px;') }}
+		</td>
+		<td style="width: 10%;">
+			{{ input('exgrep', value=exgrep, style='width: 110px;') }}
+		</td>
+		<td style="width: 10%;">
+			<div id="time-range"></div>
+		</td>
+		<td class="padding10 first-collumn" style="width: 1%;">
+			<button type="submit" name="Show log" value="Show" id="show_log_button">{{lang.words.show|title()}}</button>
+			</form>
+		</td>
+	</tr>
+</table>
+<div id="ajax"></div>
+{% if serv == 'roxy-wi.error.log' or serv == 'roxy-wi.access.log' %}
+	<script>
+		showApacheLog('{{serv}}');
+	</script>
+	<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
+		{{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a>
+	</div>
+{% else %}
+    <script>
+		viewLogs()
+		if (window.matchMedia('(max-width: 786px)').matches || window.matchMedia('(max-width: 1024px)').matches || window.matchMedia('(max-width: 667px)').matches) {
+			$( "#viewlogs" ).selectmenu({
+				  width: 150
+			});
+		}
+	</script>
+	<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
+		{{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a>
+	</div>
+{% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/app/templates/metrics.html b/app/templates/metrics.html
index 146dc93f..c57daf98 100644
--- a/app/templates/metrics.html
+++ b/app/templates/metrics.html
@@ -16,15 +16,16 @@
 	}
 </style>
 <link href="/inc/css/chart.min.css" rel="stylesheet">
-<script src="/inc/metrics-6.3.16.0.js"></script>
+<script src="/inc/metrics.js"></script>
 <script src="/inc/chart.min-4.3.0.js"></script>
+<input type="hidden" id="service" value="{{service}}">
 {% if user_status == 0 %}
 	{% include 'include/no_sub.html' %}
 {% elif services == '0' %}
 <div style="text-align: center;">
 	<br />
 	<h3>{{lang.phrases.metrics_not_installed}}</h3>
-	<img src="/inc/images/no_servers.png" alt="There is no server">
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
 	<h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/metrics#installation" title="Metrics {{lang.words.installation}}" style="color: #5d9ceb;" target="_blank">{{lang.words.here}}</a>
 	{{lang.phrases.how_to_install_metrics}}</h4>
 </div>
diff --git a/app/templates/nettools.html b/app/templates/nettools.html
index 26ce11ea..049388ef 100644
--- a/app/templates/nettools.html
+++ b/app/templates/nettools.html
@@ -18,7 +18,7 @@
         border: 1px solid #ccc;
     }
 </style>
-<form name="nettools_icmp_form" id="nettools_icmp_form" method="post" action="options.py">
+<form name="nettools_icmp_form" id="nettools_icmp_form" method="post" action="/app/nettols/icmp">
     <table class="overview">
         <caption><h3>ICMP</h3></caption>
         <tr class="overviewHead">
@@ -29,7 +29,7 @@
         </tr>
         <tr>
             <td class="padding10 first-collumn">
-                <select autofocus required name="nettools_icmp_server_from" id="nettools_icmp_server_from">
+                <select autofocus required name="server_from" id="nettools_icmp_server_from">
                     <option disabled selected>------</option>
                     <option value="localhost">Roxy-WI</option>
                     {% for server in servers %}
@@ -38,7 +38,7 @@
                     </select>
             </td>
             <td class="padding10 first-collumn">
-                {{ input('nettools_icmp_server_to', title='Enter IP or Name') }}
+                {{ input('nettools_icmp_server_to', name='server_to', title='Enter IP or Name') }}
                 {{ input('token', value=token, type='hidden') }}
             </td>
             <td class="padding10 first-collumn">
@@ -50,7 +50,7 @@
         </tr>
     </table>
 </form>
-<form name="nettools_telnet_form" id="nettools_telnet_form" method="post" action="options.py">
+<form name="nettools_telnet_form" id="nettools_telnet_form" method="post" action="/app/nettols/tcp">
     <table class="overview">
         <caption><h3>Check port</h3></caption>
         <tr class="overviewHead">
@@ -61,7 +61,7 @@
         </tr>
         <tr>
             <td class="padding10 first-collumn">
-                <select autofocus required name="nettools_telnet_server_from" id="nettools_telnet_server_from">
+                <select autofocus required name="server_from" id="nettools_telnet_server_from">
                     <option disabled selected>------</option>
                     <option value="localhost">Roxy-WI</option>
                     {% for server in servers %}
@@ -70,7 +70,7 @@
                 </select>
             </td>
             <td class="padding10 first-collumn">
-                {{ input('nettools_telnet_server_to', title='Enter IP or Name') }}
+                {{ input('nettools_nslookup_server_to', name='server_to', title='Enter IP or Name') }}
                 {{ input('token', value=token, type='hidden') }}
             </td>
             <td class="padding10 first-collumn">
@@ -82,7 +82,7 @@
         </tr>
     </table>
 </form>
-<form name="nettools_nslookup_form" id="nettools_nslookup_form" method="post" action="options.py">
+<form name="nettools_nslookup_form" id="nettools_nslookup_form" method="post" action="/app/nettols/dns">
     <table class="overview">
         <caption><h3>NSLookup</h3></caption>
         <tr class="overviewHead">
@@ -93,7 +93,7 @@
         </tr>
         <tr>
             <td class="padding10 first-collumn">
-                <select autofocus required name="nettools_nslookup_server_from" id="nettools_nslookup_server_from">
+                <select autofocus required name="server_from" id="nettools_nslookup_server_from">
                     <option disabled selected>------</option>
                     <option value="localhost">Roxy-WI</option>
                     {% for server in servers %}
diff --git a/app/templates/ovw.html b/app/templates/ovw.html
index eeb5971f..838e9e41 100644
--- a/app/templates/ovw.html
+++ b/app/templates/ovw.html
@@ -3,9 +3,9 @@
 {% block h2 %}{{lang.menu_links.overview.h2}}{% endblock %}
 {% block content %}
 <link href="/inc/css/chart.min.css" rel="stylesheet">
-<script src="/inc/metrics-6.3.16.0.js"></script>
+<script src="/inc/metrics.js"></script>
 <script src="/inc/chart.min-4.3.0.js"></script>
-<script src="/inc/overview-6.3.9.js"></script>
+<script src="/inc/overview.js"></script>
 <script>
 	$("#secIntervals").css("display", "none");
 	var ip = []
@@ -25,33 +25,33 @@
 	<tr class="overviewHead">
 		<td class="padding10 first-collumn-wi">
 			{% if role <= 2 %}
-				<a href="servers.py#servers" title="{{lang.words.manage|title()}} {{lang.words.servers}}">{{lang.words.servers|title()}}</a>
+				<a href="servers#servers" title="{{lang.words.manage|title()}} {{lang.words.servers}}">{{lang.words.servers|title()}}</a>
 			{% else %}
 				{{lang.words.servers|title()}}
 			{% endif %}
 		</td>
 		<td class="padding10 third-collumn-wi" style="width: 20%;">
-			<a href="/app/hapservers.py?service=haproxy" title="HAProxy {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
+			<a href="/app/service/haproxy" title="HAProxy {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
 				HAProxy
 			</a>
 		</td>
 		<td class="padding10">
-			<a href="/app/hapservers.py?service=nginx" title="NGINX {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
+			<a href="/app/service/nginx" title="NGINX {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
 				NGINX
 			</a>
 		</td>
 		<td class="padding10">
-			<a href="/app/hapservers.py?service=apache" title="Apache {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
+			<a href="/app/service/apache" title="Apache {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
 				Apache
 			</a>
 		</td>
 		<td class="padding10">
-			<a href="/app/hapservers.py?service=keepalived" title="Keepalived {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
+			<a href="/app/service/keepalived" title="Keepalived {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
 				Keepalived
 			</a>
 		</td>
 		<td class="padding10">
-			<a href="/app/waf.py?service=haproxy" title="HAProxy WAF {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
+			<a href="/app/waf/haproxy" title="HAProxy WAF {{lang.words.servers}} {{lang.words.overview}}" class="logs_link">
 				WAF
 			</a>
 		</td>
@@ -69,7 +69,7 @@
 	<tr class="overviewHead" style="height: 30px;">
 		<td class="padding10 first-collumn-wi" colspan="2">
 			{% if role <= 1 %}
-				<a href="/app/viewlogs.py?viewlogs={{roxy_wi_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
+				<a href="/app/internal/{{roxy_wi_log_id}}" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
 					Roxy-WI {{lang.words.server_status}}
 				</a>
 			{% else %}
@@ -98,7 +98,7 @@
 		<tr class="overviewHead">
 			<td class="padding10 first-collumn-wi" colspan=2>
 				{% if role <= 1 %}
-					<a href="/app/users.py#services" title="{{lang.words.view|title()}} {{lang.words.services}} {{lang.words.status}}" class="logs_link">
+					<a href="admin#services" title="{{lang.words.view|title()}} {{lang.words.services}} {{lang.words.status}}" class="logs_link">
 						Roxy-WI {{lang.words.services_status}}
 					</a>
 				{% else %}
@@ -116,7 +116,7 @@
 </table>
 {% if role <= 2 %}
 	{% if role == 2 %}
-		{% set admin_uri = 'servers.py' %}
+		{% set admin_uri = 'servers' %}
 	{% elif role == 1 %}
 		{% set admin_uri = 'users.py' %}
 	{% endif %}
@@ -152,7 +152,7 @@
 	<table class="overview-wi" id="overview-groups">
 		<tr class="overviewHead">
 			<td class="padding10 first-collumn-wi">
-				<a href="users.py#groups" title="Manage groups" class="logs_link">{{lang.words.groups|title()}}</a>
+				<a href="/app/users#groups" title="Manage groups" class="logs_link">{{lang.words.groups|title()}}</a>
 			</td>
 			<td class="second-collumn" style="width: 40%">{{lang.words.desc|title()}}</td>
 			<td>
@@ -209,9 +209,9 @@
 		<tr class="overviewHead">
 			<td class="padding10 first-collumn-wi">
 				{% if role == 2 %}
-				<a href="/app/viewlogs.py?type=2&viewlogs={{roxy_wi_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
+				<a href="/app/internal/{{roxy_wi_log_id}}?type=2" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
 				{% else %}
-				<a href="/app/viewlogs.py?viewlogs={{roxy_wi_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
+				<a href="/app/internal/{{roxy_wi_log_id}}" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
 				{% endif %}
 					{{lang.words.recent|title()}} Roxy-WI {{lang.words.logs}}
 				</a>
diff --git a/app/templates/portscanner.html b/app/templates/portscanner.html
index 7404c53b..48690400 100644
--- a/app/templates/portscanner.html
+++ b/app/templates/portscanner.html
@@ -1,18 +1,9 @@
 {% extends "base.html" %}
-{% block title %}{{ title }}{% endblock %}
-{% block h2 %}{{ title }}{% endblock %}
+{% block title %}{{ lang.p_s_page.p_s_title }}{% endblock %}
+{% block h2 %}{{ lang.p_s_page.p_s_title }}{% endblock %}
 {% block content %}
 {% from 'include/input_macros.html' import input, checkbox, select %}
-<script src="/inc/overview-6.3.9.js"></script>
-{% if serv %}
-<style>
-@media (max-width: 1280px) {
-	.div-pannel {
-		height: 430px !important;
-	}
-}
-</style>
-{% endif %}
+<script src="/inc/overview.js"></script>
 <style>
 .alert-danger {
 	width: 250px;
@@ -30,12 +21,10 @@
 {% if user_status == 0 %}
 	{% include 'include/no_sub.html' %}
 {% else %}
-{% if history %}
-	{% include 'include/port_scan_history.html' %}
-{% elif port_scanner_stderr != '' %}
+{% if port_scanner_stderr != '' %}
 <div style="text-align: center;">
 	<br />
-	<h3>{{lang.admin_page.desc.no_ansible}} Port scanner {{lang.words.service}}. {{lang.words.read|title()}} <a href="https://roxy-wi.org/services.py/portscanner"
+	<h3>{{lang.admin_page.desc.no_ansible}} Port scanner {{lang.words.service}}. {{lang.words.read|title()}} <a href="https://roxy-wi.org/services/portscanner"
 	title="Port scanner" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Port scanner {{lang.words.service}}</h3>
 </div>
 {% else %}
@@ -71,7 +60,7 @@
 						<span id="portscanner_enable_status-{{s.0}}" class="serverNone server-status" title="Port scanner {{lang.words.is}} {{lang.words.disabled}}"></span>
 					{% endif %}
 					{% if not serv %}
-						<a href="/app/portscanner.py?history={{s.2}}" title="{{lang.words.view|title()}} Port scanner {{lang.words.history2}} {{lang.words.for}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a>
+						<a href="/app/portscanner/history/{{s.2}}" title="{{lang.words.view|title()}} Port scanner {{lang.words.history2}} {{lang.words.for}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a>
 					{% else %}
 						{{s.1}}
 					{% endif %}
@@ -159,12 +148,11 @@
 <script>
 	function scanPorts(id) {
 		$.ajax({
-			url: "options.py",
-			data: {
-				scan_ports: id,
-				token: $('#token').val()
-			},
-			type: "POST",
+			url: "/app/portscanner/scan/" + id,
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
 			success: function (data) {
 				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') {
@@ -173,7 +161,7 @@
 					toastr.clear();
 					$("#show_scans_ports_body").html(data);
 					var close_word = $('#translate').attr('data-close');
-					$("#show_scans_ports" ).dialog({
+					$("#show_scans_ports").dialog({
 						resizable: false,
 						height: "auto",
 						width: 360,
@@ -181,15 +169,15 @@
 						title: "{{lang.words.opened|title()}} {{lang.words.ports}}",
 						buttons: [{
 							text: close_word,
-							click: function() {
-								$( this ).dialog( "close" );
+							click: function () {
+								$(this).dialog("close");
 								$("#show_scans_ports_body").html('');
 							}
 						}]
 					});
 				}
 			}
-		} );
+		});
 	}
 	$( ".server-act-links" ).change(function() {
 		var id = $(this).attr('id').split('-');
@@ -224,26 +212,26 @@
 			$('#portscanner_notify-'+id).checkboxradio('disable');
 			$('#portscanner_history-'+id).checkboxradio('disable');
 		}
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/portscanner/settings",
 			data: {
-				portscanner_history_server_id: id,
-				portscanner_enabled: portscanner_enabled,
-				portscanner_notify: portscanner_notify,
-				portscanner_history: portscanner_history,
+				server_id: id,
+				enabled: portscanner_enabled,
+				notify: portscanner_notify,
+				history: portscanner_history,
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					toastr.clear();
-					$("#server-"+id).addClass( "update", 1000 );
-					setTimeout(function() {
-						$( "#server-"+id).removeClass( "update" );
-					}, 2500 );
+					$("#server-" + id).addClass("update", 1000);
+					setTimeout(function () {
+						$("#server-" + id).removeClass("update");
+					}, 2500);
 				}
 			}
 		} );
diff --git a/app/templates/provisioning.html b/app/templates/provisioning.html
deleted file mode 100644
index a8372894..00000000
--- a/app/templates/provisioning.html
+++ /dev/null
@@ -1,76 +0,0 @@
-{% extends "base.html" %}
-{% block content %}
-{% from 'include/input_macros.html' import input, select, checkbox %}
-<link href="/inc/css/provisioning.css" rel="stylesheet">
-<script src="/inc/users.js"></script>
-<script src="/inc/fontawesome.min.js"></script>
-{% include 'include/del_confirm.html' %}
-<div id="tabs">
-	<ul>
-		<li><a href="#provisioning" title="Server provisioning - Roxy-WI">Provisioning</a></li>
-		<li><a href="#providers" title="Providers settings - Roxy-WI">Providers</a></li>
-		{% include 'include/login.html' %}
-	</ul>
-	<ul id='browse_histroy'></ul>
-	<div id="provisioning">
-		{% if not is_needed_tool %}
-		<div style="text-align: center;">
-			<br />
-			<h3>You have not installed Terraform.</h3>
-			<img src="/inc/images/no_servers.png" alt="There is no server">
-			<h4>Read <a href="https://www.terraform.io/downloads.html"
-			title="Download Terraform" target="_blank" class="link">here</a> how to install Terraform.</h4>
-		</div>
-		{% else %}
-        <table class="overview" id="ajax-provisioning">
-			<thead>
-				<tr class="overviewHead">
-					<th class="padding10 first-collumn">{{lang.words.name|title()}}</th>
-					<th>{{lang.words.provider|title()}}</th>
-					{% if role == 1 %}
-					<th>{{lang.words.group|title()}}</th>
-					{% endif %}
-					<th>{{lang.words.cloud|title()}}</th>
-					<th>{{lang.words.region|title()}}</th>
-					<th>{{lang.words.OS}}</th>
-					<th>IP</th>
-					<th>{{lang.words.instance_type}}</th>
-					<th>{{lang.words.status|title()}}</th>
-					<th>{{lang.words.created_at}}</th>
-					<th></th>
-					<th></th>
-				</tr>
-			</thead>
-			<tbody id="ajax-provisioning-body">
-                {% include 'ajax/provisioning/provisioned_servers.html' %}
-            </tbody>
-        </table>
-        <br /><span class="add-button" title="{{lang.words.create|title()}} {{lang.words.w_a}} {{lang.words.new}} {{lang.words.server}}" id="create-provider-button">+ {{lang.words.add|title()}}</span>
-		{% endif %}
-	</div>
-	<div id="providers">
-        <table class="overview" id="ajax-providers">
-			<thead>
-				<tr class="overviewHead">
-					<th class="padding10 first-collumn">{{lang.words.name|title()}}</th>
-					<th>{{lang.words.cloud|title()}}</th>
-					{% if role == 1 %}
-					<th>{{lang.words.group|title()}}</th>
-					{% endif %}
-					<th>{{lang.words.created_at}}</th>
-					<th>{{lang.words.edited_at}}</th>
-					<th></th>
-					<th></th>
-				</tr>
-			</thead>
-			<tbody>
-                {% include 'ajax/provisioning/providers.html' %}
-            </tbody>
-        </table>
-        <br /><span class="add-button" title="{{lang.words.add|title()}} {{lang.words.w_a}} {{lang.words.new}} {{lang.words.provider}}" id="add-provider-button">+ {{lang.words.add|title()}}</span>
-	</div>
-</div>
-{% include 'include/provisioning/creating_dialogs.html' %}
-{% include 'include/provisioning/providers_dialogs.html' %}
-<script src="/inc/provisioning.js"></script>
-{% endblock %}
diff --git a/app/templates/runtimeapi.html b/app/templates/runtimeapi.html
index a523fe1a..b382c18b 100644
--- a/app/templates/runtimeapi.html
+++ b/app/templates/runtimeapi.html
@@ -288,7 +288,7 @@
 		</table>
 		<div id="ajaxlist"></div>
 		<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
-			{{lang.phrases.read_how_it_works}} <a href="https://roxy-wi.org/description.py/runtimeapi#lists" title="{{lang.words.manage|title()}} {{lang.words.lists}}" target="_blank">{{lang.words.here}}</a>
+			{{lang.phrases.read_how_it_works}} <a href="https://roxy-wi.org/description/runtimeapi#lists" title="{{lang.words.manage|title()}} {{lang.words.lists}}" target="_blank">{{lang.words.here}}</a>
 		</div>
 	</div>
 	<div id="sessions">
diff --git a/app/templates/sections.html b/app/templates/sections.html
index 1e80e25c..c06a6eeb 100644
--- a/app/templates/sections.html
+++ b/app/templates/sections.html
@@ -3,7 +3,7 @@
 {% block h2 %}{{lang.words.edit|title()}} {{lang.words.section2}} {% endblock %}
 {% block content %}
 {% if is_serv_protected and role > 2 %}
-<meta http-equiv="refresh" content="0; url=/app/hapservers.py?service={{service}}">
+<meta http-equiv="refresh" content="0; url=/app/service/{{service}}">
 {% else %}
 <link rel="stylesheet" href="/inc/codemirror/lib/codemirror.css">
 <link rel="stylesheet" href="/inc/codemirror/addon/dialog/dialog.css">
@@ -24,11 +24,11 @@
 <script src="/inc/codemirror/addon/fold/brace-fold.js"></script>
 <script src="/inc/codemirror/addon/fold/comment-fold.js"></script>
 <script src="/inc/codemirror/addon/scroll/annotatescrollbar.js"></script>
-<script src="/inc/codemirror/mode/nginx.js"></script>
 <script src="/inc/codemirror/mode/haproxy.js"></script>
 <script src="/inc/codemirror/keymap/sublime.js"></script>
-<form action="{{ action }}" method="post" class="left-space" style="margin-top: var(--indent);">
-	<select autofocus required name="section" id="{{ select_id }}">
+<script src="/inc/configshow.js"></script>
+<div class="left-space" style="margin-top: var(--indent);">
+	<select autofocus required name="section" id="section">
 		<option disabled>------</option>
 		{% for s in sections %}
 			{% if s == section %}
@@ -38,20 +38,21 @@
 			{% endif %}
 		{% endfor %}
 	</select>
-	<input type="hidden" value="{{ serv }}" name="serv">
+	<input type="hidden" value="{{ serv }}" name="serv" id="serv">
 	{% if role <= 3 %}
-		<button type="submit" value="open" name="open" class="btn btn-default" title="{{lang.words.edit|title()}} {{lang.words.running}} {{lang.words.config}}">{{lang.words.edit|title()}}</button>
+		<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.edit|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="openSection()">{{lang.words.edit|title()}}</a>
 	{% endif %}
-</form>
+</div>
 	{% if config %}
 		{% if role <= 3 %}
 			<div id="config" class="left-space">
 				<h4>{{lang.phrases.you_are_editing}} "{{section}}" {{lang.phrases.section_from_server}} {{ serv }}</h4>
-				<form action="{{ action }}" name="saveconfig" method="post">
+				<form action="/app/config/section/haproxy/{{serv}}/save" name="saveconfig" id="saveconfig" method="post">
 					<input type="hidden" value="{{ serv }}" name="serv">
 					<input type="hidden" value="{{ start_line }}" name="start_line">
 					<input type="hidden" value="{{ end_line }}" name="end_line"> 
 					<input type="hidden" value="{{ cfg }}.old" name="oldconfig">
+					<input type="hidden" value="haproxy" name="service">
 					<div style="width: 95%;">
 						<textarea name="config" class="config" id="config_text_area" rows="35" cols="100" style="height: 40%">{{ config }}</textarea>
 					</div>
@@ -98,19 +99,6 @@
 				</script>
 		{% endif %}
 	{% endif %}
-	{% if aftersave %}
-		<div class="alert alert-info">{{lang.phrases.new_config_has_been_saved}}: {{ cfg }} </div>
-		{% if stderr or error %}
-			{% include 'include/errors.html' %}
-		{% else %}
-			<div class="alert alert-success">{{lang.words.config|title()}} {{lang.words.is}} {{lang.words.valid}}</div>
-			{% if warning %}
-			<div class="alert alert-warning">{{warning}}</div>
-			{% endif %}
-			<a href="config.py?serv={{ serv }}" title="{{lang.words.working|title()}} {{lang.words.with}} HAProxy {{lang.words.config}}">{{lang.words.config|title()}}</a>
-		{% endif %}
-		<script>window.history.pushState("Config", "Config", cur_url[0])</script>
-	{% endif %}
 	</div>
 </div>
 {% endif %}
diff --git a/app/templates/servers.html b/app/templates/servers.html
index 7ce355bf..0cbfc159 100644
--- a/app/templates/servers.html
+++ b/app/templates/servers.html
@@ -16,12 +16,8 @@
 		<li><a href="#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users}} - Roxy-WI">{{lang.words.users|title()}}</a></li>
 		<li><a href="#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers}} - Roxy-WI">{{lang.words.servers|title()}}</a></li>
 		<li><a href="#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds}} - Roxy-WI">SSH {{lang.words.creds}}</a></li>
-		<li><a href="#checker" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Checker - Roxy-WI">Checker</a></li>
 		<li><a href="#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings}} - Roxy-WI">{{lang.words.settings|title()}}</a></li>
-		<li><a href="#installproxy" title="{{lang.words.servers|title()}}: {{lang.words.proxy|title()}} {{lang.words.service}} {{lang.words.installation}} - Roxy-WI">{{lang.words.proxy|title()}} {{lang.words.installation}}</a></li>
-		<li><a href="#installmon" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} service installation - Roxy-WI" id="admin-tabs-mon">{{lang.words.monitoring|title()}} {{lang.words.installation}}</a></li>
 		<li><a href="#backup" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.backup|title()}} configs - Roxy-WI" id="admin-tabs-backup">{{lang.words.backup|title()}}</a></li>
-		<li><a href="#geolite2" title="{{lang.words.servers|title()}}: GeoLite2 - Roxy-WI">GeoLite2</a></li>
 	</ul>
 	<div id="users">
 		{% include 'include/admin_users.html' %}
@@ -35,210 +31,19 @@
 		{% include 'include/admin_ssh.html' %}
 	</div>
 	
-	<div id="checker"></div>
-
 	<div id="settings">
 		{% include 'include/admin_settings.html' %}
 	</div>
 
-	<div id="installproxy">
-		{% if not is_needed_tool %}
-			<div style="text-align: center;">
-				<h3>{{lang.admin_page.desc.no_ansible}}</h3>.
-				<img src="/inc/images/no_servers.png" alt="There is no server">
-				<h4>
-					{{lang.words.install|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible.
-				</h4>
-			</div>
-		{% else %}
-		<table class="overview">
-			<caption><h3>{{lang.words.install|title()}} HAProxy</h3></caption>
-			<tr class="overviewHead">
-				<td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td>
-				<td class="padding10 first-collumn help_cursor" style="width: 30%;" title="{{lang.words.for|title()}} Ubuntu {{lang.admin_page.desc.latest_repo}}">
-					{{lang.words.available|title()}} {{lang.words.versions}} (?)
-				</td>
-				<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td>
-				<td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}">{{lang.words.use|title()}} Docker</td>
-				<td>SYN-flood {{lang.words.protection}}</td>
-				<td></td>
-			</tr>
-			<tr>
-				<td id="cur_haproxy_ver" class="padding10 first-collumn">
-				</td>
-				<td class="padding10 first-collumn" style="width: 20%;">
-					{% set values = dict() %}
-					{% set values = {'2.4.23-1':'2.4.23-1','2.5.14-1':'2.5.14-1', '2.6.14-1':'2.6.14-1','2.7.9-1':'2.7.9-1','2.8.1-1':'2.8.1-1'} %}
-					{{ select('hapver',  values=values, selected='2.8.1-1', required='required') }}
-				</td>
-				<td class="padding10 first-collumn">
-					<select autofocus required name="haproxyaddserv" id="haproxyaddserv">
-						<option disabled selected>------</option>
-						{% for select in servers %}
-								<option value="{{ select.2 }}">{{ select.1 }}</option>
-						{% endfor %}
-					</select>
-				</td>
-				<td style="padding-left: 25px;">
-					{{ checkbox('haproxy_docker', title=lang.admin_page.desc.install_as_docker) }}
-				</td>
-				<td class="syn-flood-protection-field">
-					{{ checkbox('syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
-				</td>
-				<td>
-					<span class="ui-button ui-widget ui-corner-all" id="install" title="{{lang.words.install|title()}} HAProxy">{{lang.words.install|title()}}</span>
-				</td>
-			</tr>
-		</table>
-		<table>
-			<caption><h3>{{lang.words.install|title()}} NGINX</h3></caption>
-			<tr class="overviewHead">
-				<td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td>
-				<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>			
-				<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td>
-				<td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td>
-				<td>SYN-flood {{lang.words.protection}}</td>
-				<td></td>
-			</tr>
-			<tr>
-				<td id="cur_nginx_ver" class="padding10 first-collumn">
-				</td>
-				<td class="padding10 first-collumn" style="width: 20%;">
-					{{lang.admin_page.desc.latest_repo}}
-				</td>
-				<td class="padding10 first-collumn">
-					<select autofocus required name="nginxaddserv" id="nginxaddserv">
-						<option disabled selected>------</option>
-						{% for select in servers %}
-								<option value="{{ select.2 }}">{{ select.1 }}</option>
-						{% endfor %}
-					</select>
-				</td>
-				<td style="padding-left: 25px;">
-					{{ checkbox('nginx_docker', title=lang.admin_page.desc.install_as_docker) }}
-				</td>
-				<td class="syn-flood-protection-field">
-					{{ checkbox('nginx_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
-				</td>
-				<td>
-					<span class="ui-button ui-widget ui-corner-all" id="nginx_install" title="{{lang.words.install|title()}} NGINX">{{lang.words.install|title()}}</span>
-				</td>
-			</tr>
-		</table>
-		<table>
-			<caption><h3>{{lang.words.install|title()}} Apache</h3></caption>
-			<tr class="overviewHead">
-				<td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td>
-				<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
-				<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td>
-				<td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td>
-				<td>SYN-flood {{lang.words.protection}}</td>
-				<td></td>
-			</tr>
-			<tr>
-				<td id="cur_apache_ver" class="padding10 first-collumn">
-				</td>
-				<td class="padding10 first-collumn" style="width: 20%;">
-					{{lang.admin_page.desc.latest_repo}}
-				</td>
-				<td class="padding10 first-collumn">
-					<select autofocus required name="apacheaddserv" id="apacheaddserv">
-						<option disabled selected>------</option>
-						{% for select in servers %}
-								<option value="{{ select.2 }}">{{ select.1 }}</option>
-						{% endfor %}
-					</select>
-				</td>
-				<td style="padding-left: 25px;">
-					{{ checkbox('apache_docker', title=lang.admin_page.desc.install_as_docker) }}
-				</td>
-				<td class="syn-flood-protection-field">
-					{{ checkbox('apache_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
-				</td>
-				<td>
-					<span class="ui-button ui-widget ui-corner-all" id="apache_install" title="{{lang.words.install|title()}} Apache">{{lang.words.install|title()}}</span>
-				</td>
-			</tr>
-		</table>
-		<div id="ajax"></div>
-		{% endif %}
-	</div>
-	<div id="installmon">
-		{% include 'include/mon_installation.html' %}
-	</div>
 	<div id="backup">
 		{% include 'include/admin_backup.html' %}
 	</div>
-	<div id="geolite2">
-		<table>
-			{% if not is_needed_tool %}
-				<div style="text-align: center;">
-					<h3>{{lang.admin_page.desc.no_ansible}}</h3>.
-					<img src="/inc/images/no_servers.png" alt="There is no server">
-					<h4>
-						{{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible.
-					</h4>
-				</div>
-			{% else %}
-			<caption><h3>Install GeoLite2</h3></caption>
-			<tr class="overviewHead">
-				<td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
-				<td class="padding10 first-collumn">{{lang.words.service|title()}}</td>
-				<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
-				<td class="" style="width: 30%;" title="GeoLite2 DB is released every Tuesday. Should Roxy-WI update it?">{{lang.words.updating|title()}}</td>
-				<td></td>
-				<td></td>
-			</tr>
-			<tr>
-				<td class="padding10 first-collumn">
-					<select autofocus required name="geoipserv" id="geoipserv">
-						<option disabled selected>------</option>
-						{% for select in servers %}
-						<option value="{{ select.2 }}">{{ select.1 }}</option>
-						{% endfor %}
-					</select>
-				</td>
-				<td class="padding10 first-collumn">
-					<select autofocus required name="geoip_service" id="geoip_service">
-						<option disabled selected>------</option>
-						<option value="haproxy">HAProxy</option>
-						<option value="nginx">NGINX</option>
-					</select>
-				</td>
-				<td id="cur_geoip" class="padding10"></td>
-				<td class="checkbox">
-					{{ checkbox('updating_geoip', title="Update the database?", checked='checked') }}
-				</td>
-				<td>
-					<span class="ui-button ui-widget ui-corner-all" id="geoip_install" title="{{lang.words.install|title()}} GeoLite2" style="display: none;">{{lang.words.install|title()}}</span>
-				</td>
-			</tr>
-			{% endif %}
-		</table>
-		<div id="ajax-geoip"></div>
-		<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px; margin-bottom: 15px;">
-			{{lang.phrases.howto_user}} {{lang.words.read}} {{lang.words.in}} {{lang.words.this2}} <a href="https://roxy-wi.org/howto/geoip" title="GeoLite2 {{lang.words.descr|title()}}" target="_blank">{{lang.words.article}}</a>
-		</div>
-		<table style="min-width: 40%;">
-			<tr class="overviewHead">
-				<th colspan=13 style="background-color: #d1ecf1; padding: 10px;">
-					<span id="table_metrics_head" style="margin-left: 5px;">{{lang.admin_page.desc.country_codes}}</span>
-					<select id="geoip_select">
-					{% for code in geoip_country_codes %}
-					<option>{{code.name}} {{code.code}}</option>
-					{% endfor %}
-					</select>
-				</th>
-			</tr>
-		</table>
-	</div>
+
 </div>
 {% include 'include/admins_dialogs.html' %}
 {% include 'include/change_pass_form.html' %}
 <script>
-	$('#geoip_select').select2();
 	$( function() {
-		$("#geoip_select").selectmenu("destroy");
 		{% for user in users %}
 			$("#role-{{user.0}}" ).selectmenu({
 				  width: 100
diff --git a/app/templates/smon.html b/app/templates/smon/add.html
similarity index 79%
rename from app/templates/smon.html
rename to app/templates/smon/add.html
index 8f67ccab..34195726 100644
--- a/app/templates/smon.html
+++ b/app/templates/smon/add.html
@@ -1,9 +1,9 @@
 {% extends "base.html" %}
-{% block title %}{{ title }}{% endblock %}
-{% block h2 %}{{ title }}{% endblock %}
+{% block title %}{{ lang.menu_links.monitoring.smon.admin }}{% endblock %}
+{% block h2 %}{{ lang.menu_links.monitoring.smon.admin }}{% endblock %}
 {% block content %}
 {% from 'include/input_macros.html' import input, checkbox, select %}
-<script src="/inc/smon-6.3.16.js"></script>
+<script src="/inc/smon.js"></script>
 <script src="/inc/users.js"></script>
 <script src="/inc/fontawesome.min.js"></script>
 <script src="/inc/jquery.timeago.js" type="text/javascript"></script>
@@ -13,7 +13,7 @@
 <div style="text-align: center;">
 	<br />
 	<h3>{{lang.smon_page.desc.not_installed}}</h3>.
-	<img src="/inc/images/no_servers.png" alt="There is no server">
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
 	<h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a>
 		{{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4>
 </div>
@@ -21,38 +21,10 @@
 <div style="text-align: center;">
 	<br />
 	<h3>{{lang.smon_page.desc.smon_is_not_run}}</h3>
-	<img src="/inc/images/no_servers.png" alt="There is no server">
-	<h4>{{lang.smon_page.desc.run_smon}} <a href="users.py#services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4>
-</div>
-{% elif smon|length == 0 and action != 'add' and action != 'history' and action != 'checker_history' %}
-<div style="text-align: center;">
-	<br />
-	<h3>{{lang.smon_page.desc.not_added}}</h3>
-	<img src="/inc/images/no_servers.png" alt="There is no server">
-		<h4>{{lang.smon_page.desc.create_server}} <a href="smon.py?action=add" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4>
-	<br />
-</div>
-{% elif smon|length == 0 and action != 'add' and action == 'history' %}
-<div style="text-align: center;">
-	<br />
-	<h3>{{lang.phrases.no_events_added}}</h3>
-	<img src="/inc/images/no_servers.png" alt="There is no server">
-	<h4>Click <a href="smon.py?action=add" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.see_check}}</h4>
-	<br />
-</div>
-{% elif smon|length == 0 and action != 'add' and action == 'checker_history' %}
-<div style="text-align: center;">
-	<br />
-	<h3>
-		{{lang.phrases.no_events_added}} Check if there are any Checker are enabled on the "<a href="hapservers.py?service=haproxy" title="HAProxy Overview">HAProxy {{lang.menu_links.hapservers.link}}</a>"
-		{{lang.words.or}} {{lang.words.on}} "<a href="hapservers.py?service=nginx" title="NGINX Overview">NGINX {{lang.menu_links.hapservers.link}}</a>"
-		{{lang.words.or}} {{lang.words.on}} "<a href="hapservers.py?service=apache" title="Apache Overview">Apache {{lang.menu_links.hapservers.link}}</a>"
-		{{lang.words.or}} {{lang.words.on}} "<a href="hapservers.py?service=keepalived" title="Keepalived Overview">Keepalived {{lang.menu_links.hapservers.link}}</a>" {{lang.words.pages}}
-	</h3>
-	<br />
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4>
 </div>
 {% else %}
-{% if action == 'add' %}
 <table class="overview overview-overflow" id="ajax-smon-http">
 	<thead>
 	<caption><h3>HTTP {{lang.words.checking}}</h3></caption>
@@ -92,7 +64,7 @@
 		<tr class="overviewHead">
 			<th class="padding10 first-collumn" style="width: 200px;">{{lang.words.name|title()}}</th>
 			<th style="width: 15%;">{{lang.words.Hostname}}</th>
-			<th style="width: 2%;">{{lang.words.port|title()}}</th>
+			<th style="width: 5%;">{{lang.words.port|title()}}</th>
 			<th style="width: 5%;">{{lang.words.enabled|title()}}</th>
 			<th style="width: 11%;">Telegram</th>
 			<th style="width: 11%;">Slack</th>
@@ -122,7 +94,7 @@
 	<tr class="overviewHead">
 		<th class="padding10 first-collumn" style="width: 200px;">{{lang.words.name|title()}}</th>
 		<th style="width: 15%;">{{lang.words.Hostname}}</th>
-		<th style="width: 2%;">{{lang.smon_page.desc.packet_size}}</th>
+		<th style="width: 5%; padding-right: 10px;">{{lang.smon_page.desc.packet_size}}</th>
 		<th style="width: 5%;">{{lang.words.enabled|title()}}</th>
 		<th style="width: 15%;">Telegram</th>
 		<th style="width: 15%;">Slack</th>
@@ -160,7 +132,7 @@
 		<th style="width: 5%;">{{lang.words.enabled|title()}}</th>
 		<th style="width: 15%;">Telegram</th>
 		<th style="width: 15%;">Slack</th>
-		<th style="width: 15%;">PagerDuty</th>
+		<th style="width: 10%;">PagerDuty</th>
 		<th style="width: 10%;">{{lang.words.group|title()}}</th>
 		<th style="width: 100%;">{{lang.words.desc|title()}}</th>
 		<th></th>
@@ -186,7 +158,7 @@
 <div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
 	{{lang.phrases.read_about_parameters}} <a href="https://roxy-wi.org/services/smon" title="SMON service description" target="_blank">{{lang.words.here}}</a>
 </div>
-<div id="smon-add-table" style="display: none;">	
+<div id="smon-add-table" style="display: none;">
 	<table class="overview" id="smon-add-table-overview" title="{{lang.words.create|title()}} {{lang.words.w_a}} {{lang.words.new}} {{lang.words.server}} {{lang.words.for}} {{lang.words.monitoring}}">
 		{% include 'include/tr_validate_tips.html' %}
 		<tr>
@@ -323,13 +295,6 @@
 		</tr>
 	</table>
 	{% include 'include/del_confirm.html' %}
-{% elif action == 'history' or action == 'checker_history' %}
-	{% include 'ajax/alerts_history.html' %}
-{% else %}
-	<div class="main" id="smon_dashboard">
-		{% include 'ajax/smon/smon_dashboard.html' %}
-	</div>
-{% endif %}
 </div>
 {% endif %}
-{% endblock %}
+{% endblock %}
\ No newline at end of file
diff --git a/app/templates/smon/checker_history.html b/app/templates/smon/checker_history.html
new file mode 100644
index 00000000..4a73c6ce
--- /dev/null
+++ b/app/templates/smon/checker_history.html
@@ -0,0 +1,33 @@
+{% extends "base.html" %}
+{% block title %}{{ lang.menu_links.monitoring.checker_history }}{% endblock %}
+{% block h2 %}{{ lang.menu_links.monitoring.checker_history }}{% endblock %}
+{% block content %}
+{% if user_status == 0 or user_plan == 'user' %}
+	{% include 'include/no_sub.html' %}
+{% elif smon_error != '' %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.smon_page.desc.not_installed}}</h3>.
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a>
+		{{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4>
+</div>
+{% elif smon_status.0 == 'failed' or smon_status.0 == 'inactive' %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.smon_page.desc.smon_is_not_run}}</h3>
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4>
+</div>
+{% elif smon|length == 0 %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.phrases.no_events_added}}</h3>
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>Click <a href="/app/smon/admin" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.see_check}}</h4>
+	<br />
+</div>
+{% else %}
+    {% include 'ajax/alerts_history.html' %}
+{% endif %}
+{% endblock %}
diff --git a/app/templates/smon/dashboard.html b/app/templates/smon/dashboard.html
new file mode 100644
index 00000000..154af5c2
--- /dev/null
+++ b/app/templates/smon/dashboard.html
@@ -0,0 +1,39 @@
+{% extends "base.html" %}
+{% block title %}{{ lang.menu_links.monitoring.smon.dashboard }}{% endblock %}
+{% block h2 %}{{ lang.menu_links.monitoring.smon.dashboard }}{% endblock %}
+{% block content %}
+<script src="/inc/smon.js"></script>
+<script src="/inc/users.js"></script>
+<script src="/inc/fontawesome.min.js"></script>
+<script src="/inc/jquery.timeago.js" type="text/javascript"></script>
+{% if user_status == 0 %}
+	{% include 'include/no_sub.html' %}
+{% elif smon_error != '' %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.smon_page.desc.not_installed}}</h3>.
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a>
+		{{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4>
+</div>
+{% elif smon_status.0 == 'failed' or smon_status.0 == 'inactive' %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.smon_page.desc.smon_is_not_run}}</h3>
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4>
+</div>
+{% elif smon|length == 0 %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.smon_page.desc.not_added}}</h3>
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+		<h4>{{lang.smon_page.desc.create_server}} <a href="/app/smon/admin" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4>
+	<br />
+</div>
+{% else %}
+    <div class="main" id="smon_dashboard">
+		{% include 'ajax/smon/smon_dashboard.html' %}
+	</div>
+{% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/app/templates/smon/history.html b/app/templates/smon/history.html
new file mode 100644
index 00000000..74674cc6
--- /dev/null
+++ b/app/templates/smon/history.html
@@ -0,0 +1,33 @@
+{% extends "base.html" %}
+{% block title %}{{ lang.menu_links.monitoring.smon.history }}{% endblock %}
+{% block h2 %}{{ lang.menu_links.monitoring.smon.history }}{% endblock %}
+{% block content %}
+{% if user_status == 0 or user_plan == 'user' %}
+	{% include 'include/no_sub.html' %}
+{% elif smon_error != '' %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.smon_page.desc.not_installed}}</h3>.
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a>
+		{{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4>
+</div>
+{% elif smon_status.0 == 'failed' or smon_status.0 == 'inactive' %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.smon_page.desc.smon_is_not_run}}</h3>
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4>
+</div>
+{% elif smon|length == 0 %}
+<div style="text-align: center;">
+	<br />
+	<h3>{{lang.phrases.no_events_added}}</h3>
+	<img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server">
+	<h4>Click <a href="/app/smon/admin" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.see_check}}</h4>
+	<br />
+</div>
+{% else %}
+    {% include 'ajax/alerts_history.html' %}
+{% endif %}
+{% endblock %}
diff --git a/app/templates/statsview.html b/app/templates/statsview.html
index 984cb9b3..0b010578 100644
--- a/app/templates/statsview.html
+++ b/app/templates/statsview.html
@@ -7,7 +7,7 @@
 {% if selects|length == 0 %}
 	{% include 'include/getstarted.html' %}
 {% else %}
-<form action="statsview.py" method="post" class="left-space">
+<form action="" method="post" class="left-space">
 	<input type="hidden" id="service" value="{{service}}" />
 	<select autofocus required name="serv" id="serv">
 		<option disabled>------</option>
@@ -19,7 +19,7 @@
 				{% endif %}
 			{% endfor %}
 	</select>
-	<a class="ui-button ui-widget ui-corner-all" id="show" title="{{lang.words.show|title()}} {{lang.words.stats}}" onclick="{{ onclick }}">{{lang.words.open|title()}}</a>
+	<a class="ui-button ui-widget ui-corner-all" id="show" title="{{lang.words.show|title()}} {{lang.words.stats}}" onclick="showStats()">{{lang.words.open|title()}}</a>
 	{% if service != 'nginx' and service != 'apache' %}
 	<div id="stats_filter">
 		<div id="stats_filter_text">{{lang.words.filter|title()}}:</div>
@@ -47,6 +47,7 @@
 		$('form').append('<input type="hidden" name="token" value='+$('#token').val()+'>');
 		$( "input[type=submit], button" ).button();
 		$('#notice').hide();
+		$('.active_going_down').hide();
 		$('li').css('margin-top', '0');
 		$('li').css('width', '207px	');
 		$('li').css('padding', '0px');
diff --git a/app/templates/waf.html b/app/templates/waf.html
index a8c3a4cd..cff52127 100644
--- a/app/templates/waf.html
+++ b/app/templates/waf.html
@@ -2,7 +2,7 @@
 {% block title %}{{title}}{% endblock %}
 {% block h2 %}{{title}}{% endblock %}
 {% block content %}
-<script src="/inc/waf-6.3.8.js"></script>
+<script src="/inc/waf.js"></script>
 {% if manage_rules == '1' %}
 	{% from 'include/input_macros.html' import input, checkbox %}
 	<table class="overview" id="waf_rules">
@@ -27,7 +27,7 @@
 			</td>
 			<td style="padding-top: 5px;padding-bottom: 10px;">{{r.desc}}</td>
 			<td style="padding: 0 10px 0 10px;">
-				<a href="waf.py?service={{service}}&waf_rule_id={{r.id}}&serv={{serv}}" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.this4}} {{lang.words.rule}}">{{lang.words.view|title()}}/{{lang.words.edit|title()}}</a>
+				<a href="/app/waf/{{service}}/{{serv}}/rule/{{r.id}}" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.this4}} {{lang.words.rule}}">{{lang.words.view|title()}}/{{lang.words.edit|title()}}</a>
 			</td>
 		</tr>
 		{% endfor %}
@@ -72,7 +72,7 @@
 		<script src="/inc/codemirror/keymap/sublime.js"></script>
 		<script src="/inc/configshow.js"></script>
 			<h4>{{lang.words.config|title()}} {{waf_rule_file}} {{lang.words.from|title()}} {{ serv }}</h4>
-			<form action="waf.py" name="saveconfig" id="saveconfig" method="post">
+			<form action="/app/waf/{{service}}/{{serv}}/rule/{{waf_rule_id}}/save" name="saveconfig" id="saveconfig" method="post">
 				<input type="hidden" value="{{ serv }}" name="serv">
 				<input type="hidden" value="{{ cfg }}.old" name="oldconfig">
 				<input type="hidden" value="{{ token }}" name="token">
@@ -82,7 +82,7 @@
 					<textarea name="config" id="config_text_area" class="config" rows="35" cols="100">{{ config }}</textarea>
 				</div>
 				<p>
-					<a href="waf.py?manage_rules=1&serv={{serv}}" class="ui-button ui-widget ui-corner-all" title="Return to rules management">{{lang.words.back|title()}}</a>
+					<a href="/app/waf/{{service}}/{{serv}}/rules" class="ui-button ui-widget ui-corner-all" title="Return to rules management">{{lang.words.back|title()}}</a>
 					{% if role <= 3 %}
 					<button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.words.save|title()}} {{lang.words.without}} {{lang.words.reloading}}">{{lang.words.save|title()}}</button>
 					{% if service == 'haproxy' %}
@@ -176,8 +176,8 @@
 	</table>
 	{% if service == 'haproxy' %}
 	<link href="/inc/css/chart.min.css" rel="stylesheet">
-	<script src="/inc/overview-6.3.9.js"></script>
-	<script src="/inc/metrics-6.3.16.0.js"></script>
+	<script src="/inc/overview.js"></script>
+	<script src="/inc/metrics.js"></script>
 	<script src="/inc/chart.min-4.3.0.js"></script>
 	<div id="table_metrics"></div>
 	<div class="metrics-time-range">
diff --git a/app/users.py b/app/users.py
deleted file mode 100644
index 499ee035..00000000
--- a/app/users.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-import sys
-
-import pytz
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.server.server as server_mod
-import modules.roxywi.roxy as roxywi
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-
-from jinja2 import Environment, FileSystemLoader
-
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('admin.html')
-form = common.form
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception as e:
-	print('error: your session is expired')
-	sys.exit()
-
-roxywi_auth.page_for_admin()
-
-users = sql.select_users()
-settings = sql.get_setting('', all=1)
-ldap_enable = sql.get_setting('ldap_enable')
-services = sql.select_services()
-gits = sql.select_gits()
-masters = sql.select_servers(get_master_servers=1)
-is_needed_tool = common.is_tool('ansible')
-grafana = 0
-backups = sql.select_backups()
-s3_backups = sql.select_s3_backups()
-
-if not roxywi.is_docker():
-	grafana, stderr = server_mod.subprocess_execute("systemctl is-active grafana-server")
-	grafana = grafana[0]
-
-try:
-	user_subscription = roxywi_common.return_user_status()
-except Exception as e:
-	user_subscription = roxywi_common.return_unsubscribed_user_status()
-	roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
-
-rendered_template = template.render(
-	h2=1, role=user_params['role'], user=user_params['user'], users=users, groups=sql.select_groups(),
-	servers=sql.select_servers(full=1), masters=masters, sshs=sql.select_ssh(), roles=sql.select_roles(),
-	settings=settings, backups=backups, s3_backups=s3_backups, services=services, timezones=pytz.all_timezones,
-	page="users.py", user_services=user_params['user_services'], ldap_enable=ldap_enable, gits=gits, guide_me=1,
-	user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'],
-	is_needed_tool=is_needed_tool, lang=user_params['lang'], grafana=grafana
-)
-print(rendered_template)
diff --git a/app/versions.py b/app/versions.py
deleted file mode 100644
index 182d124f..00000000
--- a/app/versions.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python3
-import os
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-import modules.config.config as config_mod
-import modules.roxy_wi_tools as roxy_wi_tools
-
-get_config_var = roxy_wi_tools.GetConfigVar()
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('delver.html')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(disable=1)
-
-roxywi_auth.page_for_admin(level=3)
-
-form = common.form
-serv = common.is_ip_or_dns(form.getvalue('serv'))
-service = common.checkAjaxInput(form.getvalue('service'))
-Select = form.getvalue('del')
-configver = form.getvalue('configver')
-conf_format = 'cfg'
-configs_dir = ''
-stderr = ""
-aftersave = ""
-file = set()
-
-if configver:
-	template = env.get_template('configver.html')
-
-if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
-	service_desc = sql.select_service(service)
-	if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
-		servers = roxywi_common.get_dick_permit(service=service_desc.slug)
-		action = f'versions.py?service={service_desc.slug}'
-		conf_format = 'conf'
-
-		if service in ('haproxy', 'nginx', 'apache'):
-			configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir')
-		else:
-			configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir')
-
-		if service == 'haproxy':
-			conf_format = 'cfg'
-else:
-	print('<meta http-equiv="refresh" content="0; url=/app/overview.py">')
-
-if serv is not None and form.getvalue('del') is not None:
-	if Select is not None:
-		aftersave = 1
-		env = Environment(loader=FileSystemLoader('templates/'))
-		template = env.get_template('delver.html')
-		for get in form:
-			if conf_format in get and serv in get:
-				try:
-					if form.getvalue('style') == 'new':
-						if sql.delete_config_version(service, form.getvalue(get)):
-							try:
-								os.remove(form.getvalue(get))
-							except OSError as e:
-								if 'No such file or directory' in str(e):
-									pass
-					else:
-						os.remove(os.path.join(configs_dir, form.getvalue(get)))
-					try:
-						file.add(form.getvalue(get) + "<br />")
-						roxywi_common.logging(
-							serv, "Version of config has been deleted: %s" % form.getvalue(get), login=1, keep_history=1, service=service
-						)
-					except Exception:
-						pass
-				except OSError as e:
-					stderr = "Error: %s - %s." % (e.filename, e.strerror)
-
-if serv is not None and form.getvalue('config') is not None:
-	configver = configs_dir + configver
-	save = form.getvalue('save')
-	aftersave = 1
-
-	try:
-		roxywi_common.logging(
-			serv, "Version of config has been uploaded %s" % configver, login=1, keep_history=1, service=service
-		)
-	except Exception:
-		pass
-
-	if service == 'keepalived':
-		stderr = config_mod.upload_and_restart(serv, configver, just_save=save, keepalived=1)
-	elif service == 'nginx':
-		config_file_name = sql.select_remote_path_from_version(server_ip=serv, service=service, local_path=configver)
-		stderr = config_mod.master_slave_upload_and_restart(serv, configver, just_save=save, nginx=1, config_file_name=config_file_name)
-	elif service == 'apache':
-		config_file_name = sql.select_remote_path_from_version(server_ip=serv, service=service, local_path=configver)
-		stderr = config_mod.master_slave_upload_and_restart(serv, configver, just_save=save, apache=1, config_file_name=config_file_name)
-	else:
-		stderr = config_mod.master_slave_upload_and_restart(serv, configver, just_save=save)
-
-
-rendered_template = template.render(
-	h2=1, role=user_params['role'], user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave,
-	selects=user_params['servers'], stderr=stderr, open=form.getvalue('open'), Select=form.getvalue('del'), file=file,
-	configver=configver, service=service, user_services=user_params['user_services'], action=action, token=user_params['token'],
-	lang=user_params['lang']
-)
-print(rendered_template)
diff --git a/app/viewlogs.py b/app/viewlogs.py
deleted file mode 100644
index eb1c24fb..00000000
--- a/app/viewlogs.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/usr/bin/env python3
-import os
-import sys
-import datetime
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-import modules.roxy_wi_tools as roxy_wi_tools
-
-get_config_var = roxy_wi_tools.GetConfigVar()
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('logs.html')
-form = common.form
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params()
-
-try:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
-except Exception:
-	print('error: your session is expired')
-	sys.exit()
-
-if form.getvalue('grep') is None:
-	grep = ""
-else:
-	grep = form.getvalue('grep')
-
-exgrep = form.getvalue('exgrep') if form.getvalue('exgrep') else ''
-
-if form.getvalue('rows') is None:
-	rows = 10
-else:
-	rows = form.getvalue('rows')
-
-if form.getvalue('viewlogs') is None:
-	serv = form.getvalue('serv')
-else:
-	serv = form.getvalue('viewlogs')
-
-hour = form.getvalue('hour')
-hour1 = form.getvalue('hour1')
-minut = form.getvalue('minut')
-minut1 = form.getvalue('minut1')
-
-if form.getvalue('type') == '2':
-	roxywi_auth.page_for_admin(level=2)
-	page = 'for_editor'
-else:
-	roxywi_auth.page_for_admin()
-	page = ''
-
-log_path = get_config_var.get_config_var('main', 'log_path')
-time_storage = sql.get_setting('log_time_storage')
-
-try:
-	time_storage_hours = time_storage * 24
-	for dirpath, dirnames, filenames in os.walk(log_path):
-		for file in filenames:
-			curpath = os.path.join(dirpath, file)
-			file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
-			if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours):
-				os.remove(curpath)
-except Exception:
-	pass
-
-selects = roxywi_common.get_files(log_path, file_format="log")
-if form.getvalue('type') is None:
-	selects.append(['fail2ban.log', 'fail2ban.log'])
-	selects.append(['roxy-wi.error.log', 'error.log'])
-	selects.append(['roxy-wi.access.log', 'access.log'])
-
-if user_params['lang'] == 'ru':
-	title = 'Просмотр внутренних логов'
-else:
-	title = 'View internal logs'
-
-rendered_template = template.render(
-	h2=1, autorefresh=1, title=title, role=user_params['role'], user=user_params['user'], serv=serv,
-	select_id="viewlogs", selects=selects, rows=rows, grep=grep, exgrep=exgrep, hour=hour, hour1=hour1, minut=minut,
-	minut1=minut1, page=page, user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
-)
-print(rendered_template)
diff --git a/app/views.py b/app/views.py
new file mode 100644
index 00000000..0f15c863
--- /dev/null
+++ b/app/views.py
@@ -0,0 +1,463 @@
+import os
+import sys
+import uuid
+
+import pytz
+import distro
+from flask import render_template, request, redirect, url_for, flash, make_response
+from flask_login import login_user, login_required, logout_user, current_user
+from datetime import datetime, timedelta
+
+from app import app, login_manager, cache
+
+sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
+
+import modules.db.sql as sql
+from modules.db.db_model import *
+import modules.common.common as common
+import modules.server.server as server_mod
+import modules.roxy_wi_tools as roxy_wi_tools
+import modules.roxywi.logs as roxy_logs
+import modules.roxywi.roxy as roxywi
+import modules.roxywi.auth as roxywi_auth
+import modules.roxywi.common as roxywi_common
+
+get_config = roxy_wi_tools.GetConfigVar()
+time_zone = sql.get_setting('time_zone')
+get_date = roxy_wi_tools.GetDate(time_zone)
+
+
+@app.before_request
+@cache.memoize(50)
+def check_login():
+	user_params = roxywi_common.get_users_params()
+	if user_params is None:
+		make_response(redirect(url_for('login_page')))
+
+	try:
+		roxywi_auth.check_login(user_params['user_uuid'], user_params['token'])
+	except Exception:
+		make_response(redirect(url_for('login_page')))
+
+
+@app.errorhandler(404)
+def page_not_found(e):
+	return render_template('404.html'), 404
+
+
+@app.errorhandler(500)
+def page_not_found(e):
+	return render_template('500.html', e=e), 500
+
+
+@login_manager.user_loader
+def load_user(user_id):
+	user = f'user_{user_id}'
+	user_obj = cache.get(user)
+
+	if user_obj is None:
+		query = User.get(User.user_id == user_id)
+		cache.set(user, query, timeout=360)
+		return query
+
+	return user_obj
+
+
+@app.after_request
+def redirect_to_login(response):
+	if response.status_code == 401:
+		return redirect(url_for('login_page') + '?next=' + request.url)
+
+	return response
+
+
+@app.route('/login', methods=['GET', 'POST'])
+def login_page():
+	next_url = request.args.get('next') or request.form.get('next')
+	login = request.form.get('login')
+	password = request.form.get('pass')
+	role = 5
+	user1 = ''
+
+	if next_url is None:
+		next_url = ''
+
+	try:
+		groups = sql.select_groups(id=user_groups)
+		for g in groups:
+			if g[0] == int(user_groups):
+				user_group = g[1]
+	except Exception:
+		user_group = ''
+
+	try:
+		if distro.id() == 'ubuntu':
+			if os.path.exists('/etc/apt/auth.conf.d/roxy-wi.conf'):
+				cmd = "grep login /etc/apt/auth.conf.d/roxy-wi.conf |awk '{print $2}'"
+				get_user_name, stderr = server_mod.subprocess_execute(cmd)
+				user_name = get_user_name[0]
+			else:
+				user_name = 'git'
+		else:
+			if os.path.exists('/etc/yum.repos.d/roxy-wi.repo'):
+				cmd = "grep base /etc/yum.repos.d/roxy-wi.repo |awk -F\":\" '{print $2}'|awk -F\"/\" '{print $3}'"
+				get_user_name, stderr = server_mod.subprocess_execute(cmd)
+				user_name = get_user_name[0]
+			else:
+				user_name = 'git'
+		if sql.select_user_name():
+			sql.update_user_name(user_name)
+		else:
+			sql.insert_user_name(user_name)
+	except Exception as e:
+		roxywi_common.logging('Cannot update subscription: ', str(e), roxywi=1)
+
+	try:
+		session_ttl = int(sql.get_setting('session_ttl'))
+	except Exception:
+		session_ttl = 5
+
+	expires = datetime.utcnow() + timedelta(days=session_ttl)
+
+	if login and password:
+		users = sql.select_users(user=login)
+
+		for user in users:
+			if user.activeuser == 0:
+				flash('Your login is disabled', 'alert alert-danger wrong-login')
+			if user.ldap_user == 1:
+				if login in user.username:
+					if check_in_ldap(login, password):
+						login_user(user)
+						resp = make_response(next_url or url_for('index'))
+						resp.set_cookie('uuid', user_uuid, secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"))
+						resp.set_cookie('group', str(user.groups), secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"))
+			else:
+				passwordHashed = roxy_wi_tools.Tools.get_hash(password)
+				if login in user.username and passwordHashed == user.password:
+					user_uuid = str(uuid.uuid4())
+					user_token = str(uuid.uuid4())
+					sql.write_user_uuid(login, user_uuid)
+					sql.write_user_token(login, user_token)
+					role = int(user.role)
+					user1 = user.username
+
+					login_user(user)
+					resp = make_response(next_url or url_for('index'))
+					try:
+						resp.set_cookie('uuid', user_uuid, secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"))
+						resp.set_cookie('group', str(user.groups), secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"))
+					except Exception as e:
+						print(e)
+
+					try:
+						user_name = sql.get_user_name_by_uuid(user_uuid)
+						roxywi_common.logging('Roxy-WI server', f' user: {user_name}, group: {user_group} login', roxywi=1)
+					except Exception:
+						pass
+
+					return resp
+
+				else:
+					flash('Login or password is not correct', 'alert alert-danger wrong-login')
+		else:
+			return 'ban', 200
+	else:
+		flash('Login or password is not correct', 'alert alert-danger wrong-login')
+
+	try:
+		lang = roxywi_common.get_user_lang()
+	except Exception:
+		lang = 'en'
+
+	return render_template('login.html', role=role, user=user1, lang=lang)
+
+
+@app.route('/logout', methods=['GET', 'POST'])
+@login_required
+def logout():
+	user = f'user_{current_user.id}'
+	cache.delete(user)
+	logout_user()
+	resp = make_response(redirect(url_for('index')))
+	resp.delete_cookie('uuid')
+	resp.delete_cookie('group')
+
+	return resp
+
+
+@app.route('/')
+@app.route('/overview')
+@login_required
+def index():
+	try:
+		user_params = roxywi_common.get_users_params()
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	groups = sql.select_groups()
+	return render_template(
+		'ovw.html', h2=1, autorefresh=1, role=user_params['role'], user=user, groups=groups,
+		roles=sql.select_roles(), servers=user_params['servers'], user_services=user_params['user_services'],
+		roxy_wi_log=roxy_logs.roxy_wi_log(), token=user_params['token'], guide_me=1, lang=user_params['lang']
+	)
+
+
+@app.route('/stats/<service>/', defaults={'serv': None})
+@app.route('/stats/<service>/<serv>')
+@login_required
+def stats(service, serv):
+	try:
+		user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	try:
+		if serv is None:
+			first_serv = user_params['servers']
+			for i in first_serv:
+				serv = i[2]
+				break
+	except Exception:
+		pass
+
+	if service in ('haproxy', 'nginx', 'apache'):
+		service_desc = sql.select_service(service)
+		is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
+
+		if is_redirect != 'ok':
+			return redirect(url_for(f'{is_redirect}'))
+
+		servers = roxywi_common.get_dick_permit(service=service_desc.slug)
+	else:
+		return redirect(url_for('index'))
+
+	return render_template(
+		'statsview.html', h2=1, autorefresh=1, role=user_params['role'], user=user, selects=servers, serv=serv,
+		service=service, user_services=user_params['user_services'], token=user_params['token'],
+		select_id="serv", lang=user_params['lang'], service_desc=service_desc
+	)
+
+
+@app.route('/logs/internal')
+@login_required
+def logs_internal():
+	log_type = request.args.get('type')
+
+	if log_type == '2':
+		roxywi_auth.page_for_admin(level=2)
+	else:
+		roxywi_auth.page_for_admin()
+
+	try:
+		user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	time_storage = sql.get_setting('log_time_storage')
+	log_path = get_config.get_config_var('main', 'log_path')
+	selects = roxywi_common.get_files(log_path, file_format="log")
+
+	try:
+		time_storage_hours = time_storage * 24
+		for dirpath, dirnames, filenames in os.walk(log_path):
+			for file in filenames:
+				curpath = os.path.join(dirpath, file)
+				file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
+				if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours):
+					os.remove(curpath)
+	except Exception:
+		pass
+
+	if log_type is None:
+		selects.append(['fail2ban.log', 'fail2ban.log'])
+		selects.append(['roxy-wi.error.log', 'error.log'])
+		selects.append(['roxy-wi.access.log', 'access.log'])
+
+	return render_template(
+		'logs_internal.html',
+		h2=1, autorefresh=1, role=user_params['role'], user=user, user_services=user_params['user_services'],
+		token=user_params['token'], lang=user_params['lang'], selects=selects, serv='viewlogs'
+	)
+
+
+@app.route('/logs/<service>', defaults={'waf': None})
+@app.route('/logs/<service>/<waf>')
+@login_required
+def logs(service, waf):
+	serv = request.args.get('serv')
+	rows = request.args.get('rows')
+	grep = request.args.get('grep')
+	exgrep = request.args.get('exgrep')
+	hour = request.args.get('hour')
+	minute = request.args.get('minute')
+	hour1 = request.args.get('hour1')
+	minute1 = request.args.get('minute1')
+	log_file = request.args.get('file')
+
+	if rows is None: rows=10
+	if grep is None: grep=''
+
+	try:
+		user_params = roxywi_common.get_users_params(virt=1, haproxy=1)
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	if service in ('haproxy', 'nginx', 'keepalived', 'apache') and not waf:
+		service_desc = sql.select_service(service)
+		service_name = service_desc.service
+		is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id)
+
+		if is_redirect != 'ok':
+			return redirect(url_for(f'{is_redirect}'))
+
+		servers = roxywi_common.get_dick_permit(service=service_desc.slug)
+	elif waf:
+		service_name = 'WAF'
+		is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
+
+		if is_redirect != 'ok':
+			return redirect(url_for(f'{is_redirect}'))
+
+		servers = roxywi_common.get_dick_permit(haproxy=1)
+	else:
+		return redirect(url_for('index'))
+
+	return render_template(
+		'logs.html',
+		h2=1, autorefresh=1, role=user_params['role'], user=user, select_id='serv', rows=rows, remote_file=log_file,
+		selects=servers, waf=waf, service=service, user_services=user_params['user_services'],
+		token=user_params['token'], lang=user_params['lang'], service_name=service_name, grep=grep, serv=serv
+	)
+	
+
+@app.route('/portscanner')
+@login_required
+def portscanner():
+	try:
+		user_params = roxywi_common.get_users_params(virt=1)
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	user_group = roxywi_common.get_user_group(id=1)
+	port_scanner_settings = sql.select_port_scanner_settings(user_group)
+
+	if not port_scanner_settings:
+		port_scanner_settings = ''
+		count_ports = ''
+	else:
+		count_ports = list()
+		for s in user_params['servers']:
+			count_ports_from_sql = sql.select_count_opened_ports(s[2])
+			i = (s[2], count_ports_from_sql)
+			count_ports.append(i)
+
+	cmd = "systemctl is-active roxy-wi-portscanner"
+	port_scanner, port_scanner_stderr = server_mod.subprocess_execute(cmd)
+	user_subscription = roxywi_common.return_user_subscription()
+
+	return render_template(
+		'portscanner.html', h2=1, autorefresh=0, role=user_params['role'], user=user, servers=user_params['servers'],
+		port_scanner_settings=port_scanner_settings, count_ports=count_ports, port_scanner=''.join(port_scanner),
+		port_scanner_stderr=port_scanner_stderr, user_services=user_params['user_services'], user_status=user_subscription['user_status'],
+		user_plan=user_subscription['user_plan'], token=user_params['token'], lang=user_params['lang']
+	)
+
+
+@app.route('/nettools')
+@login_required
+@cache.cached()
+def nettools():
+	try:
+		user_params = roxywi_common.get_users_params(virt=1)
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	return render_template(
+		'nettools.html', h2=1, autorefresh=0, role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
+		user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
+	)
+
+
+@app.route('/history/<service>/<server_ip>')
+@login_required
+def service_history(service, server_ip):
+	users = sql.select_users()
+	server_ip = common.checkAjaxInput(server_ip)
+	user_subscription = roxywi_common.return_user_subscription()
+
+	try:
+		user_params = roxywi_common.get_users_params()
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	if service in ('haproxy', 'nginx', 'keepalived', 'apache'):
+		service_desc = sql.select_service(service)
+		if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id):
+			server_id = sql.select_server_id_by_ip(server_ip)
+			history = sql.select_action_history_by_server_id_and_service(server_id, service_desc.service)
+	elif service == 'server':
+		if roxywi_common.check_is_server_in_group(server_ip):
+			server_id = sql.select_server_id_by_ip(server_ip)
+			history = sql.select_action_history_by_server_id(server_id)
+	elif service == 'user':
+		history = sql.select_action_history_by_user_id(server_ip)
+
+	try:
+		sql.delete_action_history_for_period()
+	except Exception as e:
+		print(e)
+
+	return render_template(
+		'history.html', h2=1, role=user_params['role'], user=user, users=users, serv=server_ip, service=service,
+		history=history, user_services=user_params['user_services'], token=user_params['token'],
+		user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang']
+	)
+
+
+@app.route('/servers')
+@login_required
+def servers():
+	roxywi_auth.page_for_admin(level=2)
+
+	try:
+		user_params = roxywi_common.get_users_params()
+		user = user_params['user']
+	except Exception:
+		return redirect(url_for('login_page'))
+
+	ldap_enable = sql.get_setting('ldap_enable')
+	user_group = roxywi_common.get_user_group(id=1)
+	settings = sql.get_setting('', all=1)
+	services = sql.select_services()
+	gits = sql.select_gits()
+	servers = roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1)
+	masters = sql.select_servers(get_master_servers=1, uuid=user_params['user_uuid'])
+	is_needed_tool = common.is_tool('ansible')
+	user_roles = sql.select_user_roles_by_group(user_group)
+	backups = sql.select_backups()
+	s3_backups = sql.select_s3_backups()
+	user_subscription = roxywi_common.return_user_subscription()
+
+	if user_params['lang'] == 'ru':
+		title = 'Сервера: '
+	else:
+		title = "Servers: "
+
+	return render_template(
+		'servers.html',
+		h2=1, title=title, role=user_params['role'], user=user, users=sql.select_users(group=user_group),
+		groups=sql.select_groups(), servers=servers, roles=sql.select_roles(), sshs=sql.select_ssh(group=user_group),
+		masters=masters, group=user_group, services=services, timezones=pytz.all_timezones, guide_me=1,
+		token=user_params['token'], settings=settings, backups=backups, s3_backups=s3_backups, page="servers.py",
+		 user_services=user_params['user_services'], ldap_enable=ldap_enable,
+		user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], gits=gits,
+		is_needed_tool=is_needed_tool, lang=user_params['lang'], user_roles=user_roles
+	)
diff --git a/app/waf.py b/app/waf.py
deleted file mode 100644
index 3ff9de96..00000000
--- a/app/waf.py
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/usr/bin/env python3
-import os
-import sys
-
-from jinja2 import Environment, FileSystemLoader
-
-import modules.db.sql as sql
-import modules.common.common as common
-import modules.roxywi.auth as roxywi_auth
-import modules.roxywi.common as roxywi_common
-import modules.config.config as config_mod
-import modules.roxy_wi_tools as roxy_wi_tools
-
-time_zone = sql.get_setting('time_zone')
-get_date = roxy_wi_tools.GetDate(time_zone)
-env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
-template = env.get_template('waf.html')
-
-print('Content-type: text/html\n')
-
-user_params = roxywi_common.get_users_params(haproxy=1)
-
-form = common.form
-manage_rules = form.getvalue('manage_rules')
-waf_rule_id = form.getvalue('waf_rule_id')
-service = form.getvalue('service')
-serv = form.getvalue('serv')
-config_file_name = ''
-waf_rule_file = ''
-servers_waf = ''
-autorefresh = 0
-config_read = ''
-rules = ''
-cfg = ''
-
-
-roxywi_auth.page_for_admin(level=2)
-
-if service == 'nginx':
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2)
-	servers = roxywi_common.get_dick_permit(nginx=1)
-else:
-	roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1)
-	servers = user_params['servers']
-
-if manage_rules == '1':
-	serv = common.is_ip_or_dns(form.getvalue('serv'))
-	roxywi_common.check_is_server_in_group(serv)
-	title = "Manage rules - Web application firewall"
-	rules = sql.select_waf_rules(serv, service)
-elif waf_rule_id and form.getvalue('config') is None:
-	serv = common.is_ip_or_dns(form.getvalue('serv'))
-	roxywi_common.check_is_server_in_group(serv)
-	title = 'Edit a WAF rule'
-	waf_rule_file = sql.select_waf_rule_by_id(waf_rule_id)
-	configs_dir = sql.get_setting('tmp_config_path')
-	cfg = configs_dir + serv + "-" + get_date.return_date('config') + "-" + waf_rule_file
-	error = config_mod.get_config(serv, cfg, waf=service, waf_rule_file=waf_rule_file)
-	if service == 'haproxy':
-		config_path = sql.get_setting('haproxy_dir')
-	elif service == 'nginx':
-		config_path = sql.get_setting('nginx_dir')
-
-	config_file_name = common.return_nice_path(config_path) + 'waf/rules/' + waf_rule_file
-	try:
-		conf = open(cfg, "r")
-		config_read = conf.read()
-		conf.close()
-	except IOError:
-		print('Cannot read imported config file')
-else:
-	title = "Web application firewall"
-	servers_waf = sql.select_waf_servers_metrics(user_params['user_uuid'].value)
-	autorefresh = 1
-
-if serv is not None and form.getvalue('config') is not None:
-	roxywi_common.check_is_server_in_group(serv)
-
-	configs_dir = sql.get_setting('tmp_config_path')
-	cfg = configs_dir + serv + "-" + get_date.return_date('config')
-	config_file_name = form.getvalue('config_file_name')
-	config = form.getvalue('config')
-	oldcfg = form.getvalue('oldconfig')
-	save = form.getvalue('save')
-
-	try:
-		with open(cfg, "a") as conf:
-			conf.write(config)
-	except IOError:
-		print("error: Cannot read imported config file")
-
-	stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, waf=1, oldcfg=oldcfg, config_file_name=config_file_name)
-
-	config_mod.diff_config(oldcfg, cfg)
-
-	try:
-		os.system("/bin/rm -f " + configs_dir + "*.old")
-	except Exception as e:
-		print('error: ' + str(e))
-
-	if stderr:
-		print(stderr)
-
-	sys.exit()
-
-rendered_template = template.render(
-	h2=1, title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], serv=serv, servers=servers_waf,
-	servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'],
-	waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id, config=config_read, cfg=cfg, token=user_params['token'],
-	config_file_name=config_file_name, service=service, lang=user_params['lang']
-)
-print(rendered_template)
diff --git a/config_other/httpd/roxy-wi.conf b/config_other/httpd/roxy-wi.conf
index d2e816f9..cee5e805 100644
--- a/config_other/httpd/roxy-wi.conf
+++ b/config_other/httpd/roxy-wi.conf
@@ -17,17 +17,15 @@
     RewriteRule /(.*)           ws://localhost:8765/ [P,L]
     ProxyPassReverse / http://localhost:8765/
 
-    WSGIDaemonProcess api display-name=%{GROUP} user=apache group=apache processes=1 threads=5
+    WSGIDaemonProcess roxy-wi-api display-name=%{GROUP} user=apache group=apache processes=1 threads=5
     WSGIScriptAlias /api /var/www/haproxy-wi/api/app.wsgi
 
-    DocumentRoot /var/www/haproxy-wi
-    ScriptAlias /cgi-bin/ "/var/www/haproxy-wi/app/"
+    WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=apache group=apache threads=10
+    WSGIScriptAlias /app /var/www/haproxy-wi/app/app.wsgi
 
-    <Directory /var/www/haproxy-wi/app>
-        AllowOverride FileInfo
-        DirectoryIndex overview.py
-        Options +ExecCGI
-        AddHandler cgi-script .py
+    <Directory /var/www/haproxy-wi/app/>
+        WSGIProcessGroup roxy-wi-app
+        WSGIApplicationGroup %{GLOBAL}
         Order deny,allow
         Allow from all
     </Directory>
diff --git a/config_other/httpd/roxy-wi_deb.conf b/config_other/httpd/roxy-wi_deb.conf
index 7a4bf49b..beca71c0 100644
--- a/config_other/httpd/roxy-wi_deb.conf
+++ b/config_other/httpd/roxy-wi_deb.conf
@@ -17,17 +17,15 @@
     RewriteRule /(.*)           ws://localhost:8765/ [P,L]
     ProxyPassReverse / http://localhost:8765/
 
-    WSGIDaemonProcess api display-name=%{GROUP} user=www-data group=www-data processes=1 threads=5
+    WSGIDaemonProcess roxy-wi-api display-name=%{GROUP} user=www-data group=www-data processes=1 threads=5
     WSGIScriptAlias /api /var/www/haproxy-wi/api/app.wsgi
 
-    DocumentRoot /var/www/haproxy-wi
-    ScriptAlias /cgi-bin/ "/var/www/haproxy-wi/app/"
+    WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=www-data group=www-data threads=10
+    WSGIScriptAlias /app /var/www/haproxy-wi/app/app.wsgi
 
-    <Directory /var/www/haproxy-wi/app>
-        AllowOverride FileInfo
-        DirectoryIndex overview.py
-        Options +ExecCGI
-        AddHandler cgi-script .py
+    <Directory /var/www/haproxy-wi/app/>
+        WSGIProcessGroup roxy-wi-app
+        WSGIApplicationGroup %{GLOBAL}
         Order deny,allow
         Allow from all
     </Directory>
diff --git a/config_other/requirements_el7.txt b/config_other/requirements_el7.txt
index 153f8f59..f86703a0 100644
--- a/config_other/requirements_el7.txt
+++ b/config_other/requirements_el7.txt
@@ -8,3 +8,4 @@ PyMySQL>=1.0.2
 retry>=0.9.2
 pdpyras>=4.5.2
 pika>=1.3.1
+Flask-Caching>=1.10.1
diff --git a/config_other/requirements_el8.txt b/config_other/requirements_el8.txt
index ef714cbb..b5748ed8 100644
--- a/config_other/requirements_el8.txt
+++ b/config_other/requirements_el8.txt
@@ -9,3 +9,4 @@ bottle>=0.12.18
 retry>=0.9.2
 pdpyras>=4.5.2
 pika>=1.3.1
+Flask-Caching>=1.10.1
diff --git a/config_other/requirements_el9.txt b/config_other/requirements_el9.txt
index 4b089ec4..b71612e4 100644
--- a/config_other/requirements_el9.txt
+++ b/config_other/requirements_el9.txt
@@ -9,3 +9,4 @@ bottle>=0.12.18
 retry>=0.9.2
 pdpyras>=4.5.2
 pika>=1.3.1
+Flask-Caching>=1.10.1
diff --git a/inc/add.js b/inc/add.js
index a46e8928..90782088 100644
--- a/inc/add.js
+++ b/inc/add.js
@@ -3,684 +3,653 @@ var ssl_offloading_var = "http-request set-header X-Forwarded-Port %[dst_port] \
 						"redirect scheme https if !{ ssl_fc } \n"
 
 $( function() {
-	$( "#listen-mode-select" ).on('selectmenuchange',function()  {
-		if ($( "#listen-mode-select option:selected" ).val() == "tcp") {
-			$( "#https-listen-span" ).hide("fast");
-			$( "#https-hide-listen" ).hide("fast");
-			$("#compression").checkboxradio( "disable" );
-			$("#cache").checkboxradio( "disable" );
-			$("#ssl_offloading").checkboxradio( "disable" );
-			$("#cookie").checkboxradio( "disable" );
-			$("#slow_atack").checkboxradio( "disable" );
-			$( "#https-listen" ).prop("checked", false);
+	$("#listen-mode-select").on('selectmenuchange', function () {
+		if ($("#listen-mode-select option:selected").val() == "tcp") {
+			$("#https-listen-span").hide("fast");
+			$("#https-hide-listen").hide("fast");
+			$("#compression").checkboxradio("disable");
+			$("#cache").checkboxradio("disable");
+			$("#ssl_offloading").checkboxradio("disable");
+			$("#cookie").checkboxradio("disable");
+			$("#slow_atack").checkboxradio("disable");
+			$("#https-listen").prop("checked", false);
 		} else {
-			$( "#https-listen-span" ).show("fast");
-			$("#compression").checkboxradio( "enable" );
-			$("#cache").checkboxradio( "enable" );
-			$("#ssl_offloading").checkboxradio( "enable" );
-			$("#cookie").checkboxradio( "enable" );
-			$("#slow_atack").checkboxradio( "enable" );
+			$("#https-listen-span").show("fast");
+			$("#compression").checkboxradio("enable");
+			$("#cache").checkboxradio("enable");
+			$("#ssl_offloading").checkboxradio("enable");
+			$("#cookie").checkboxradio("enable");
+			$("#slow_atack").checkboxradio("enable");
 		}
 	});
-	$( "#frontend-mode-select" ).on('selectmenuchange',function()  {
-		if ($( "#frontend-mode-select option:selected" ).val() == "tcp") {
-			$( "#https-frontend-span" ).hide("fast");
-			$( "#https-hide-frontend" ).hide("fast");
-			$("#compression2").checkboxradio( "disable" );
-			$("#cache2").checkboxradio( "disable" );
-			$("#ssl_offloading2").checkboxradio( "disable" );
-			$("#cookie2").checkboxradio( "disable" );
-			$("#slow_atack1").checkboxradio( "disable" );
+	$("#frontend-mode-select").on('selectmenuchange', function () {
+		if ($("#frontend-mode-select option:selected").val() == "tcp") {
+			$("#https-frontend-span").hide("fast");
+			$("#https-hide-frontend").hide("fast");
+			$("#compression2").checkboxradio("disable");
+			$("#cache2").checkboxradio("disable");
+			$("#ssl_offloading2").checkboxradio("disable");
+			$("#cookie2").checkboxradio("disable");
+			$("#slow_atack1").checkboxradio("disable");
 		} else {
-			$( "#https-frontend-span" ).show("fast");
-			$("#compression2").checkboxradio( "enable" );
-			$("#cache2").checkboxradio( "enable" );
-			$("#ssl_offloading2").checkboxradio( "enable" );
-			$("#cookie2").checkboxradio( "enable" );
-			$("#slow_atack1").checkboxradio( "enable" );
+			$("#https-frontend-span").show("fast");
+			$("#compression2").checkboxradio("enable");
+			$("#cache2").checkboxradio("enable");
+			$("#ssl_offloading2").checkboxradio("enable");
+			$("#cookie2").checkboxradio("enable");
+			$("#slow_atack1").checkboxradio("enable");
 		}
 	});
-	$( "#backend-mode-select" ).on('selectmenuchange',function()  {
-		if ($( "#backend-mode-select option:selected" ).val() == "tcp") {
-			$( "#https-backend-span" ).hide("fast");
-			$( "#https-hide-backend" ).hide("fast");
-			$("#compression3").checkboxradio( "disable" );
-			$("#cache3").checkboxradio( "disable" );
-			$("#ssl_offloading3").checkboxradio( "disable" );
-			$("#cookie3").checkboxradio( "disable" );
-			$("#slow_atack2").checkboxradio( "disable" );
+	$("#backend-mode-select").on('selectmenuchange', function () {
+		if ($("#backend-mode-select option:selected").val() == "tcp") {
+			$("#https-backend-span").hide("fast");
+			$("#https-hide-backend").hide("fast");
+			$("#compression3").checkboxradio("disable");
+			$("#cache3").checkboxradio("disable");
+			$("#ssl_offloading3").checkboxradio("disable");
+			$("#cookie3").checkboxradio("disable");
+			$("#slow_atack2").checkboxradio("disable");
 		} else {
-			$( "#https-backend-span" ).show("fast");
-			$("#compression3").checkboxradio( "enable" );
-			$("#cache3").checkboxradio( "enable" );
-			$("#ssl_offloading3").checkboxradio( "enable" );
-			$("#cookie3").checkboxradio( "enable" );
-			$("#slow_atack2").checkboxradio( "enable" );
+			$("#https-backend-span").show("fast");
+			$("#compression3").checkboxradio("enable");
+			$("#cache3").checkboxradio("enable");
+			$("#ssl_offloading3").checkboxradio("enable");
+			$("#cookie3").checkboxradio("enable");
+			$("#slow_atack2").checkboxradio("enable");
 		}
 	});
-	$( "#https-listen" ).click( function(){
+	$("#https-listen").click(function () {
 		if ($('#https-listen').is(':checked')) {
-			$( "#https-hide-listen" ).show( "fast" );
-			$( "#path-cert-listen" ).attr('required',true);
+			$("#https-hide-listen").show("fast");
+			$("#path-cert-listen").attr('required', true);
 		} else {
-			$( "#https-hide-listen" ).hide( "fast" );
-			$( "#path-cert-listen" ).prop('required',false);
+			$("#https-hide-listen").hide("fast");
+			$("#path-cert-listen").prop('required', false);
 		}
-	});	
-	$( "#https-frontend" ).click( function(){
+	});
+	$("#https-frontend").click(function () {
 		if ($('#https-frontend').is(':checked')) {
-			$( "#https-hide-frontend" ).show( "fast" );
-			$( "#path-cert-frontend" ).attr('required',true);
+			$("#https-hide-frontend").show("fast");
+			$("#path-cert-frontend").attr('required', true);
 		} else {
-			$( "#https-hide-frontend" ).hide( "fast" );
-			$( "#path-cert-frontend" ).prop('required',false);
+			$("#https-hide-frontend").hide("fast");
+			$("#path-cert-frontend").prop('required', false);
 		}
-	});	
-	$( "#https-backend" ).click( function(){
+	});
+	$("#https-backend").click(function () {
 		if ($('#https-backend').is(':checked')) {
-			$( "#https-hide-backend" ).show( "fast" );
+			$("#https-hide-backend").show("fast");
 		} else {
-			$( "#https-hide-backend" ).hide( "fast" );
+			$("#https-hide-backend").hide("fast");
 		}
 	});
-	$( "#ssl-dis-check-listen" ).click( function(){
+	$("#ssl-dis-check-listen").click(function () {
 		if ($('#ssl-dis-check-listen').is(':checked')) {
-			$( "#ssl-check-listen" ).checkboxradio( "disable" );
-			$( "#ssl-check-listen" ).prop( "checked", false );
-			$( "#ssl-check-listen" ).checkboxradio("refresh");
+			$("#ssl-check-listen").checkboxradio("disable");
+			$("#ssl-check-listen").prop("checked", false);
+			$("#ssl-check-listen").checkboxradio("refresh");
 		} else {
-			$( "#ssl-check-listen" ).checkboxradio( "enable" );
-			$( "#ssl-check-listen" ).prop( "checked", true );
-			$( "#ssl-check-listen" ).checkboxradio("refresh");
+			$("#ssl-check-listen").checkboxradio("enable");
+			$("#ssl-check-listen").prop("checked", true);
+			$("#ssl-check-listen").checkboxradio("refresh");
 		}
 	});
-	$( "#ssl-dis-check-backend" ).click( function(){
+	$("#ssl-dis-check-backend").click(function () {
 		if ($('#ssl-dis-check-backend').is(':checked')) {
-			$( "#ssl-check-backend" ).checkboxradio( "disable" );
-			$( "#ssl-check-backend" ).prop( "checked", false );
-			$( "#ssl-check-backend" ).checkboxradio("refresh");
+			$("#ssl-check-backend").checkboxradio("disable");
+			$("#ssl-check-backend").prop("checked", false);
+			$("#ssl-check-backend").checkboxradio("refresh");
 		} else {
-			$( "#ssl-check-backend" ).checkboxradio( "enable" );
-			$( "#ssl-check-backend" ).prop( "checked", true );
-			$( "#ssl-check-backend" ).checkboxradio("refresh");
+			$("#ssl-check-backend").checkboxradio("enable");
+			$("#ssl-check-backend").prop("checked", true);
+			$("#ssl-check-backend").checkboxradio("refresh");
 		}
 	});
-	$( "#options-listen-show" ).click( function(){
+	$("#options-listen-show").click(function () {
 		if ($('#options-listen-show').is(':checked')) {
-			$( "#options-listen-show-div" ).show( "fast" );
+			$("#options-listen-show-div").show("fast");
 		} else {
-			$( "#options-listen-show-div" ).hide( "fast" );
+			$("#options-listen-show-div").hide("fast");
 		}
-	});	
-	$( "#options-frontend-show" ).click( function(){
+	});
+	$("#options-frontend-show").click(function () {
 		if ($('#options-frontend-show').is(':checked')) {
-			$( "#options-frontend-show-div" ).show( "fast" );
+			$("#options-frontend-show-div").show("fast");
 		} else {
-			$( "#options-frontend-show-div" ).hide( "fast" );
+			$("#options-frontend-show-div").hide("fast");
 		}
-	});	
-	$( "#options-backend-show" ).click( function(){
+	});
+	$("#options-backend-show").click(function () {
 		if ($('#options-backend-show').is(':checked')) {
-			$( "#options-backend-show-div" ).show( "fast" );
+			$("#options-backend-show-div").show("fast");
 		} else {
-			$( "#options-backend-show-div" ).hide( "fast" );
+			$("#options-backend-show-div").hide("fast");
 		}
-	});	
-	$( "#controlgroup-listen-show" ).click( function(){
+	});
+	$("#controlgroup-listen-show").click(function () {
 		if ($('#controlgroup-listen-show').is(':checked')) {
-			$( "#controlgroup-listen" ).show( "fast" );
+			$("#controlgroup-listen").show("fast");
 			if ($('#check-servers-listen').is(':checked')) {
-				$( "#rise-listen" ).attr('required',true);
-				$( "#fall-listen" ).attr('required',true);
-				$( "#inter-listen" ).attr('required',true);
-				$( "#inter-listen" ).attr('disable',false);				
-			}				
+				$("#rise-listen").attr('required', true);
+				$("#fall-listen").attr('required', true);
+				$("#inter-listen").attr('required', true);
+				$("#inter-listen").attr('disable', false);
+			}
 		} else {
-			$( "#controlgroup-listen" ).hide( "fast" );			
+			$("#controlgroup-listen").hide("fast");
 		}
-		$( "#check-servers-listen" ).click( function(){
+		$("#check-servers-listen").click(function () {
 			if ($('#check-servers-listen').is(':checked')) {
-				$( "#rise-listen" ).attr('required',true);
-				$( "#fall-listen" ).attr('required',true);
-				$( "#inter-listen" ).attr('required',true);
-				$( "#inter-listen" ).selectmenu( "option", "disabled", false );
-				$( "#fall-listen" ).selectmenu( "option", "disabled", false );
-				$( "#rise-listen" ).selectmenu( "option", "disabled", false );
+				$("#rise-listen").attr('required', true);
+				$("#fall-listen").attr('required', true);
+				$("#inter-listen").attr('required', true);
+				$("#inter-listen").selectmenu("option", "disabled", false);
+				$("#fall-listen").selectmenu("option", "disabled", false);
+				$("#rise-listen").selectmenu("option", "disabled", false);
 			} else {
-				$( "#rise-listen" ).attr('required',false);
-				$( "#fall-listen" ).attr('required',false);
-				$( "#inter-listen" ).attr('required',false);
-				$( "#inter-listen" ).selectmenu( "option", "disabled", true );
-				$( "#fall-listen" ).selectmenu( "option", "disabled", true );
-				$( "#rise-listen" ).selectmenu( "option", "disabled", true );
+				$("#rise-listen").attr('required', false);
+				$("#fall-listen").attr('required', false);
+				$("#inter-listen").attr('required', false);
+				$("#inter-listen").selectmenu("option", "disabled", true);
+				$("#fall-listen").selectmenu("option", "disabled", true);
+				$("#rise-listen").selectmenu("option", "disabled", true);
 			}
 		});
 	});
-	$( "#controlgroup-backend-show" ).click( function(){
+	$("#controlgroup-backend-show").click(function () {
 		if ($('#controlgroup-backend-show').is(':checked')) {
-			$( "#controlgroup-backend" ).show( "fast" );
+			$("#controlgroup-backend").show("fast");
 			if ($('#check-servers-backend').is(':checked')) {
-				$( "#rise-backend" ).attr('required',true);
-				$( "#fall-backend" ).attr('required',true);
-				$( "#inter-backend" ).attr('required',true);
+				$("#rise-backend").attr('required', true);
+				$("#fall-backend").attr('required', true);
+				$("#inter-backend").attr('required', true);
 			}
 		} else {
-			$( "#controlgroup-backend" ).hide( "fast" );			
+			$("#controlgroup-backend").hide("fast");
 		}
 	});
-	$( "#circuit_breaking_listen" ).click( function(){
+	$("#circuit_breaking_listen").click(function () {
 		if ($('#circuit_breaking_listen').is(':checked')) {
-			$( "#circuit_breaking_listen_div" ).show( "fast" );
+			$("#circuit_breaking_listen_div").show("fast");
 		} else {
-			$( "#circuit_breaking_listen_div" ).hide( "fast" );
+			$("#circuit_breaking_listen_div").hide("fast");
 		}
 	});
-	$( "#circuit_breaking_backend" ).click( function(){
+	$("#circuit_breaking_backend").click(function () {
 		if ($('#circuit_breaking_backend').is(':checked')) {
-			$( "#circuit_breaking_backend_div" ).show( "fast" );
+			$("#circuit_breaking_backend_div").show("fast");
 		} else {
-			$( "#circuit_breaking_backend_div" ).hide( "fast" );
+			$("#circuit_breaking_backend_div").hide("fast");
 		}
 	});
-	$( "#cookie" ).click( function(){
+	$("#cookie").click(function () {
 		if ($('#cookie').is(':checked')) {
-			$("#cookie_name" ).attr('required',true);
-			$("#cookie_div").show( "fast" );
+			$("#cookie_name").attr('required', true);
+			$("#cookie_div").show("fast");
 		} else {
-			$("#cookie_name" ).attr('required',false);
-			$("#cookie_div").hide( "fast" );
-			$("#dynamic-cookie-key" ).attr('required',false);
+			$("#cookie_name").attr('required', false);
+			$("#cookie_div").hide("fast");
+			$("#dynamic-cookie-key").attr('required', false);
 		}
 	});
-	$( "#cookie2" ).click( function(){
+	$("#cookie2").click(function () {
 		if ($('#cookie2').is(':checked')) {
-			$("#cookie_name2" ).attr('required',true);
-			$("#cookie_div2").show( "fast" );
+			$("#cookie_name2").attr('required', true);
+			$("#cookie_div2").show("fast");
 		} else {
-			$("#cookie_name2" ).attr('required',false);
-			$("#cookie_div2").hide( "fast" );
-			$("#dynamic-cookie-key2" ).attr('required',false);
+			$("#cookie_name2").attr('required', false);
+			$("#cookie_div2").hide("fast");
+			$("#dynamic-cookie-key2").attr('required', false);
 		}
 	});
-	$( "#rewrite" ).on('selectmenuchange',function()  {
-		if ($( "#rewrite option:selected" ).val() == "insert" || $( "#rewrite option:selected" ).val() == "rewrite") {
-			$( "#prefix" ).checkboxradio( "disable" );
+	$("#rewrite").on('selectmenuchange', function () {
+		if ($("#rewrite option:selected").val() == "insert" || $("#rewrite option:selected").val() == "rewrite") {
+			$("#prefix").checkboxradio("disable");
 		} else {
-			$( "#prefix" ).checkboxradio( "enable" );
+			$("#prefix").checkboxradio("enable");
 		}
 	});
-	$( "#rewrite2" ).on('selectmenuchange',function()  {
-		if ($( "#rewrite2 option:selected" ).val() == "insert" || $( "#rewrite2 option:selected" ).val() == "rewrite") {
-			$( "#prefix2" ).checkboxradio( "disable" );
+	$("#rewrite2").on('selectmenuchange', function () {
+		if ($("#rewrite2 option:selected").val() == "insert" || $("#rewrite2 option:selected").val() == "rewrite") {
+			$("#prefix2").checkboxradio("disable");
 		} else {
-			$( "#prefix2" ).checkboxradio( "enable" );
+			$("#prefix2").checkboxradio("enable");
 		}
 	});
-	$( "#dynamic" ).click( function(){
+	$("#dynamic").click(function () {
 		if ($('#dynamic').is(':checked')) {
-			$("#dynamic-cookie-key" ).attr('required',true);
-			$("#dynamic_div").show("slide", "fast" );
+			$("#dynamic-cookie-key").attr('required', true);
+			$("#dynamic_div").show("slide", "fast");
 		} else {
-			$("#dynamic-cookie-key" ).attr('required',false);
-			$("#dynamic_div").hide("slide", "fast" );
+			$("#dynamic-cookie-key").attr('required', false);
+			$("#dynamic_div").hide("slide", "fast");
 		}
 	});
-	$( "#dynamic2" ).click( function(){
+	$("#dynamic2").click(function () {
 		if ($('#dynamic2').is(':checked')) {
-			$("#dynamic-cookie-key2" ).attr('required',true);
-			$("#dynamic_div2").show("slide", "fast" );
+			$("#dynamic-cookie-key2").attr('required', true);
+			$("#dynamic_div2").show("slide", "fast");
 		} else {
-			$("#dynamic-cookie-key2" ).attr('required',false);
-			$("#dynamic_div2").hide("slide", "fast" );
+			$("#dynamic-cookie-key2").attr('required', false);
+			$("#dynamic_div2").hide("slide", "fast");
 		}
 	});
-	$( "#check-servers-backend" ).click( function(){
+	$("#check-servers-backend").click(function () {
 		if ($('#check-servers-backend').is(':checked')) {
-			$( "#rise-backend" ).attr('required',true);
-			$( "#fall-backend" ).attr('required',true);
-			$( "#inter-backend" ).attr('required',true);
-			$( "#inter-backend" ).selectmenu( "option", "disabled", false );
-			$( "#fall-backend" ).selectmenu( "option", "disabled", false );
-			$( "#rise-backend" ).selectmenu( "option", "disabled", false );
+			$("#rise-backend").attr('required', true);
+			$("#fall-backend").attr('required', true);
+			$("#inter-backend").attr('required', true);
+			$("#inter-backend").selectmenu("option", "disabled", false);
+			$("#fall-backend").selectmenu("option", "disabled", false);
+			$("#rise-backend").selectmenu("option", "disabled", false);
 		} else {
-			$( "#rise-backend" ).attr('required',false);
-			$( "#fall-backend" ).attr('required',false);
-			$( "#inter-backend" ).attr('required',false);
-			$( "#inter-backend" ).selectmenu( "option", "disabled", true );
-			$( "#fall-backend" ).selectmenu( "option", "disabled", true );
-			$( "#rise-backend" ).selectmenu( "option", "disabled", true );
+			$("#rise-backend").attr('required', false);
+			$("#fall-backend").attr('required', false);
+			$("#inter-backend").attr('required', false);
+			$("#inter-backend").selectmenu("option", "disabled", true);
+			$("#fall-backend").selectmenu("option", "disabled", true);
+			$("#rise-backend").selectmenu("option", "disabled", true);
 		}
 	});
-	
-	
+
+
 	var availableTags = [
 		"acl", "hdr(host)", "hdr_beg(host)", "hdr_dom(host)", "http-request", "http-response", "set-uri", "set-url", "set-header", "add-header", "del-header", "replace-header", "path_beg", "url_beg()", "urlp_sub()", "set cookie", "dynamic-cookie-key", "mysql-check", "tcpka", "tcplog", "forwardfor", "option"
 	];
-			
-	$( "#ip" ).autocomplete({
-		source: function( request, response ) {
-			if(!checkIsServerFiled('#serv')) return false;
-			if ( request.term == "" ) {
+
+	$("#ip").autocomplete({
+		source: function (request, response) {
+			if (!checkIsServerFiled('#serv')) return false;
+			if (request.term == "") {
 				request.term = 1
 			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					show_ip: request.term,
-					serv: $("#serv").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
-					response(data.split(" "));				
-				}					
-			} );
-		},
-		autoFocus: true,
-		minLength: -1,
-		select: function( event, ui ) {
-			$('#listen-port').focus();				
-		}
-	});
-	$( "#ip1" ).autocomplete({
-		source: function( request, response ) {
-			if(!checkIsServerFiled('#serv2')) return false;
-			if ( request.term == "" ) {
-				request.term = 1
-			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					show_ip: request.term,
-					serv: $("#serv2").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+			$.ajax({
+				url: "/app/add/show/ip/" + $("#serv").val(),
+				// data: {
+				// 	show_ip: request.term,
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					response(data.split(" "));
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1,
-		select: function( event, ui ) {
+		select: function (event, ui) {
+			$('#listen-port').focus();
+		}
+	});
+	$("#ip1").autocomplete({
+		source: function (request, response) {
+			if (!checkIsServerFiled('#serv2')) return false;
+			if (request.term == "") {
+				request.term = 1
+			}
+			$.ajax({
+				url: "/app/add/show/ip/" + $("#serv2").val(),
+				// data: {
+				// 	show_ip: request.term,
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
+					response(data.split(" "));
+				}
+			});
+		},
+		autoFocus: true,
+		minLength: -1,
+		select: function (event, ui) {
 			$('#frontend-port').focus();
 		}
 	});
-	$( "#backends" ).autocomplete({
-		source: function( request, response ) {
-			if(!checkIsServerFiled('#serv2')) return false;
-			if ( request.term == "" ) {
+	$("#backends").autocomplete({
+		source: function (request, response) {
+			if (!checkIsServerFiled('#serv2')) return false;
+			if (request.term == "") {
 				request.term = 1
 			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					backend: request.term,
-					serv: $("#serv2").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
+			$.ajax({
+				url: "/app/runtimeapi/backends/" + $("#serv2").val(),
+				// data: {
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
 					response(data.split('<br>'));
-				}						
-			} );
+				}
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
-	$( "#blacklist-hide-input" ).autocomplete({
-		source: function( request, response ) {
-			if ( request.term == "" ) {
+	$("#blacklist-hide-input").autocomplete({
+		source: function (request, response) {
+			if (request.term == "") {
 				request.term = 1
 			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					get_lists: request.term,
-					color: "black",
-					group: $("#group").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
-					response(data.split(" "));
-				}						
-			} );
-		},
-		autoFocus: true,
-		minLength: -1
-	});
-	$( "#blacklist-hide-input1" ).autocomplete({
-		source: function( request, response ) {
-			if ( request.term == "" ) {
-				request.term = 1
-			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					get_lists: request.term,
-					color: "black",
-					group: $("#group").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
-					response(data.split(" "));
-				}						
-			} );
-		},
-		autoFocus: true,
-		minLength: -1
-	});
-	$( "#whitelist-hide-input" ).autocomplete({
-		source: function( request, response ) {
-			if ( request.term == "" ) {
-				request.term = 1
-			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					get_lists: request.term,
-					color: "white",
-					group: $("#group").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+			$.ajax({
+				url: "/app/add/haproxy/bwlists/black/" + $("#group").val(),
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					response(data.split(" "));
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
-	$( "#whitelist-hide-input1" ).autocomplete({
-		source: function( request, response ) {
-			if ( request.term == "" ) {
+	$("#blacklist-hide-input1").autocomplete({
+		source: function (request, response) {
+			if (request.term == "") {
 				request.term = 1
 			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					get_lists: request.term,
-					color: "white",
-					group: $("#group").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+			$.ajax({
+				url: "/app/add/haproxy/bwlists/black/" + $("#group").val(),
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					response(data.split(" "));
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
-	$( "#new-option" ).autocomplete({
+	$("#whitelist-hide-input").autocomplete({
+		source: function (request, response) {
+			if (request.term == "") {
+				request.term = 1
+			}
+			$.ajax({
+				url: "/app/add/haproxy/bwlists/white/" + $("#group").val(),
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
+					response(data.split(" "));
+				}
+			});
+		},
+		autoFocus: true,
+		minLength: -1
+	});
+	$("#whitelist-hide-input1").autocomplete({
+		source: function (request, response) {
+			if (request.term == "") {
+				request.term = 1
+			}
+			$.ajax({
+				url: "/app/add/haproxy/bwlists/white/" + $("#group").val(),
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
+					response(data.split(" "));
+				}
+			});
+		},
+		autoFocus: true,
+		minLength: -1
+	});
+	$("#new-option").autocomplete({
 		source: availableTags,
 		autoFocus: true,
-	    minLength: -1,
-		select: function( event, ui ) {
+		minLength: -1,
+		select: function (event, ui) {
 			$("#new-option").append(ui.item.value + " ")
 		}
 	});
-	$( "#option_table input" ).change(function() {
+	$("#option_table input").change(function () {
 		var id = $(this).attr('id').split('-');
 		updateOptions(id[2])
 	});
-	$( "#options" ).autocomplete({
+	$("#options").autocomplete({
 		source: availableTags,
 		autoFocus: true,
-	    minLength: -1,
-		select: function( event, ui ) {
+		minLength: -1,
+		select: function (event, ui) {
 			$("#optionsInput").append(ui.item.value + " ");
 			$(this).val('');
 			return false;
 		}
 	});
-	$( "#saved-options" ).autocomplete({
+	$("#saved-options").autocomplete({
 		dataType: "json",
-		source: "options.py?getoption="+$('#group').val()+'&token='+$('#token').val(),
+		source: "/app/add/option/get/" + $('#group').val(),
 		autoFocus: true,
-	    minLength: 1,
-		select: function( event, ui ) {
+		minLength: 1,
+		select: function (event, ui) {
 			$("#optionsInput").append(ui.item.value + " \n");
 			$(this).val('');
 			return false;
 		}
 	});
-	$( "#options1" ).autocomplete({
+	$("#options1").autocomplete({
 		source: availableTags,
 		autoFocus: true,
-	    minLength: -1,
-		select: function( event, ui ) {
+		minLength: -1,
+		select: function (event, ui) {
 			$("#optionsInput1").append(ui.item.value + " ");
 			$(this).val('');
-			return false; 
+			return false;
 		}
 	});
-	
-	$( "#saved-options1" ).autocomplete({
+
+	$("#saved-options1").autocomplete({
 		dataType: "json",
-		source: "options.py?getoption="+$('#group').val()+'&token='+$('#token').val(),
+		source: "/app/add/option/get/" + $('#group').val(),
 		autoFocus: true,
-	    minLength: 1,
-		select: function( event, ui ) {
-			$("#optionsInput1").append(ui.item.value + " \n");	
+		minLength: 1,
+		select: function (event, ui) {
+			$("#optionsInput1").append(ui.item.value + " \n");
 			$(this).val('');
-			return false;		
+			return false;
 		}
 	});
-	$( "#options2" ).autocomplete({
+	$("#options2").autocomplete({
 		source: availableTags,
 		autoFocus: true,
-	    minLength: -1,
-		select: function( event, ui ) {
+		minLength: -1,
+		select: function (event, ui) {
 			$("#optionsInput2").append(ui.item.value + " ");
 			$(this).val('');
 			return false;
 		}
 	});
-	$( "#saved-options2" ).autocomplete({
+	$("#saved-options2").autocomplete({
 		dataType: "json",
-		source: "options.py?getoption="+$('#group').val()+'&token='+$('#token').val(),
+		source: "/app/add/option/get/" + $('#group').val(),
 		autoFocus: true,
-	    minLength: 1,
-		select: function( event, ui ) {
-			$("#optionsInput2").append(ui.item.value + " \n");	
+		minLength: 1,
+		select: function (event, ui) {
+			$("#optionsInput2").append(ui.item.value + " \n");
 			$(this).val('');
 			return false;
 		}
 	});
-	$('#add-option-button').click(function() {
+	$('#add-option-button').click(function () {
 		if ($('#option-add-table').css('display', 'none')) {
 			$('#option-add-table').show("blind", "fast");
-		} 
+		}
 	});
-	$('#add-option-new').click(function() {
-		$.ajax( {
-			url: "options.py",
+	$('#add-option-new').click(function () {
+		$.ajax({
+			url: "/app/add/option/save",
 			data: {
-				newtoption: $('#new-option').val(),
-				newoptiongroup: $('#group').val(),
-				token: $('#token').val()
+				option: $('#new-option').val(),
+				option_group: $('#group').val()
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					$("#option_table").append(data);
-					setTimeout(function() {
-						$( ".newoption" ).removeClass( "update" );
-					}, 2500 );	
+					setTimeout(function () {
+						$(".newoption").removeClass("update");
+					}, 2500);
 					$.getScript("/inc/fontawesome.min.js");
 				}
-			}					
-		} );
+			}
+		});
 	});
-	$( "#servers_table input" ).change(function() {
+	$("#servers_table input").change(function () {
 		var id = $(this).attr('id').split('-');
 		updateSavedServer(id[2])
 
 	});
-	$( '[name=servers]' ).autocomplete({
-		source: "options.py?getsavedserver="+$('#group').val()+'&token='+$('#token').val(),
+	$('[name=servers]').autocomplete({
+		source: "/app/add/server/get/" + $('#group').val(),
 		autoFocus: true,
-	    minLength: 1,
-		select: function( event, ui ) {
+		minLength: 1,
+		select: function (event, ui) {
 			$(this).append(ui.item.value + " ");
 			$(this).next().focus();
 		}
 	})
-	.autocomplete( "instance" )._renderItem = function( ul, item ) {
-		return $( "<li>" )
-		.append( "<div>" + item.value + "<br>" + item.desc + "</div>" )
-		.appendTo( ul );
-    };
-	$('#add-saved-server-button').click(function() {
+		.autocomplete("instance")._renderItem = function (ul, item) {
+		return $("<li>")
+			.append("<div>" + item.value + "<br>" + item.desc + "</div>")
+			.appendTo(ul);
+	};
+	$('#add-saved-server-button').click(function () {
 		if ($('#saved-server-add-table').css('display', 'none')) {
 			$('#saved-server-add-table').show("blind", "fast");
-		} 
+		}
 	});
-	$('#add-saved-server-new').click(function() {
-		$.ajax( {
-			
-			url: "options.py",
+	$('#add-saved-server-new').click(function () {
+		$.ajax({
+			url: "/app/add/server/save",
 			data: {
-				newsavedserver: $('#new-saved-servers').val(),
-				newsavedservergroup: $('#group').val(),
-				newsavedserverdesc: $('#new-saved-servers-description').val(),
-				token: $('#token').val()
+				server: $('#new-saved-servers').val(),
+				group: $('#group').val(),
+				desc: $('#new-saved-servers-description').val()
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					$("#servers_table").append(data);
-					setTimeout(function() {
-						$( ".newsavedserver" ).removeClass( "update" );
-					}, 2500 );	
+					setTimeout(function () {
+						$(".newsavedserver").removeClass("update");
+					}, 2500);
 					$.getScript("/inc/fontawesome.min.js");
 				}
-			}					
-		} );
+			}
+		});
 	});
 	var forward_for_var = "option forwardfor if-none\n";
-	$('#forward_for').click(function() {
-		if($('#optionsInput').val().indexOf(forward_for_var) == '-1') {
+	$('#forward_for').click(function () {
+		if ($('#optionsInput').val().indexOf(forward_for_var) == '-1') {
 			$("#optionsInput").append(forward_for_var)
 		} else {
 			replace_text("#optionsInput", forward_for_var);
-		}	
+		}
 	});
-	$('#forward_for1').click(function() {
-		if($('#optionsInput1').val().indexOf(forward_for_var) == '-1') {
+	$('#forward_for1').click(function () {
+		if ($('#optionsInput1').val().indexOf(forward_for_var) == '-1') {
 			$("#optionsInput1").append(forward_for_var)
 		} else {
 			replace_text("#optionsInput1", forward_for_var);
-		}	
+		}
 	});
-	$('#forward_for2').click(function() {
-		if($('#optionsInput2').val().indexOf(forward_for_var) == '-1') {
+	$('#forward_for2').click(function () {
+		if ($('#optionsInput2').val().indexOf(forward_for_var) == '-1') {
 			$("#optionsInput2").append(forward_for_var)
 		} else {
 			replace_text("#optionsInput2", forward_for_var);
-		}	
+		}
 	});
 	var redispatch_var = "option redispatch\n";
-	$('#redispatch').click(function() {
-		if($('#optionsInput').val().indexOf(redispatch_var) == '-1') {
+	$('#redispatch').click(function () {
+		if ($('#optionsInput').val().indexOf(redispatch_var) == '-1') {
 			$("#optionsInput").append(redispatch_var)
 		} else {
 			replace_text("#optionsInput", redispatch_var);
-		}	
+		}
 	});
-	$('#redispatch2').click(function() {
-		if($('#optionsInput2').val().indexOf(redispatch_var) == '-1') {
+	$('#redispatch2').click(function () {
+		if ($('#optionsInput2').val().indexOf(redispatch_var) == '-1') {
 			$("#optionsInput2").append(redispatch_var)
 		} else {
 			replace_text("#optionsInput2", redispatch_var);
-		}	
+		}
 	});
 	var slow_atack = "option http-buffer-request\ntimeout http-request 10s\n"
-	$('#slow_atack').click(function() {
-		if($('#optionsInput').val().indexOf(slow_atack) == '-1') {
+	$('#slow_atack').click(function () {
+		if ($('#optionsInput').val().indexOf(slow_atack) == '-1') {
 			$("#optionsInput").append(slow_atack)
 		} else {
 			replace_text("#optionsInput", slow_atack);
-		}	
+		}
 	});
-	$('#slow_atack1').click(function() {
-		if($('#optionsInput1').val().indexOf(slow_atack) == '-1') {
+	$('#slow_atack1').click(function () {
+		if ($('#optionsInput1').val().indexOf(slow_atack) == '-1') {
 			$("#optionsInput1").append(slow_atack)
 		} else {
 			replace_text("#optionsInput1", slow_atack);
-		}	
+		}
 	});
-	$("#ddos").checkboxradio( "disable" );
-	$("#ddos1").checkboxradio( "disable" );
-	$("#ddos2").checkboxradio( "disable" );
-	$( "#name" ).change(function() {
+	$("#ddos").checkboxradio("disable");
+	$("#ddos1").checkboxradio("disable");
+	$("#ddos2").checkboxradio("disable");
+	$("#name").change(function () {
 		table_name = $('#name').val();
 		table_name = $.trim(table_name)
-		if($('#name').val() != "") {
-			$("#ddos").checkboxradio( "enable" );
+		if ($('#name').val() != "") {
+			$("#ddos").checkboxradio("enable");
 		} else {
-			$("#ddos").checkboxradio( "disable" );
+			$("#ddos").checkboxradio("disable");
 		}
 	});
-	$( "#new_frontend" ).change(function() {
+	$("#new_frontend").change(function () {
 		table_name = $('#new_frontend').val();
 		table_name = $.trim(table_name)
-		if($('#new_frontend').val() != "") {
-			$("#ddos1").checkboxradio( "enable" );
+		if ($('#new_frontend').val() != "") {
+			$("#ddos1").checkboxradio("enable");
 		} else {
-			$("#ddos1").checkboxradio( "disable" );
+			$("#ddos1").checkboxradio("disable");
 		}
 	});
-	
-	$('#ddos').click(function() {
-		if($('#name').val() == "") {
+
+	$('#ddos').click(function () {
+		if ($('#name').val() == "") {
 			$("#optionsInput").append(ddos_var)
 		}
-		var ddos_var = "#Start config for DDOS atack protect\n"+
-								  "stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n"+
-								  "tcp-request connection track-sc1 src\n"+
-								  "tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n"+
-								  "# Abuser means more than 100reqs/10s\n"+
-								  "acl abuse sc1_http_req_rate("+table_name+") ge 100\n"+
-								  "acl flag_abuser sc1_inc_gpc0("+table_name+")\n"+
-								  "tcp-request content reject if abuse flag_abuser\n"+
-								  "#End config for DDOS\n";
-		if($('#optionsInput').val().indexOf(ddos_var) == '-1') {			
-			if($('#name').val() == "") {
+		var ddos_var = "#Start config for DDOS atack protect\n" +
+			"stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n" +
+			"tcp-request connection track-sc1 src\n" +
+			"tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n" +
+			"# Abuser means more than 100reqs/10s\n" +
+			"acl abuse sc1_http_req_rate(" + table_name + ") ge 100\n" +
+			"acl flag_abuser sc1_inc_gpc0(" + table_name + ")\n" +
+			"tcp-request content reject if abuse flag_abuser\n" +
+			"#End config for DDOS\n";
+		if ($('#optionsInput').val().indexOf(ddos_var) == '-1') {
+			if ($('#name').val() == "") {
 				alert("First set Listen name")
 			} else {
 				$("#optionsInput").append(ddos_var);
 			}
 		} else {
 			replace_text("#optionsInput", ddos_var);
-		}	
+		}
 	});
-	$('#ddos1').click(function() {
+	$('#ddos1').click(function () {
 		ddos_var = escapeHtml(ddos_var);
 		table_name = escapeHtml(table_name);
-		if($('#new_frontend').val() == "") {
+		if ($('#new_frontend').val() == "") {
 			$("#optionsInput1").append(ddos_var)
 		}
-		var ddos_var = "#Start config for DDOS atack protect\n"+
-								  "stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n"+
-								  "tcp-request connection track-sc1 src\n"+
-								  "tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n"+
-								  "# Abuser means more than 100reqs/10s\n"+
-								  "acl abuse sc1_http_req_rate("+table_name+") ge 100\n"+
-								  "acl flag_abuser sc1_inc_gpc0("+table_name+")\n"+
-								  "tcp-request content reject if abuse flag_abuser\n"+
-								  "#End config for DDOS\n";
-		if($('#optionsInput1').val().indexOf(ddos_var) == '-1') {
-			if($('#new_frontend').val() == "") {
+		var ddos_var = "#Start config for DDOS atack protect\n" +
+			"stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n" +
+			"tcp-request connection track-sc1 src\n" +
+			"tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n" +
+			"# Abuser means more than 100reqs/10s\n" +
+			"acl abuse sc1_http_req_rate(" + table_name + ") ge 100\n" +
+			"acl flag_abuser sc1_inc_gpc0(" + table_name + ")\n" +
+			"tcp-request content reject if abuse flag_abuser\n" +
+			"#End config for DDOS\n";
+		if ($('#optionsInput1').val().indexOf(ddos_var) == '-1') {
+			if ($('#new_frontend').val() == "") {
 				alert("First set Frontend name")
 			} else {
 				$("#optionsInput1").append(ddos_var)
@@ -689,249 +658,240 @@ $( function() {
 			replace_text("#optionsInput1", ddos_var);
 		}
 	});
-	var antibot_var = "#Start config for Antibot protection\n"+
+	var antibot_var = "#Start config for Antibot protection\n" +
 		"http-request track-sc0 src table per_ip_rates\n" +
 		"http-request track-sc1 url32+src table per_ip_and_url_rates unless { path_end .css .js .png .jpeg .gif }\n" +
 		"acl exceeds_limit sc_gpc0_rate(0) gt 15 \n" +
 		"http-request sc-inc-gpc0(0) if { sc_http_req_rate(1) eq 1 } !exceeds_limit\n" +
 		"http-request deny if exceeds_limit\n" +
 		"#End config for Antibot\n";
-	$('#antibot').click(function() {
-		if($('#optionsInput').val().indexOf(antibot_var) == '-1') {
+	$('#antibot').click(function () {
+		if ($('#optionsInput').val().indexOf(antibot_var) == '-1') {
 			$("#optionsInput").append(antibot_var)
 		} else {
 			replace_text("#optionsInput", antibot_var);
 		}
 	});
-	$('#antibot1').click(function() {
-		if($('#optionsInput1').val().indexOf(antibot_var) == '-1') {
+	$('#antibot1').click(function () {
+		if ($('#optionsInput1').val().indexOf(antibot_var) == '-1') {
 			$("#optionsInput1").append(antibot_var)
 		} else {
 			replace_text("#optionsInput1", antibot_var);
 		}
 	});
-	$( "#blacklist_checkbox" ).click( function(){
+	$("#blacklist_checkbox").click(function () {
 		if ($('#blacklist_checkbox').is(':checked')) {
-			$( "#blacklist-hide" ).show( "fast" );
-			$( "#blacklist-hide-input" ).attr('required',true);
+			$("#blacklist-hide").show("fast");
+			$("#blacklist-hide-input").attr('required', true);
 		} else {
-			$( "#blacklist-hide" ).hide( "fast" );
-			$( "#blacklist-hide-input" ).prop('required',false);
+			$("#blacklist-hide").hide("fast");
+			$("#blacklist-hide-input").prop('required', false);
 		}
 	});
-	$( "#blacklist_checkbox1" ).click( function(){
+	$("#blacklist_checkbox1").click(function () {
 		if ($('#blacklist_checkbox1').is(':checked')) {
-			$( "#blacklist-hide1" ).show( "fast" );
-			$( "#blacklist-hide-input1" ).attr('required',true);
+			$("#blacklist-hide1").show("fast");
+			$("#blacklist-hide-input1").attr('required', true);
 		} else {
-			$( "#blacklist-hide1" ).hide( "fast" );
-			$( "#blacklist-hide-input1" ).prop('required',false);
+			$("#blacklist-hide1").hide("fast");
+			$("#blacklist-hide-input1").prop('required', false);
 		}
 	});
-	$( "#whitelist_checkbox" ).click( function(){
+	$("#whitelist_checkbox").click(function () {
 		if ($('#whitelist_checkbox').is(':checked')) {
-			$( "#whitelist-hide" ).show( "fast" );
-			$( "#whitelist-hide-input" ).attr('required',true);
+			$("#whitelist-hide").show("fast");
+			$("#whitelist-hide-input").attr('required', true);
 		} else {
-			$( "#whitelist-hide" ).hide( "fast" );
-			$( "#whitelist-hide-input" ).prop('required',false);
+			$("#whitelist-hide").hide("fast");
+			$("#whitelist-hide-input").prop('required', false);
 		}
 	});
-	$( "#whitelist_checkbox1" ).click( function(){
+	$("#whitelist_checkbox1").click(function () {
 		if ($('#whitelist_checkbox1').is(':checked')) {
-			$( "#whitelist-hide1" ).show( "fast" );
-			$( "#whitelist-hide-input1" ).attr('required',true);
+			$("#whitelist-hide1").show("fast");
+			$("#whitelist-hide-input1").attr('required', true);
 		} else {
-			$( "#whitelist-hide1" ).hide( "fast" );
-			$( "#whitelist-hide-input1" ).prop('required',false);
+			$("#whitelist-hide1").hide("fast");
+			$("#whitelist-hide-input1").prop('required', false);
 		}
 	});
-	$( ":regex(id, template)" ).click( function(){
+	$(":regex(id, template)").click(function () {
 		if ($(':regex(id, template)').is(':checked')) {
-			$( ".prefix" ).show( "fast" );
-			$( ".second-server" ).hide( "fast" );
-			$( ".backend_server" ).hide( "fast" );
-			$( ".send_proxy" ).hide( "fast" );
-			$( "input[name=server_maxconn]" ).hide( "fast" );
-			$( "input[name=port_check]" ).hide( "fast" );
-			$( "[name=maxconn_name]" ).hide( "fast" );
-			$( "[name=port_check_text]" ).hide( "fast" );
-			$( ".prefix" ).attr('required',true);
+			$(".prefix").show("fast");
+			$(".second-server").hide("fast");
+			$(".backend_server").hide("fast");
+			$(".send_proxy").hide("fast");
+			$("input[name=server_maxconn]").hide("fast");
+			$("input[name=port_check]").hide("fast");
+			$("[name=maxconn_name]").hide("fast");
+			$("[name=port_check_text]").hide("fast");
+			$(".prefix").attr('required', true);
 		} else {
-			$( ".prefix" ).hide( "fast" );
-			$( ".prefix" ).attr('required',false);
-			$( ".second-server" ).show( "fast" );
-			$( ".backend_server" ).show( "fast" )
-			$( ".send_proxy" ).show( "fast" )
-			$( "input[name=server_maxconn]" ).show( "fast" );
-			$( "input[name=port_check]" ).show( "fast" );
-			$( "[name=maxconn_name]" ).show( "fast" );
-			$( "[name=port_check_text]" ).show( "fast" );
+			$(".prefix").hide("fast");
+			$(".prefix").attr('required', false);
+			$(".second-server").show("fast");
+			$(".backend_server").show("fast")
+			$(".send_proxy").show("fast")
+			$("input[name=server_maxconn]").show("fast");
+			$("input[name=port_check]").show("fast");
+			$("[name=maxconn_name]").show("fast");
+			$("[name=port_check_text]").show("fast");
 		}
 	});
-	var location = window.location.href;
-    var cur_url = '/app/' + location.split('/').pop();
-	cur_url = cur_url.split('?');
-	cur_url = cur_url[0].split('#');
-	if (cur_url[0] == "/app/add.py") {
-		$("#cache").checkboxradio( "disable" );
-		$("#waf").checkboxradio( "disable" );
-		$( "#serv" ).on('selectmenuchange',function() {
+	var cur_url = window.location.href.split('/app/').pop();
+	cur_url = cur_url.split('/');
+	if (cur_url[0] == "add") {
+		$("#cache").checkboxradio("disable");
+		$("#waf").checkboxradio("disable");
+		$("#serv").on('selectmenuchange', function () {
 			change_select_acceleration("");
 			change_select_waf("");
 		});
-		
-		$("#cache2").checkboxradio( "disable" );
-		$("#waf2").checkboxradio( "disable" );
-		$( "#serv2" ).on('selectmenuchange',function() {
+		$("#cache2").checkboxradio("disable");
+		$("#waf2").checkboxradio("disable");
+		$("#serv2").on('selectmenuchange', function () {
 			change_select_acceleration("2");
 			change_select_waf("2");
 		});
-			
-		$("#cache3").checkboxradio( "disable" );
-		$( "#serv3" ).on('selectmenuchange',function() {
+		$("#cache3").checkboxradio("disable");
+		$("#serv3").on('selectmenuchange', function () {
 			change_select_acceleration("3");
 		});
-		$('#compression').on( "click", function() {
+		$('#compression').on("click", function () {
 			if ($('#compression').is(':checked')) {
-				$("#cache").checkboxradio( "disable" );
+				$("#cache").checkboxradio("disable");
 				$("#cache").prop('checked', false);
 			} else {
 				change_select_acceleration("");
 			}
 		});
-		$('#compression2').on( "click", function() {
+		$('#compression2').on("click", function () {
 			if ($('#compression2').is(':checked')) {
-				$("#cache2").checkboxradio( "disable" );
+				$("#cache2").checkboxradio("disable");
 				$("#cache2").prop('checked', false);
 			} else {
 				change_select_acceleration('2');
 			}
 		});
-		$('#compression3').on( "click", function() {
+		$('#compression3').on("click", function () {
 			if ($('#compression3').is(':checked')) {
-				$("#cache3").checkboxradio( "disable" );
+				$("#cache3").checkboxradio("disable");
 				$("#cache3").prop('checked', false);
 			} else {
 				change_select_acceleration('3');
 			}
 		});
-		$('#cache').on( "click", function() {
+		$('#cache').on("click", function () {
 			if ($('#cache').is(':checked')) {
-				$("#compression").checkboxradio( "disable" );
+				$("#compression").checkboxradio("disable");
 				$("#compression").prop('checked', false);
 			} else {
-				$("#compression").checkboxradio( "enable" );
+				$("#compression").checkboxradio("enable");
 			}
 		});
-		$('#cache2').on( "click", function() {
+		$('#cache2').on("click", function () {
 			if ($('#cache2').is(':checked')) {
-				$("#compression2").checkboxradio( "disable" );
+				$("#compression2").checkboxradio("disable");
 				$("#compression2").prop('checked', false);
 			} else {
-				$("#compression2").checkboxradio( "enable" );
+				$("#compression2").checkboxradio("enable");
 			}
 		});
-		$('#cache3').on( "click", function() {
+		$('#cache3').on("click", function () {
 			if ($('#cache3').is(':checked')) {
-				$("#compression3").checkboxradio( "disable" );
+				$("#compression3").checkboxradio("disable");
 				$("#compression3").prop('checked', false);
 			} else {
-				$("#compression3").checkboxradio( "enable" );
+				$("#compression3").checkboxradio("enable");
 			}
 		});
-		$( "#add1" ).on( "click", function() {
+		$("#add1").on("click", function () {
 			$('.menu li ul li').each(function () {
 				$(this).find('a').css('padding-left', '20px')
 				$(this).find('a').css('border-left', '0px solid #5D9CEB');
+				$(this).find('a').css('background-color', '#48505A');
 				$(this).children("#add1").css('padding-left', '30px');
 				$(this).children("#add1").css('border-left', '4px solid #5D9CEB');
+				$(this).children("#add1").css('background-color', 'var(--right-menu-blue-rolor)');
 			});
-			$( "#tabs" ).tabs( "option", "active", 0 );
-		} );
-		$( "#add3" ).on( "click", function() {
+			$("#tabs").tabs("option", "active", 0);
+		});
+		$("#add3").on("click", function () {
 			$('.menu li ul li').each(function () {
 				$(this).find('a').css('padding-left', '20px')
 				$(this).find('a').css('border-left', '0px solid #5D9CEB');
+				$(this).find('a').css('background-color', '#48505A');
 				$(this).children("#add3").css('padding-left', '30px');
 				$(this).children("#add3").css('border-left', '4px solid #5D9CEB');
+				$(this).children("#add3").css('background-color', 'var(--right-menu-blue-rolor)');
 			});
-			$( "#tabs" ).tabs( "option", "active", 4 );
-		} );
-		$( "#add4" ).on( "click", function() {
-			$( "#tabs" ).tabs( "option", "active", 5 );
-		} );
-		$( "#add5" ).on( "click", function() {
-			$( "#tabs" ).tabs( "option", "active", 6 );
-		} );
-		$( "#add6" ).on( "click", function() {
-			$( "#tabs" ).tabs( "option", "active", 7 );
-			$( "#userlist_serv" ).selectmenu( "open" );
-		} );
-		$( "#add7" ).on( "click", function() {
+			$("#tabs").tabs("option", "active", 4);
+		});
+		$("#add4").on("click", function () {
+			$("#tabs").tabs("option", "active", 5);
+		});
+		$("#add5").on("click", function () {
+			$("#tabs").tabs("option", "active", 6);
+		});
+		$("#add6").on("click", function () {
+			$("#tabs").tabs("option", "active", 7);
+			$("#userlist_serv").selectmenu("open");
+		});
+		$("#add7").on("click", function () {
 			$('.menu li ul li').each(function () {
 				$(this).find('a').css('padding-left', '20px')
 				$(this).find('a').css('border-left', '0px solid #5D9CEB');
+				$(this).find('a').css('background-color', '#48505A');
 				$(this).children("#add7").css('padding-left', '30px');
 				$(this).children("#add7").css('border-left', '4px solid #5D9CEB');
+				$(this).children("#add7").css('background-color', 'var(--right-menu-blue-rolor)');
 			});
-			$( "#tabs" ).tabs( "option", "active", 9 );
-		} );
+			$("#tabs").tabs("option", "active", 9);
+		});
 	}
-	
-	$( "#path-cert-listen" ).autocomplete({
-		source: function( request, response ) {
-			if(!checkIsServerFiled('#serv')) return false;
-			$.ajax( {
-				url: "options.py",
-				data: {
-					getcerts:1,
-					serv: $("#serv").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+
+	$("#path-cert-listen").autocomplete({
+		source: function (request, response) {
+			if (!checkIsServerFiled('#serv')) return false;
+			$.ajax({
+				url: "/app/add/certs/" + $('#serv').val(),
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					response(data.split(" "));
-				}						
-			} );
+				}
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
-	$( "#path-cert-frontend" ).autocomplete({
-		source: function( request, response ) {
-			if(!checkIsServerFiled('#serv2')) return false;
-			$.ajax( {
-				url: "options.py",
-				data: {
-					getcerts:1,
-					serv: $("#serv2").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+	$("#path-cert-frontend").autocomplete({
+		source: function (request, response) {
+			if (!checkIsServerFiled('#serv2')) return false;
+			$.ajax({
+				url: "/app/add/certs/" + $('#serv2').val(),
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					response(data.split(" "));
-				}						
-			} );
+				}
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
-	$( "#ssl_key_upload" ).click(function() {
-		if(!checkIsServerFiled('#serv4')) return false;
-		if(!checkIsServerFiled('#ssl_name', 'Enter the Certificate name')) return false;
-		if(!checkIsServerFiled('#ssl_cert', 'Paste the contents of the certificate file')) return false;
-		$.ajax( {
-			url: "options.py",
+	$("#ssl_key_upload").click(function () {
+		if (!checkIsServerFiled('#serv4')) return false;
+		if (!checkIsServerFiled('#ssl_name', 'Enter the Certificate name')) return false;
+		if (!checkIsServerFiled('#ssl_cert', 'Paste the contents of the certificate file')) return false;
+		$.ajax({
+			url: "/app/add/cert/add",
 			data: {
 				serv: $('#serv4').val(),
 				ssl_cert: $('#ssl_cert').val(),
-				ssl_name: $('#ssl_name').val(),
-				token: $('#token').val()
+				ssl_name: $('#ssl_name').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.split("<br/>");
+			success: function (data) {
+				data = data.split("\n");
 				for (i = 0; i < data.length; i++) {
 					if (data[i]) {
 						if (data[i].indexOf('error: ') != '-1' || data[i].indexOf('Errno') != '-1') {
@@ -944,19 +904,13 @@ $( function() {
 					}
 				}
 			}
-		} );
+		});
 	});
-	$('#ssl_key_view').click(function() {
-		if(!checkIsServerFiled('#serv5')) return false;
-		$.ajax( {
-			url: "options.py",
-			data: {
-				serv: $('#serv5').val(),
-				getcerts: "viewcert",
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
+	$('#ssl_key_view').click(function () {
+		if (!checkIsServerFiled('#serv5')) return false;
+		$.ajax({
+			url: "/app/add/certs/" + $('#serv5').val(),
+			success: function (data) {
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
@@ -965,7 +919,7 @@ $( function() {
 					data = data.split("\n");
 					var j = 1
 					for (i = 0; i < data.length; i++) {
-						data[i] = data[i].replace(/\s+/g,' ');
+						data[i] = data[i].replace(/\s+/g, ' ');
 						if (data[i] != '') {
 							if (j % 2) {
 								if (j != 0) {
@@ -981,11 +935,11 @@ $( function() {
 						}
 					}
 					$("#ajax-show-ssl").html(new_data);
-				} 
+				}
 			}
-		} );
+		});
 	});
-	$('#lets_button').click(function() {
+	$('#lets_button').click(function () {
 		var lets_domain = $('#lets_domain').val();
 		var lets_email = $('#lets_email').val();
 		if (lets_email == '' || lets_domain == '') {
@@ -993,12 +947,11 @@ $( function() {
 		} else if (validateEmail(lets_email)) {
 			$("#ajax-ssl").html(wait_mess);
 			$.ajax({
-				url: "options.py",
+				url: "/app/add/lets",
 				data: {
 					serv: $('#serv_for_lets').val(),
 					lets_domain: lets_domain,
-					lets_email: lets_email,
-					token: $('#token').val()
+					lets_email: lets_email
 				},
 				type: "POST",
 				success: function (data) {
@@ -1024,122 +977,122 @@ $( function() {
 		'<input name="server_port" required title="Backend port" size=3 placeholder="yyy" class="form-control second-server add_server_number" type="number"> ' +
 		'port check: <input name="port_check" required title="Maxconn. Default 200" size=5 value="200" class="form-control add_server_number" type="number">' +
 		' maxconn: <input name="server_maxconn" required title="Maxconn. Default 200" size=5 value="200" class="form-control add_server_number" type="number">'
-	$('[name=add-server-input]').click(function() {
+	$('[name=add-server-input]').click(function () {
 		$("[name=add_servers]").append(add_server_var);
 		changePortCheckFromServerPort();
 	});
-	$('[name=port]').on('input', function (){
+	$('[name=port]').on('input', function () {
 		var iNum = parseInt($('[name=port]').val());
 		$('[name=port_check]').val(iNum);
 		$('[name=server_port]').val(iNum);
 	});
 	changePortCheckFromServerPort();
 	var add_userlist_var = '<br /><input name="userlist-user" title="User name" placeholder="user_name" class="form-control"> <input name="userlist-password" required title="User password. By default it insecure-password" placeholder="password" class="form-control"> <input name="userlist-user-group" title="User`s group" placeholder="user`s group" class="form-control">'
-	$('#add-userlist-user').click(function() {
-		$('#userlist-users').append(add_userlist_var);		
+	$('#add-userlist-user').click(function () {
+		$('#userlist-users').append(add_userlist_var);
 	});
 	var add_userlist_group_var = '<br /><input name="userlist-group" title="User`s group" placeholder="group_name" class="form-control">'
-	$('#add-userlist-group').click(function() {
-		$('#userlist-groups').append(add_userlist_group_var);		
+	$('#add-userlist-group').click(function () {
+		$('#userlist-groups').append(add_userlist_group_var);
 	});
 	var add_peer_var = '<br /><input name="servers_name" required title="Peer name" size=14 placeholder="haproxyN" class="form-control">: ' +
 		'<input name="servers" title="Backend IP" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control second-server">: ' +
 		'<input name="server_port" required title="Backend port" size=3 placeholder="yyy" class="form-control second-server add_server_number" type="number">'
-	$('[name=add-peer-input]').click(function() {
+	$('[name=add-peer-input]').click(function () {
 		$("[name=add_peers]").append(add_peer_var);
 	});
-	$('.advance-show-button').click(function() {
+	$('.advance-show-button').click(function () {
 		$('.advance').fadeIn();
 		$('.advance-show-button').css('display', 'none');
 		$('.advance-hide-button').css('display', 'block');
 		return false;
 	});
-	$('.advance-hide-button').click(function() {
+	$('.advance-hide-button').click(function () {
 		$('.advance').fadeOut();
 		$('.advance-show-button').css('display', 'block');
 		$('.advance-hide-button').css('display', 'none');
 		return false;
 	});
-	$('#ssl_offloading').click(function() {
-		if($('#optionsInput').val().indexOf('ssl_fc ') == '-1') {
+	$('#ssl_offloading').click(function () {
+		if ($('#optionsInput').val().indexOf('ssl_fc ') == '-1') {
 			$("#optionsInput").append(ssl_offloading_var)
 		} else {
 			replace_text("#optionsInput", ssl_offloading_var);
 		}
 	});
-	$('#ssl_offloading1').click(function() {
-		if($('#optionsInput1').val().indexOf('ssl_fc ') == '-1') {
+	$('#ssl_offloading1').click(function () {
+		if ($('#optionsInput1').val().indexOf('ssl_fc ') == '-1') {
 			$("#optionsInput1").append(ssl_offloading_var)
 		} else {
 			replace_text("#optionsInput1", ssl_offloading_var);
 		}
 
 	});
-	$('#ssl_offloading2').click(function() {
-		if($('#optionsInput2').val().indexOf('ssl_fc ') == '-1') {
+	$('#ssl_offloading2').click(function () {
+		if ($('#optionsInput2').val().indexOf('ssl_fc ') == '-1') {
 			$("#optionsInput2").append(ssl_offloading_var)
 		} else {
 			replace_text("#optionsInput2", ssl_offloading_var);
 		}
 	});
-	
-	$( ".redirectListen" ).on( "click", function() {
+
+	$(".redirectListen").on("click", function () {
 		resetProxySettings();
-		$( "#tabs" ).tabs( "option", "active", 1 );
-		$( "#serv" ).selectmenu( "open" );
-	} );
-	$( ".redirectFrontend" ).on( "click", function() {
+		$("#tabs").tabs("option", "active", 1);
+		$("#serv").selectmenu("open");
+	});
+	$(".redirectFrontend").on("click", function () {
 		resetProxySettings();
 		var TabId = 2;
-		$( "#tabs" ).tabs( "option", "active", TabId );
-		$( "#serv"+TabId ).selectmenu( "open" );
-	} );
-	$( ".redirectBackend" ).on( "click", function() {
+		$("#tabs").tabs("option", "active", TabId);
+		$("#serv" + TabId).selectmenu("open");
+	});
+	$(".redirectBackend").on("click", function () {
 		resetProxySettings();
 		var TabId = 3;
-		$( "#tabs" ).tabs( "option", "active", TabId );
-		$( "#serv"+TabId ).selectmenu( "open" );
-	} );
-	$( ".redirectSsl" ).on( "click", function() {
-		$( "#tabs" ).tabs( "option", "active", 4 );
-		$( "#serv5" ).selectmenu( "open" );
-	} );
-	
-	$( "#create-http-listen" ).on( "click", function() {
+		$("#tabs").tabs("option", "active", TabId);
+		$("#serv" + TabId).selectmenu("open");
+	});
+	$(".redirectSsl").on("click", function () {
+		$("#tabs").tabs("option", "active", 4);
+		$("#serv5").selectmenu("open");
+	});
+
+	$("#create-http-listen").on("click", function () {
 		resetProxySettings();
 		createHttp(1, 'listen');
 	});
-	$( "#create-http-frontend" ).on( "click", function() {
+	$("#create-http-frontend").on("click", function () {
 		resetProxySettings();
 		createHttp(2, 'frontend');
 	});
-	$( "#create-http-backend" ).on( "click", function() {
+	$("#create-http-backend").on("click", function () {
 		resetProxySettings();
 		createHttp(3, 'backend');
 	});
-	$( "#create-ssl-listen" ).on( "click", function() {
+	$("#create-ssl-listen").on("click", function () {
 		resetProxySettings();
 		createSsl(1, 'listen');
 	});
-	$( "#create-ssl-frontend" ).on( "click", function() {
+	$("#create-ssl-frontend").on("click", function () {
 		resetProxySettings();
 		createSsl(2, 'frontend');
 	});
-	$( "#create-ssl-backend" ).on( "click", function() {
+	$("#create-ssl-backend").on("click", function () {
 		resetProxySettings();
 		createSsl(3, 'backend');
 	});
-	$( "#create-https-listen" ).on( "click", function() {
+	$("#create-https-listen").on("click", function () {
 		resetProxySettings();
-		createHttps(1, 'listen'); 
+		createHttps(1, 'listen');
 	});
-	$( "#create-https-frontend" ).on( "click", function() {
+	$("#create-https-frontend").on("click", function () {
 		resetProxySettings();
-		createHttps(2, 'frontend');		
+		createHttps(2, 'frontend');
 	});
-	$( "#create-https-backend" ).on( "click", function() {
+	$("#create-https-backend").on("click", function () {
 		resetProxySettings();
-		createHttps(3, 'backend');	
+		createHttps(3, 'backend');
 	});
 	var tcp_note = 'The check is valid when the server answers with a <b>SYN/ACK</b> packet'
 	var ssl_note = 'The check is valid if the server answers with a valid SSL server <b>hello</b> message'
@@ -1152,68 +1105,68 @@ $( function() {
 	var pgsql_note = 'The check is valid if the server response contains a successful <b>Authentication</b> request'
 	var redis_note = 'The check is valid if the server response contains the string <b>+PONG</b>'
 	var smtpchk_note = 'The check is valid if the server response code starts with <b>\'2\'</b>'
-	$( "#listener_checks" ).on('selectmenuchange',function()  {
-		if ($( "#listener_checks option:selected" ).val() == "option tcp-check") {
+	$("#listener_checks").on('selectmenuchange', function () {
+		if ($("#listener_checks option:selected").val() == "option tcp-check") {
 			$("#listener_checks_note").html(tcp_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "option ssl-hello-chk") {
+		if ($("#listener_checks option:selected").val() == "option ssl-hello-chk") {
 			$("#listener_checks_note").html(ssl_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "option httpchk") {
+		if ($("#listener_checks option:selected").val() == "option httpchk") {
 			$("#listener_checks_note").html(httpchk_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "option ldap-check") {
+		if ($("#listener_checks option:selected").val() == "option ldap-check") {
 			$("#listener_checks_note").html(ldap_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "option mysql-check") {
+		if ($("#listener_checks option:selected").val() == "option mysql-check") {
 			$("#listener_checks_note").html(mysql_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "option pgsql-check") {
+		if ($("#listener_checks option:selected").val() == "option pgsql-check") {
 			$("#listener_checks_note").html(pgsql_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "option redis-check") {
+		if ($("#listener_checks option:selected").val() == "option redis-check") {
 			$("#listener_checks_note").html(redis_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "option smtpchk") {
+		if ($("#listener_checks option:selected").val() == "option smtpchk") {
 			$("#listener_checks_note").html(smtpchk_note)
 		}
-		if ($( "#listener_checks option:selected" ).val() == "") {
+		if ($("#listener_checks option:selected").val() == "") {
 			$("#listener_checks_note").html('')
 		}
 	});
-	$( "#backend_checks" ).on('selectmenuchange',function()  {
-		if ($( "#backend_checks option:selected" ).val() == "") {
+	$("#backend_checks").on('selectmenuchange', function () {
+		if ($("#backend_checks option:selected").val() == "") {
 			$("#backend_checks_note").html('')
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option tcp-check") {
+		if ($("#backend_checks option:selected").val() == "option tcp-check") {
 			$("#backend_checks_note").html(tcp_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option ssl-hello-chk") {
+		if ($("#backend_checks option:selected").val() == "option ssl-hello-chk") {
 			$("#backend_checks_note").html(ssl_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option httpchk") {
+		if ($("#backend_checks option:selected").val() == "option httpchk") {
 			$("#backend_checks_note").html(httpchk_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option ldap-check") {
+		if ($("#backend_checks option:selected").val() == "option ldap-check") {
 			$("#backend_checks_note").html(ldap_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option mysql-check") {
+		if ($("#backend_checks option:selected").val() == "option mysql-check") {
 			$("#backend_checks_note").html(mysql_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option pgsql-check") {
+		if ($("#backend_checks option:selected").val() == "option pgsql-check") {
 			$("#backend_checks_note").html(pgsql_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option redis-check") {
+		if ($("#backend_checks option:selected").val() == "option redis-check") {
 			$("#backend_checks_note").html(redis_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "option smtpchk") {
+		if ($("#backend_checks option:selected").val() == "option smtpchk") {
 			$("#backend_checks_note").html(smtpchk_note)
 		}
-		if ($( "#backend_checks option:selected" ).val() == "") {
+		if ($("#backend_checks option:selected").val() == "") {
 			$("#backend_checks_note").html('')
 		}
 	});
-	$( "#listener_checks" ).on('selectmenuchange',function() {
+	$("#listener_checks").on('selectmenuchange', function () {
 		if ($("#listener_checks").val() == 'option httpchk') {
 			$("#listener_checks_http").show();
 			$("#listener_checks_http_path").attr('required', 'true');
@@ -1223,7 +1176,7 @@ $( function() {
 			$("#listener_checks_http_domain").removeAttr('required');
 		}
 	});
-	$( "#backend_checks" ).on('selectmenuchange',function() {
+	$("#backend_checks").on('selectmenuchange', function () {
 		if ($("#backend_checks").val() == 'option httpchk') {
 			$("#backend_checks_http").show();
 			$("#backend_checks_http_path").attr('required', 'true');
@@ -1233,73 +1186,73 @@ $( function() {
 			$("#backend_checks_http_domain").removeAttr('required');
 		}
 	});
-	$( "#add_listener_header" ).on( "click", function() {
-		$( "#listener_header_div" ).show();
-		$( "#listener_add_header" ).show();
-		$( "#add_listener_header" ).hide();
-	} );
-	$( "#add_frontend_header" ).on( "click", function() {
-		$( "#frontend_header_div" ).show();
-		$( "#frontend_add_header" ).show();
-		$( "#add_frontend_header" ).hide();
-	} );
-	$( "#add_backend_header" ).on( "click", function() {
-		$( "#backend_header_div" ).show();
-		$( "#backend_add_header" ).show();
-		$( "#add_backend_header" ).hide();
-	} );
-	$("#listener_add_header").click(function(){
+	$("#add_listener_header").on("click", function () {
+		$("#listener_header_div").show();
+		$("#listener_add_header").show();
+		$("#add_listener_header").hide();
+	});
+	$("#add_frontend_header").on("click", function () {
+		$("#frontend_header_div").show();
+		$("#frontend_add_header").show();
+		$("#add_frontend_header").hide();
+	});
+	$("#add_backend_header").on("click", function () {
+		$("#backend_header_div").show();
+		$("#backend_add_header").show();
+		$("#add_backend_header").hide();
+	});
+	$("#listener_add_header").click(function () {
 		make_actions_for_adding_header('#listener_header_div');
 	});
-	$("#frontend_add_header").click(function(){
+	$("#frontend_add_header").click(function () {
 		make_actions_for_adding_header('#frontend_header_div');
 	});
-	$("#backend_add_header").click(function(){
+	$("#backend_add_header").click(function () {
 		make_actions_for_adding_header('#backend_header_div');
 	});
-	$( "#add_listener_acl" ).on( "click", function() {
-		$( "#listener_acl" ).show();
-		$( "#listener_add_acl" ).show();
-		$( "#add_listener_acl" ).hide();
-	} );
-	$( "#add_frontend_acl" ).on( "click", function() {
-		$( "#frontend_acl" ).show();
-		$( "#frontend_add_acl" ).show();
-		$( "#add_frontend_acl" ).hide();
-	} );
-	$( "#add_backend_acl" ).on( "click", function() {
-		$( "#backend_acl" ).show();
-		$( "#backend_add_acl" ).show();
-		$( "#add_backend_acl" ).hide();
-	} );
-	$("#listener_add_acl").click(function(){
+	$("#add_listener_acl").on("click", function () {
+		$("#listener_acl").show();
+		$("#listener_add_acl").show();
+		$("#add_listener_acl").hide();
+	});
+	$("#add_frontend_acl").on("click", function () {
+		$("#frontend_acl").show();
+		$("#frontend_add_acl").show();
+		$("#add_frontend_acl").hide();
+	});
+	$("#add_backend_acl").on("click", function () {
+		$("#backend_acl").show();
+		$("#backend_add_acl").show();
+		$("#add_backend_acl").hide();
+	});
+	$("#listener_add_acl").click(function () {
 		make_actions_for_adding_acl_rule('#listener_acl');
 		$("#listener_acl").find('option[value=5]').remove();
 	});
-	$("#frontend_add_acl").click(function(){
+	$("#frontend_add_acl").click(function () {
 		make_actions_for_adding_acl_rule('#frontend_acl');
 	});
-	$("#backend_add_acl").click(function(){
+	$("#backend_add_acl").click(function () {
 		make_actions_for_adding_acl_rule('#backend_acl');
 	});
-	$("#add_bind_listener").click(function(){
+	$("#add_bind_listener").click(function () {
 		make_actions_for_adding_bind('#listener_bind');
-		$( "#listener_bind" ).show();
+		$("#listener_bind").show();
 	});
-	$("#add_bind_frontend").click(function(){
+	$("#add_bind_frontend").click(function () {
 		make_actions_for_adding_bind('#frontend_bind');
-		$( "#frontend_bind" ).show();
+		$("#frontend_bind").show();
 	});
-	$( "#serv" ).on('selectmenuchange',function() {
+	$("#serv").on('selectmenuchange', function () {
 		$('#name').focus();
 	});
-	$( "#serv2" ).on('selectmenuchange',function() {
+	$("#serv2").on('selectmenuchange', function () {
 		$('#new_frontend').focus();
 	});
-	$( "#serv3" ).on('selectmenuchange',function() {
+	$("#serv3").on('selectmenuchange', function () {
 		$('#new_backend').focus();
 	});
-	$( "#userlist_serv" ).on('selectmenuchange',function() {
+	$("#userlist_serv").on('selectmenuchange', function () {
 		$('#new_userlist').focus();
 	});
 });
@@ -1387,12 +1340,7 @@ function confirmDeleteOption(id) {
 function removeOption(id) {
 	$("#option-"+id).css("background-color", "#f2dede");
 	$.ajax( {
-		url: "options.py",
-		data: {
-			optiondel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/add/option/delete/" + id,
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
 			if (data.indexOf('error:') != '-1') {
@@ -1405,26 +1353,25 @@ function removeOption(id) {
 }
 function updateOptions(id) {
 	toastr.clear();
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/add/option/update",
 		data: {
-			updateoption: $('#option-body-'+id).val(),
+			option: $('#option-body-' + id).val(),
 			id: id,
-			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
 			} else {
-				$("#option-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#option-"+id ).removeClass( "update" );
-				}, 2500 );
+				$("#option-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#option-" + id).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function confirmDeleteSavedServer(id) {
 	 $( "#dialog-confirm" ).dialog({
@@ -1447,15 +1394,10 @@ function confirmDeleteSavedServer(id) {
 function removeSavedServer(id) {
 	$("#servers-saved-"+id).css("background-color", "#f2dede");
 	$.ajax( {
-		url: "options.py",
-		data: {
-			savedserverdel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/add/server/delete/"+id,
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
-			if(data.indexOf('Ok') != '-1') {
+			if(data.indexOf('ok') != '-1') {
 				$("#servers-saved-"+id).remove();
 			}
 		}
@@ -1464,12 +1406,11 @@ function removeSavedServer(id) {
 function updateSavedServer(id) {
 	toastr.clear();
 	$.ajax( {
-		url: "options.py",
+		url: "/app/add/server/update",
 		data: {
-			updatesavedserver: $('#servers-ip-'+id).val(),
-			description: $('#servers-desc-'+id).val(),
+			server: $('#servers-ip-'+id).val(),
+			desc: $('#servers-desc-'+id).val(),
 			id: id,
-			token: $('#token').val()
 		},
 		type: "POST",
 		success: function( data ) {
@@ -1477,9 +1418,9 @@ function updateSavedServer(id) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
 			} else {
-				$("#option-"+id).addClass( "update", 1000 );
+				$("#servers-saved-"+id).addClass( "update", 1000 );
 				setTimeout(function() {
-					$( "#option-"+id ).removeClass( "update" );
+					$( "#servers-saved-"+id ).removeClass( "update" );
 				}, 2500 );
 			}
 		}
@@ -1491,13 +1432,7 @@ function view_ssl(id) {
 	var raw_word = $('#translate').attr('data-raw');
 	if(!checkIsServerFiled('#serv5')) return false;
 	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $('#serv5').val(),
-			getcert: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/add/cert/" + $('#serv5').val() + '/' + id,
 		success: function( data ) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
@@ -1534,25 +1469,19 @@ function view_ssl(id) {
 function showRawSSL(id) {
 	var delete_word = $('#translate').attr('data-delete');
 	var cancel_word = $('#translate').attr('data-cancel');
-	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $('#serv5').val(),
-			getcert_raw: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	$.ajax({
+		url: "/app/add/cert/get/raw/" + $('#serv5').val() + "/" + id,
+		success: function (data) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
 			} else {
 				$('#dialog-confirm-body').text(data);
-				$( "#dialog-confirm-cert" ).dialog({
+				$("#dialog-confirm-cert").dialog({
 					resizable: false,
 					height: "auto",
 					width: 670,
 					modal: true,
-					title: "Certificate from "+$('#serv5').val()+", name: "+id,
+					title: "Certificate from " + $('#serv5').val() + ", name: " + id,
 					buttons: [{
 						text: cancel_word,
 						click: function () {
@@ -1573,65 +1502,56 @@ function showRawSSL(id) {
 				});
 			}
 		}
-	} );
+	});
 }
 function deleteSsl(id) {
-	if(!checkIsServerFiled('#serv5')) return false;
-	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $('#serv5').val(),
-			delcert: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	if (!checkIsServerFiled('#serv5')) return false;
+	$.ajax({
+		url: "/app/add/cert/" + $("#serv5").val() + "/" + id,
+		type: "DELETE",
+		success: function (data) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
 				toastr.success('SSL cert ' + id + ' has been deleted');
-				$("#ssl_key_view").trigger( "click" );
+				$("#ssl_key_view").trigger("click");
 			}
 		}
-	} );
+	});
 }
 function change_select_acceleration(id) {
-	$.ajax( {
-		url: "options.py",
-		data: {
-			get_hap_v: 1,
-			serv: $('#serv'+id+' option:selected').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(parseFloat(data) < parseFloat('1.8') || data == ' ') {
-				$("#cache"+id).checkboxradio( "disable" );
+	$.ajax({
+		url: "/app/service/haproxy/version/" + $('#serv' + id + ' option:selected').val(),
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (parseFloat(data) < parseFloat('1.8') || data == ' ') {
+				$("#cache" + id).checkboxradio("disable");
 			} else {
-				$("#cache"+id).checkboxradio( "enable" );
+				$("#cache" + id).checkboxradio("enable");
 			}
 		}
-	} );
+	});
 }
 function change_select_waf(id) {
-	$.ajax( {
-		url: "options.py",
-		data: {
-			get_hap_v: 1,
-			serv: $('#serv'+id+' option:selected').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			if(parseFloat(data) < parseFloat('1.8')) {
-				$("#waf"+id).checkboxradio( "disable" );
+	$.ajax({
+		url: "/app/service/haproxy/version/" + $('#serv' + id + ' option:selected').val(),
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			if (parseFloat(data) < parseFloat('1.8')) {
+				$("#waf" + id).checkboxradio("disable");
 			} else {
-				$("#waf"+id).checkboxradio( "enable" );
+				$("#waf" + id).checkboxradio("enable");
 			}
 		}
-	} );
+	});
 }
 function createList(color) {
 	if(color == 'white') {
@@ -1641,12 +1561,11 @@ function createList(color) {
 	}
 	list = escapeHtml(list);
 	$.ajax( {
-		url: "options.py",
+		url: "/app/add/haproxy/bwlist/create",
 		data: {
 			bwlists_create: list,
 			color: color,
-			group: $('#group').val(),
-			token: $('#token').val()
+			group: $('#group').val()
 		},
 		type: "POST",
 		success: function( data ) {
@@ -1667,14 +1586,7 @@ function createList(color) {
 }
 function editList(list, color) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			bwlists: list,
-			color: color,
-			group: $('#group').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/add/haproxy/bwlist/" + list + "/" + color + "/" + $('#group').val(),
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -1731,15 +1643,14 @@ function saveList(action, list, color) {
 	var serv = $( "#serv-"+color+"-list option:selected" ).val();
 	if(!checkIsServerFiled($("#serv-"+color+"-list"))) return false;
 	$.ajax({
-		url: "options.py",
+		url: "/app/add/haproxy/bwlist/save",
 		data: {
 			bwlists_save: list,
 			serv: serv,
 			bwlists_content: $('#edit_lists').val(),
 			color: color,
 			group: $('#group').val(),
-			bwlists_restart: action,
-			token: $('#token').val()
+			bwlists_restart: action
 		},
 		type: "POST",
 		success: function (data) {
@@ -1762,15 +1673,7 @@ function deleteList(list, color) {
 	var serv = $( "#serv-"+color+"-list option:selected" ).val();
 	if(!checkIsServerFiled($("#serv-"+color+"-list"))) return false;
 	$.ajax({
-		url: "options.py",
-		data: {
-			bwlists_delete: list,
-			serv: serv,
-			color: color,
-			group: $('#group').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/add/haproxy/bwlist/delete/" + serv + "/" + color + "/" + list + "/" + $('#group').val(),
 		success: function (data) {
 			if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('Errno') != '-1') {
 				toastr.error(data);
@@ -1789,11 +1692,10 @@ function createMap() {
 	map_name = $('#new_map_name').val()
 	map_name = escapeHtml(map_name);
 	$.ajax( {
-		url: "options.py",
+		url: "/app/add/map/create",
 		data: {
 			map_create: map_name,
-			group: $('#group').val(),
-			token: $('#token').val()
+			group: $('#group').val()
 		},
 		type: "POST",
 		success: function( data ) {
@@ -1814,11 +1716,10 @@ function createMap() {
 }
 function editMap(map) {
 	$.ajax( {
-		url: "options.py",
+		url: "/app/add/map/edit",
 		data: {
 			edit_map: map,
-			group: $('#group').val(),
-			token: $('#token').val()
+			group: $('#group').val()
 		},
 		type: "POST",
 		success: function( data ) {
@@ -1877,14 +1778,13 @@ function saveMap(action, map) {
 	var serv = $( "#serv-map option:selected" ).val();
 	if(!checkIsServerFiled($("#serv-map"))) return false;
 	$.ajax({
-		url: "options.py",
+		url: "/app/add/map/save",
 		data: {
 			map_save: map,
 			serv: serv,
 			content: $('#edit_map').val(),
 			group: $('#group').val(),
-			map_restart: action,
-			token: $('#token').val()
+			map_restart: action
 		},
 		type: "POST",
 		success: function (data) {
@@ -1907,12 +1807,11 @@ function deleteMap(map) {
 	var serv = $( "#serv-map option:selected" ).val();
 	if(!checkIsServerFiled($("#serv-map"))) return false;
 	$.ajax({
-		url: "options.py",
+		url: "/app/add/map/delete",
 		data: {
 			map_delete: map,
 			serv: serv,
-			group: $('#group').val(),
-			token: $('#token').val()
+			group: $('#group').val()
 		},
 		type: "POST",
 		success: function (data) {
@@ -2215,27 +2114,26 @@ function make_actions_for_adding_bind(section_id) {
 		serv = 'serv'
 	}
 	$( "#"+random_id + " > input[name=ip]").autocomplete({
-		source: function( request, response ) {
-			if ( request.term == "" ) {
+		source: function (request, response) {
+			if (request.term == "") {
 				request.term = 1
 			}
-			$.ajax( {
-				url: "options.py",
-				data: {
-					show_ip: request.term,
-					serv: $("#"+serv).val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+			$.ajax({
+				url: "/app/add/show/ip/" + $("#" + serv).val(),
+				// data: {
+				// 	show_ip: request.term,
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					response(data.split(" "));
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1,
-		select: function( event, ui ) {
-			$( "#"+random_id + " > input[name=port]").focus();
+		select: function (event, ui) {
+			$("#" + random_id + " > input[name=port]").focus();
 		}
 	});
 }
@@ -2249,17 +2147,11 @@ function makeid(length) {
    return result;
 }
 function showUserlists() {
-	var serv = $( "#existing_userlist_serv option:selected" ).val();
-	var select_id = $( "#existing_userlist_serv" );
-	if(!checkIsServerFiled(select_id)) return false;
+	var serv = $("#existing_userlist_serv option:selected").val();
+	var select_id = $("#existing_userlist_serv");
+	if (!checkIsServerFiled(select_id)) return false;
 	$.ajax({
-		url: "options.py",
-		data: {
-			show_userlists: 1,
-			serv: serv,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/add/haproxy/userlist/" + serv,
 		success: function (data) {
 			if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
 				toastr.error(data);
@@ -2271,14 +2163,14 @@ function showUserlists() {
 					var existing_userlist_ajax = $.find("#existing_userlist_ajax");
 					existing_userlist_ajax = existing_userlist_ajax[0].id;
 					data[i] = escapeHtml(data[i]);
-					$('#'+existing_userlist_ajax).append('<a href="sections.py?serv='+serv+'&section='+data[i]+'" title="Edit/Delete this userlist" target="_blank">'+data[i]+'</a> ');
+					$('#' + existing_userlist_ajax).append('<a href="/app/config/section/haproxy/' + serv + '/' + data[i] + '" title="Edit/Delete this userlist" target="_blank">' + data[i] + '</a> ');
 				}
 			}
 		}
 	});
 }
 function changePortCheckFromServerPort() {
-	$('[name=server_port]').on('input', function (){
+	$('[name=server_port]').on('input', function () {
 		var iNum = parseInt($($(this)).val());
 		$($(this)).next().val(iNum);
 	});
diff --git a/inc/add_nginx.js b/inc/add_nginx.js
index 4cb816a7..77a9998b 100644
--- a/inc/add_nginx.js
+++ b/inc/add_nginx.js
@@ -29,18 +29,16 @@ $( function() {
 	});
 });
 function resetProxySettings() {
-    $('[name=upstream]').val('');
-    $('input:checkbox').prop("checked", false);
-    $('[name=check-servers]').prop("checked", true);
-    $('input:checkbox').checkboxradio("refresh");
-    $('.advance-show').fadeIn();
-    $('.advance').fadeOut();
-    $('[name=mode').val('http');
-    $('select').selectmenu('refresh');
-    $("#path-cert-listen").attr('required', false);
-    $("#path-cert-frontend").attr('required', false);
-    // replace_text("#optionsInput", ssl_offloading_var);
-    // replace_text("#optionsInput1", ssl_offloading_var);
+	$('[name=upstream]').val('');
+	$('input:checkbox').prop("checked", false);
+	$('[name=check-servers]').prop("checked", true);
+	$('input:checkbox').checkboxradio("refresh");
+	$('.advance-show').fadeIn();
+	$('.advance').fadeOut();
+	$('[name=mode').val('http');
+	$('select').selectmenu('refresh');
+	$("#path-cert-listen").attr('required', false);
+	$("#path-cert-frontend").attr('required', false);
 }
 function checkIsServerFiled(select_id, message = 'Select a server first') {
 	if ($(select_id).val() == null || $(select_id).val() == '') {
@@ -50,31 +48,32 @@ function checkIsServerFiled(select_id, message = 'Select a server first') {
 	return true;
 }
 function generateConfig(form_name) {
-	var frm = $('#'+form_name);
+	var frm = $('#' + form_name);
 	if (form_name == 'add-upstream') {
 		serv = '#serv'
 		name_id = '#name'
 	}
-	if(!checkIsServerFiled(serv)) return false;
-	if(!checkIsServerFiled(name_id, 'The name cannot be empty')) return false;
+	if (!checkIsServerFiled(serv)) return false;
+	if (!checkIsServerFiled(name_id, 'The name cannot be empty')) return false;
 	var input = $("<input>")
 		.attr("name", "generateconfig").val("1").attr("type", "hidden").attr("id", "generateconfig");
-	$('#'+form_name +' input[name=acl_then_value]').each(function(){
-		if (!$(this).val()){
+	$('#' + form_name + ' input[name=acl_then_value]').each(function () {
+		if (!$(this).val()) {
 			$(this).val('IsEmptY')
 		}
 	});
-	$('#'+form_name +' input[name=ip]').each(function(){
-		if (!$(this).val()){
+	$('#' + form_name + ' input[name=ip]').each(function () {
+		if (!$(this).val()) {
 			$(this).val('IsEmptY')
 		}
 	});
-	$('#'+form_name +' input[name=port]').each(function(){
-		if (!$(this).val()){
+	$('#' + form_name + ' input[name=port]').each(function () {
+		if (!$(this).val()) {
 			$(this).val('IsEmptY')
 		}
 	});
 	frm.append(input);
+	var generated_title = $('#translate').attr('data-generated_config');
 	$.ajax({
 		url: frm.attr('action'),
 		data: frm.serialize(),
@@ -90,7 +89,7 @@ function generateConfig(form_name) {
 					height: "auto",
 					width: 650,
 					modal: true,
-					title: "Generated config",
+					title: generated_title,
 					buttons: {
 						Ok: function () {
 							$(this).dialog("close");
@@ -101,13 +100,13 @@ function generateConfig(form_name) {
 		}
 	});
 	$("#generateconfig").remove();
-    $('#'+form_name +' input[name=ip]').each(function(){
-		if ($(this).val() == 'IsEmptY'){
+	$('#' + form_name + ' input[name=ip]').each(function () {
+		if ($(this).val() == 'IsEmptY') {
 			$(this).val('')
 		}
 	});
-	$('#'+form_name +' input[name=port]').each(function(){
-		if ($(this).val() == 'IsEmptY'){
+	$('#' + form_name + ' input[name=port]').each(function () {
+		if ($(this).val() == 'IsEmptY') {
 			$(this).val('')
 		}
 	});
diff --git a/inc/configshow.js b/inc/configshow.js
index 672ddbb8..ad1f3961 100644
--- a/inc/configshow.js
+++ b/inc/configshow.js
@@ -64,7 +64,6 @@ $( function() {
 				data = data.replace(/\n/g, "<br>");
 				if (data.indexOf(service + ': command not found') != '-1') {
 					try {
-						var service = findGetParameter('service');
 						toastr.error('Cannot save config. There is no ' + service);
 					} catch (err) {
 						console.log(err);
diff --git a/inc/css/provisioning.css b/inc/css/ha.css
similarity index 100%
rename from inc/css/provisioning.css
rename to inc/css/ha.css
diff --git a/inc/ha.js b/inc/ha.js
index 10869be5..19b33385 100644
--- a/inc/ha.js
+++ b/inc/ha.js
@@ -4,16 +4,14 @@ $( function() {
 	});
 	var ipformat = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
 	$( "#interface" ).autocomplete({
-		source: function( request, response ) {
-			$.ajax( {
-				url: "options.py",
-				data: {
-					showif:1,
-					serv: $("#master").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+		source: function (request, response) {
+			$.ajax({
+				url: "/app/server/show/if/" + $("#master").val(),
+				// data: {
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
 						toastr.error(data);
 					} else if (data == '') {
@@ -23,22 +21,20 @@ $( function() {
 						response(data.split(" "));
 					}
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
 	$( "#interface-add" ).autocomplete({
-		source: function( request, response ) {
-			$.ajax( {
-				url: "options.py",
-				data: {
-					showif:1,
-					serv: $("#master-add").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+		source: function (request, response) {
+			$.ajax({
+				url: "/app/server/show/if/" + $("#master-add").val(),
+				// data: {
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
 						var p_err = show_pretty_ansible_error(data);
 						toastr.error(p_err);
@@ -49,22 +45,20 @@ $( function() {
 						response(data.split(" "));
 					}
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
 	$( "#slave_interface" ).autocomplete({
-		source: function( request, response ) {
-			$.ajax( {
-				url: "options.py",
-				data: {
-					showif:1,
-					serv: $("#slave").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+		source: function (request, response) {
+			$.ajax({
+				url: "/app/server/show/if/" + $("#slave").val(),
+				// data: {
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
 						var p_err = show_pretty_ansible_error(data);
 						toastr.error(p_err);
@@ -75,22 +69,20 @@ $( function() {
 						response(data.split(" "));
 					}
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1
 	});
 	$( "#slave_interface-add" ).autocomplete({
-		source: function( request, response ) {
-			$.ajax( {
-				url: "options.py",
-				data: {
-					showif:1,
-					serv: $("#slave-add").val(),
-					token: $('#token').val()
-				},
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+		source: function (request, response) {
+			$.ajax({
+				url: "/app/server/show/if/" + $("#slave-add").val(),
+				// data: {
+				// 	token: $('#token').val()
+				// },
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
 						toastr.error(data);
 					} else if (data == '') {
@@ -100,7 +92,7 @@ $( function() {
 						response(data.split(" "));
 					}
 				}
-			} );
+			});
 		},
 		autoFocus: true,
 		minLength: -1
@@ -224,20 +216,18 @@ $( function() {
 		}
 	});
 	$( "#master" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_keepalived_v: 1,
-				serv: $('#master option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/keepalived/version/" + $('#master option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if(data.indexOf('keepalived:') != '-1') {
+				} else if (data.indexOf('keepalived:') != '-1') {
 					$('#cur_master_ver').text('Keepalived has not installed');
 					$('#create').attr('title', 'Create HA cluster');
 				} else {
@@ -245,23 +235,21 @@ $( function() {
 					$('#cur_master_ver').css('font-weight', 'bold');
 				}
 			}
-		} );
+		});
 	});
 	$( "#slave" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_keepalived_v: 1,
-				serv: $('#slave option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/keepalived/version/" + $('#slave option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if(data.indexOf('keepalived:') != '-1') {
+				} else if (data.indexOf('keepalived:') != '-1') {
 					$('#cur_slave_ver').text('Keepalived has not installed');
 					$('#create').attr('title', 'Create HA cluster');
 				} else {
@@ -269,23 +257,21 @@ $( function() {
 					$('#cur_slave_ver').css('font-weight', 'bold');
 				}
 			}
-		} );
+		});
 	});
 	$( "#master-add" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_keepalived_v: 1,
-				serv: $('#master-add option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/keepalived/version/" + $('#master-add option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if(data.indexOf('keepalived:') != '-1') {
+				} else if (data.indexOf('keepalived:') != '-1') {
 					$('#cur_master_ver-add').text('Keepalived has not installed');
 					$('#add-vrrp').attr('title', 'Add a HA configuration');
 				} else {
@@ -293,23 +279,21 @@ $( function() {
 					$('#cur_master_ver-add').css('font-weight', 'bold');
 				}
 			}
-		} );
+		});
 	});
 	$( "#slave-add" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_keepalived_v: 1,
-				serv: $('#slave-add option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/keepalived/version/" + $('#slave-add option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if(data.indexOf('keepalived:') != '-1') {
+				} else if (data.indexOf('keepalived:') != '-1') {
 					$('#cur_slave_ver-add').text('Keepalived has not installed');
 					$('#add-vrrp').attr('title', 'Add a HA configuration');
 				} else {
@@ -317,7 +301,7 @@ $( function() {
 					$('#cur_slave_ver-add').css('font-weight', 'bold');
 				}
 			}
-		} );
+		});
 	});
 });
 function add_master_addr(kp, router_id) {
@@ -325,59 +309,59 @@ function add_master_addr(kp, router_id) {
 	if ($('#add_return_to_master').is(':checked')) {
 		return_to_master = '1';
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/install/keepalived/add",
 		data: {
-			masteradd: $('#master-add').val(),
-			slaveadd: $('#slave-add').val(),
-			interfaceadd: $("#interface-add").val(),
-			slave_interfaceadd: $("#slave_interface-add").val(),
-			vrrpipadd: $('#vrrp-ip-add').val(),
+			master: $('#master-add').val(),
+			slave: $('#slave-add').val(),
+			interface: $("#interface-add").val(),
+			slave_interface: $("#slave_interface-add").val(),
+			vrrpip: $('#vrrp-ip-add').val(),
 			return_to_master: return_to_master,
 			kp: kp,
 			router_id: router_id,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('UNREACHABLE') != '-1' || data.indexOf('FAILED') != '-1') {
 				var p_err = show_pretty_ansible_error(data);
 				showProvisioningError(p_err + '<br><br>', '#creating-master-add', '#wait-mess-add', '#creating-error-add');
-			} else if (data == '' ){
+			} else if (data == '') {
 				showProvisioningWarning('#creating-master-add', 'master Keepalived', '#creating-warning-add', '#wait_mess-add');
-			} else if (data.indexOf('success') != '-1' ){
-				showProvisioningProccess('<p>'+data+'</p>', '#creating-master-add', '50', '#creating-progress-add', '#created-mess-add', '#wait-mess-add');
+			} else if (data.indexOf('success') != '-1') {
+				showProvisioningProccess('<p>' + data + '</p>', '#creating-master-add', '50', '#creating-progress-add', '#created-mess-add', '#wait-mess-add');
 			}
 		}
-	} );
+	});
 }
 function add_slave_addr(kp, router_id) {
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/install/keepalived/add/slave",
 		data: {
-			masteradd_slave: $('#master-add').val(),
-			slaveadd: $('#slave-add').val(),
-			interfaceadd: $("#interface-add").val(),
-			slave_interfaceadd: $("#slave_interface-add").val(),
-			vrrpipadd: $('#vrrp-ip-add').val(),
+			master: $('#master-add').val(),
+			slave: $('#slave-add').val(),
+			interface: $("#interface-add").val(),
+			slave_interface: $("#slave_interface-add").val(),
+			vrrpip: $('#vrrp-ip-add').val(),
 			kp: kp,
 			router_id: router_id,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('UNREACHABLE') != '-1' || data.indexOf('FAILED') != '-1') {
 				var p_err = show_pretty_ansible_error(data);
 				showProvisioningError(p_err + '<br><br>', '#creating-slave-add', '#wait-mess-add', '#creating-error-add');
-			} else if (data == '' ){
+			} else if (data == '') {
 				showProvisioningWarning('#creating-slave-add', 'master Keepalived', '#creating-warning-add', '#wait_mess-add');
-			} else if (data.indexOf('success') != '-1' ){
-				showProvisioningProccess('<p>'+data+'</p>', '#creating-slave-add', '100', '#creating-progress-add', '#created-mess-add', '#wait-mess-add');
+			} else if (data.indexOf('success') != '-1') {
+				showProvisioningProccess('<p>' + data + '</p>', '#creating-slave-add', '100', '#creating-progress-add', '#created-mess-add', '#wait-mess-add');
 			}
 		}
-	} );
+	});
 }
 function create_master_keepalived(hap, nginx, syn_flood, router_id) {
 	if (hap == '0' && nginx == '0') {
@@ -404,7 +388,7 @@ function create_master_keepalived(hap, nginx, syn_flood, router_id) {
 		return_to_master = '1';
 	}
 	$.ajax( {
-		url: "options.py",
+		url: "/app/install/keepalived",
 		data: {
 			master: $('#master').val(),
 			slave: $('#slave').val(),
@@ -460,9 +444,9 @@ function create_slave_keepalived(hap, nginx, syn_flood, router_id) {
 		nginx_docker = '1';
 	}
 	$.ajax( {
-		url: "options.py",
+		url: "/app/install/keepalived/slave",
 		data: {
-			master_slave: $('#master').val(),
+			master: $('#master').val(),
 			slave: $('#slave').val(),
 			interface: $("#interface").val(),
 			slave_interface: $("#slave_interface").val(),
@@ -511,25 +495,25 @@ function create_keep_alived_hap(nginx, server, docker) {
 		var install_step = 'slave Haproxy';
 	}
 	$(step_id).addClass('proccessing');
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/install/haproxy/master-slave",
 		data: {
-			master_slave_hap: $('#master').val(),
+			master: $('#master').val(),
 			slave: $('#slave').val(),
 			server: server,
 			docker: docker,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 				var p_err = show_pretty_ansible_error(data);
 				showProvisioningError(p_err + '<br><br>', step_id, '#wait-mess', '#creating-error');
-			} else if (data == '' ){
+			} else if (data == '') {
 				showProvisioningWarning(step_id, install_step, '#creating-warning', '#wait_mess');
-			} else if (data.indexOf('success') != '-1' ){
-				showProvisioningProccess('<br>'+data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess');
+			} else if (data.indexOf('success') != '-1') {
+				showProvisioningProccess('<br>' + data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess');
 			} else {
 				toastr.clear();
 				toastr.info(data);
@@ -538,7 +522,7 @@ function create_keep_alived_hap(nginx, server, docker) {
 				create_keep_alived_nginx(hap, server, docker)
 			}
 		}
-	} );
+	});
 }
 function create_keep_alived_nginx(hap, server, docker) {
 	if (hap == '0') {
@@ -554,31 +538,31 @@ function create_keep_alived_nginx(hap, server, docker) {
 		var install_step = 'slave Nginx';
 	}
 	$(step_id).addClass('proccessing');
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/install/nginx/master-slave",
 		data: {
-			master_slave_nginx: $('#master').val(),
+			master: $('#master').val(),
 			slave: $('#slave').val(),
 			server: server,
 			docker: docker,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 				var p_err = show_pretty_ansible_error(data);
 				showProvisioningError(p_err + '<br><br>', step_id, '#wait-mess', '#creating-error');
-			} else if (data == '' ){
+			} else if (data == '') {
 				showProvisioningWarning(step_id, install_step, '#creating-warning', '#wait_mess');
-			} else if (data.indexOf('success') != '-1' ){
-				showProvisioningProccess('<br>'+data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess');
+			} else if (data.indexOf('success') != '-1') {
+				showProvisioningProccess('<br>' + data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess');
 			} else {
 				toastr.clear();
 				toastr.info(data);
 			}
 		}
-	} );
+	});
 }
 function showProvisioningError(data, step_id, wait_mess, error_id) {
     $(wait_mess).hide();
diff --git a/inc/images/logo_logo.png b/inc/images/logo_logo.png
deleted file mode 100644
index 749bc6f6dd0e823a0727ad6a7959691fb1d3b1dd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 18044
zcmeIabx>Tv^Dnw+a0wb*gIjQi#X<<~3BlcES=?EiB{;zs5;VANa3?^p06~HiG-wDC
z^c}wUcYk%?t5>()|L;~o!8tS2-P2>;)1N-ES{f?&I8-<w5C~uOrJ@c9g!1?C7Yh@3
zGx}pS4)}xOrK17{Rgcr`0T0;jFO9uGAcFqKUzBt%0%{P50i>!ZujiY4u<Vn?VrRj2
zfBd$56Qa42m$>+@%7BZp$`j5IE=B~-!oxfga~Io`q<$inKtg%YMlTZ)GH7QN7}cOo
zj-~Wo%ShFp%wRFM@0V1bt~cz)%I8y}ptRt-I|IWI*@-^1iG$a(nF}lT7jMsh+{6)v
zSbfJJCMFgZR)T_<n3&#3kxLL0YlCVhV`E}aLtz?<iliWJ2oqBg$Q(gJOpF1-&5Ma)
z2N~@uDk`FMgV~sva6td3$^TAcq0c2j+Lc^5xZ*}%i{rv;wY+KdU}&S>=Gag4k?!v<
z6ADPcawvtZIC@xRAky}WE@4D(XgHQ$<U4$evKZu0r?O&CADGSYeS7VDFa}3fmOO^B
zwvuU9t>%NW$6`pqeb>bKU4!^u04bKD37LnX!c&PwV&$h2Db-<EGjHx|h>{8GCS#?v
z!Xi|)dn4JcaBN-|qpIbKk7V?O#RK9Hkq>HPz7IH`z%vv#{lf@hN?>)RR5i?`$cS+q
z1hZ8{&{Sk;jbyp2Ws%xgE9yf(VhF$@RQ32{aYDHnLTf86%c*;w65I5U{G-Ipvq!Ow
zjP=m&MTg&&a_3rwXpL?iKi4G}fyYU~nL?C%_`H~7+5)K=|DfHgu~bY6aqb$z$==Ev
z)o;G^^6&9!W6a%YUY8Ob4>(bL3P^3692Tp<6kl94`JGiJheNw3t!z!{HDU<gA~C1i
zv7ZQPe59Dz4`!24CnEq@5X5npC@Mj7OI~nrW|5})_T(wn#F+Ce)-J}%?-Y9~=3601
zXhm5$=c9$LmFS?LW0+_PSExrCKm4hw7RC>8m-*f1V*Fe!m0x7!5=}ye$Xyi_NhKT(
zixD`<OLCI~-TL`x?u<5VXUNZ~9cAkwCL9`|9t#NpK@9f=yF=Qz$s$bZ1$P`Jxf07e
zH0ouRA4T{Tqoa(9=iT7a3`?9R0q+Otl9gxKa61}{68KMZv-%Bus3;i1;-^shwt}EV
z1Lg=_wX$xYQjaP5mzu2J9*yKd8PRyP$uQhysLYjeqZ~H`N9ZkbKJ3|n_KVtXrpw9-
z_gekeRy8?;&mk6h)8zfa{xMPm;8HnH6dD~*-)Gb8xGT(V<VqHsnOWVgtgz8#-p>%L
zdS+r_d~yklaU{D{e3t#<`3&~g7|whmt6iu9a&b>y6b#h(M~9n-T8vIT5$BP>&bpvo
zrct7ZL0GO}^t<1q>1SWZQmkzcxU^&khax}`^C$mi4$rIdP695!1SG4;@r5}CUmr;x
z8E#(oVnW%PgFqM_1q{2rzV;MJ+2_a><+NlPDgK5{0t2X!g1<&409$^g3?+4}4gM4=
z&_Zw6CT+AiXfwq42M|*@uaW;WjdJs23%LO?K|cAW*oL)7M_c62=BFs_wn}4t7`3_|
zPeUm!KahaTjX2iXUdh7a+7H+jzk5V#s3X|9r8owWc^r8NP7`PH%`DFm<oCnvaG{xc
zqupNt#YK^0mUv|AU*TYxW|d*{#i})f(j=1YGS*Xl&CX`^Z)@5%kv1B_ABb$0Y6wnV
z5j3%oOZ)>wwzH)CnVxpQK4bl=_OzC=*Hi{Yo+k>X(P@QEA*+8aP@QI@f_T1#vj!}f
zG0WVyf3!x;5vh-Z+Ofgz*_%QOLtQIN8M+$*(fp8T0(Q}V%Bu5M$zpLYjx%*>KPi#P
zYGZawU$XB4QsRnRtg95!>sJqG(0#?lmDPcFZ@kPyO@L{9w~36U=elz@+Wv*8cRx`$
zXRlZzW59V%E}@zp9($7}zaUVil;wUBw1xG0<p%;}iAWVnEegNU&kz^R;0ZmBFJ|}p
zsDT3PFdTzgy?rC^4=87fXx2Aw_KDNbOGmWbYbVRsfs%<?;st@26SOV%SGf-wD8Rr+
zWrJZh8l8X8&e=z3%5{M=quk<qZ@&U3UqkA{t(<rq&T+YJsue<4!CH|_cFP(1hl65B
zdH=auUN*2(NEwF03OLc~t%$}(!s6-6RIYL*gn7s%{3=kNT$ZDm6vStT<FA>1DwzIN
z#!)vpESTZ$QShRBOQgJ9FEXNl^KNMpmQ4WAS??Z*uzcSTUCyx;35)J0;>yd$0bZX*
zzKBXF8-dF=nhVComZoU~(gXWhY3om(7r^=ip2%I~NbBBOTMsc*VB_ZPJHFDZ)&Gz}
z8&T%k9LJFmUw=TU=w*q}T~31~4h>)(OX?INQGIn1JY$XiNRvy<j-^`S*|@5yqUZrr
zQcwAxMS5T&OvAfQSJf&!la-_Uxe`WOS|dPYrypFZq=rpWWBvw;$28Fq?(i{^LlSe!
zxNg!xn;Yp1eg@;RW@G%5&lNgmnGiqzp6{_BpCa{Z-=j1ZFN)%-!VN!u4KdnnH18{l
zQFx^R#Vd;XS!~TeEYAE(kQ?&mJtvJ67qD6wQfwP2HzS;XaXr4I=x3qVF3vC@5;4_z
z4ix$Wi*egUG0pwu@F-lKWmzV9Ad7t%E{_hJ^Jl-h2gn5&B{7rTq`02@?&SrB0Wa%S
ztlv}Q&T2rw@<#KlI>2DnO_oE+*3H|pl4&Ep`at8JkzUDXvH*iTW=fh`i%v1aAd$xt
zN`c|?jOB~a0!o?qM_6oMILW&Gx*kPLpIl9mMO6h;IY$guSS_j|gE>2IZ?Doz6fg)f
z07HPH+!-0nzl84LWQk~bV{r0ng~=^=YrE5szI%c(q_pBKus%O;Wk7w+G8oEkZjx5p
zpD1*YtH=g$S2smfq1U5c)}JJx&D@vx0TcQ>X##QLeVUz!bnVmPE@Z64b$ppaRZ_`0
zSjmZ5*{wa=a~~JmSXRWcFPrXCnKhVq6xT|hSw_wc$(}|Zq13*zC&*L9nB0qUcVUl=
z2jdv*^R^~(rbJ<MOWo7^E#l)IM!~#GgQVYKTa;8-E$O(=phI)WFXmZEDg5XIU+M94
z#~B?dQ+U%9!ORiUxu$wz5~Wr`SfBNoki6Dw;J$&l_pl>(GC41vh()^kNxJ%4^6vAY
zE`vJZ1U)7(6XJP`#d*t&_Z~YT!}m4<W5Dt>+7+sl*Y0jC`wEv&!J^nz#1e&pky6~X
zyp{+qJtZsN526Myy=$Mp>B(k4!32dyt*5{ZM^I(?vgh6ApiPXdukm704UhtSn@{tA
z!EIRV*>QRccMoe~N|;mWLvrpH@|i@H2+d)&n`Wp~7}25JD?EAsqImwD&Z%{IoE_(u
zaSL9s@#_X)KQP*bXlxdJoAQe%0*S=1uMi2k8}|?Xd5IyX4dpi5<L6$oH$n<v|Ej_=
z9k2AQwYGSB{*6%5L3<#E-Qt;DyDnPY<X$c`qWG*3_Y2NZ?4Wx9o)K{sLrmuP4x%~d
zr6t$RZK(NTf~AxEKoYJEjYmaI@PtM(uoxA9hM((;;uvAfjfMUSdP8H%lsT5q!JIX{
z+{&32>xoe?Q79G-@8GHZN{^<RQbPRG5+#gxt}mgAj>Oy$i3lCao=^kyqJ|}wk0m7f
z=tuB9-?us8&@q&5rka)}ZIXf*RQh@*U&fmC4}o;=^ntSn6F1NF)2}B8_2bYo+q%2(
zN}C~s#NI5r45gsE)6cr}Ina^SaZ{P?<_{=!OEX%8A4S^>)sL^=LAi0n$R*^5>B2-B
z(BeLzfD&2?p5#QFm9*&So(z8s<FX_GRrm0Xj`(78ZL%h0famj6EsOezCH*2`E4?#I
z#AVYpWdE?=N(8X57Wwb$p$7{->pgcN5Tm+G>U@b2l#Km4-TPqtxq!)9q<94%xj(K>
zy-J~`TSVFR_*H|>N9s*RQz~a=V#brxW~`%^^OI!cU(CFtE0L^HFg>NA>eo*rxS<s!
zKs(}ep}(hQV2*+SjyY*sHR`OGeR=ON!odySfHqjx;Lv!sl1f=zj(_QUVPR*@mWFwU
zDWl!0?k0qK2Odw8-48b}Qd&M%5_}w`^AiJRI3c8USLl~(I2bn*m<ThHuu~nZ2~8g+
zv#p;mc<{``QA)R;AQIieYIjz6Tv}a>(Vl8c|HY;)a3!>|qNbO|jbly5S?RPSZTpUW
z@QTgCi;j7W1XsE+Qa@az6T{J>cDrC<YUR*^sp1I+Dt!#g$@n-9lL^uD_q?tXmfr25
zJEal=rZ}T;1@%Z6ot&dTePekQk;dVrE)P$Xg0_strrk~@<E?8nd{+BNogU&bHuyVJ
zV?$0P%1|e-R%|HQu^UWCWI={VltO8el0Gh=Jv3UE2bhs{4_T=$Etp0j{+Rl485gjd
z8#gAHX+W*&oxj2rWQM?mSfBV&gCK&D4Yi`TnIwna8j9z&Z+5So4Jo<AIo*r}#s+DF
zHs>=Ft$stI55#_1asLHrv6)5XFMe4oXh~oh#BYMf+Sf(mwhJyr5&C$YkxJMqFeQCj
z#|ai+7_hP4`)ss3_N`iu-tVcSL!fr_hd7THxdn|1eRdL7$d8G|o)Y@s%QkpMhiawM
z`>TcM1wQH4P3EMrYxYnE)AaK4T^mI&rg*<pJa><v>MQks#{$U^&-?j__8E74+R0yQ
z(O2X()l&l8f1iIWxs)&P?c^QugvBij$WSroxQ8VTJiSUk8VHdq{xL}_a{9x@YF=t#
z4Bre3RQQ!Z?rdF-KA_drh5+=%$ZZ*}gj=l8Lm^?bEff;9zlN{IcG7zB`GEZw8Vy1e
zcP>ic3M&mmDn%qGS!6sr-JyK)WZ;PCnu*)%4N^_w#V(Hi$&4bQNj3jmy%^XHvl)AH
zH^`gM3nWIAICqz&mowUk)wx(&%%_tMSWu6HAbOc7Ph6k+o|_v|Kw?0QV7>&GZ~qQ<
zRuSO0Jz+}3^MP4jO@AWT$mWs6!FUNw<rZFg7?ap*HzjTeJ&7$jqEFW3#8SX(c*tK$
zoOkS~FInVvF@+NXb8FQLacPCM86?PUz3kYkoeX-V_Z^G&F1B<hE5_3sseH4nNWHS!
z2ebV8mUyg3(tto=D|#@a7ktV1NhnO~K~q|GBH8}inb)LK=RENc^`i0i3?<`ik2F`b
zA8Q#5pr_0M@1_jwKRZLlh28TX7l?+thds>F_HDT=8NsO3bWLtY_8BR0TAZ9P09mzh
znE9jVoW6efriFUDbkq?8>g;5R!!61k*7(!zbk2{L{)r9(C_yW(m_LeIcN_E`w@LWG
zr0RfcS^G22TqmD&vf)Zo+<z+3YrP@?h`H>Fm-e-X95r<v!7aT3JNN#yTEDOTmd>0T
zGOXxV!Fc&iQ<Q3Bal-Uk$B>k|h}-K=flt-8;+H~8gc=K{LnJ0$isunCvFq23^a&Q`
zc~YwnsUdfO(DvNt-4=*Z9Uh@yQ;iLEO=8^DEL*WjO-k-wDV1Hx4;@}xL<PEpl;o}G
zy#mDhU1p2_)R{RCm*g)>USb^|nSaprnj~GTChIeKE+S{No4CC=c|-r#S$ytI+TWN)
zuP3u)QDF~@eWJ>aycV+qZ!;1V+&|3AnIlBA1g<F495o!HXmC5Ke>hOxmqj1P%;csh
zleO@EcuyO#9|~KMTkMb58riJ3Vi<jP<V`|>(>Y(v_|X%hF;>Z^(?j--V?n?^*=QHP
z2-x>OU4Dh5fU>5LznnU5^))H6^Cr%9&VIiCYUSO|E{Vy5irayr$ck?TX*i&)$$o*i
zK#aQHaHyR-q`$^4=eqkrxvggo(qM@QcrErkVSNZ?PPU<7n(ASZ;<t1izw4`$#H8?@
zj1_EN;-4R{#*YMC{yxLv;*%V#q!|e9b1^2j=_uJKeiztRY#z5K;(C+^n1tk^up>s+
z0CY!-m(T=VF)Frxo+w82`;XBr-0buIePkxz^8xE@I~I0CY>{55>6}cvi3cA6n<dD;
zjG98+>|9_c8=B4~E2+F(@qZ>1!VO8<WzJ!wc{mJnshgxYxTp>LO~UQvNGp2&T7L7D
zr+NhJ2!*F<j$$IGAo0^lO(5e2>QxmlFP%aaYxPg$XF(oG%-NXZBk$**QD=s$>aB89
zd9DmQiMr<Kl(OQ7v~b@Pd@bgClR+Ed*zI#EF|AS%6&k`f+G^71w^EJ0hipwuD%1Ym
z+U%4q*&vKU?oV63z^wJ^-jrkk1vjWOxHO*Yx3*KfJpr%7&L^KPE5uy93pgjx6dETk
z-u_F5uPZ%<0rBrL4p+O_`So@(|E=g$rfDC*Xo{^My7ulNCc01UNcgud+0w%J3pR=M
z?CNI=#P;Oee<g_0pOq~z*IUgfBHIZKDm7cqh-HgX&m+}yhwx1T<3*qRmZJ{QfJSDQ
zucdryLNb1|vU+{AyX1+kQv#2xD%!`=qd}RT)oLQmsz#kAug%kyO{K1g$g*XuHYA>Q
z?)S#U&Lg=l3+Da(+M<joZ0nC>!D{U!g(?T0JdfrmTw8F!7BROWDyd%>Mju=Omm3k{
ze>as}5&6Et@oV<^TT79OH!ms4{d>v&Dvj)J;Fvec5zqDvUeG{4KCLgFbTHbD|ELbk
zz~1&UnZ@(58W~E$;=WDkaUK=(&!mI)90|joSRX2m_Ws2+M_H=&8F3`gmb2hl6tkIh
z<9L&DE%ot3FkG!U6p_=@G^BVG&tHhWPb_vmtF9^lgp?nn3Dp@Jh70gjj1pfv_o5<)
zio>F}KxhM$n12KkGVtU!m?KLnEs<&6{7>h@@s0LrdeX<Okc+|S%~*_;JSrmXn4g+)
z8J_<Bw8awgopdb)E@Yau@kCD60>Kw9(xeWJ^wTxkZMfES(N=7{Uh&H3{4JKHW?oAP
z+nP3e$g0OAWTziOTO6tzTnNiKpx@j+kVQ4_rXjG<>OxOVR%ag+1+z?K(q;y(-8Q3M
z*gpNLZ_FIbD07>rsu5rc;_0BzCiKzGQR7&QcxcOJu5M5*LtQ-*ESz&t`rH$U-d6AO
zQa{_PIj}}BrtNdrknnh4X<$b<KW3Af0C5N2r)sCd$Tn71mIX{)3n}R-W=TxiA+Q<4
z<_Te;5$l4$cGc6P!ImE;43bfNck(LeEzLZ^@E&u<a6{XauWwgYDBRM>#^sk>g77mX
zGz-orqSMbQ<5pt8H|az!T-3R6>i~EA@*OX^G7;{-81_G=#6k1^G^<h%Itv1UrRv02
zb6XOPN=rZT*<mN16|{os*JB!&soobN?LY5ven?18{FBzT6o)Ijfkiy<6>nNGOPGzt
zUR@Hd+!}#wY@-jba7*-Zjw`^-f&6q~&&i?3?Ur2g64PPDU&_Aux#mlLbnVTY4e7DD
zAVCgYb7r*O*#&C0NG2Th`h@lR2nha&MyqQnob=*SM7{%CI!30~y-4v-FNV;sVFl%<
z-GUO5*=&Z4(vClO(R~@fQ$kZlb`u&#5*zHuS{=H}#ATLBnoCrjU%_$LL~f#yZPzU^
zjFLN-^pn+n_BXV(0o8wGXoP80_U^lhucaKyrR$lw-$dImm!8(#M_vwCVO5^}g!DFI
z<mc=Ux(gg=bB2(B^7U3>hG}n4hxd;+1MM!@WPZGzu(+G?`l{|@9&)Ar^1Ktpv9U$K
zV%Uqz$_7|>e&fEG6-`lO@hsmGj$2f!l-dSpQ#GJ=KW}+;)YBDw?X4X~GyV;~D54Ir
z2_%u73a%<ScJtCj*8hFCH1&Y}S?r3H!K-^Sa)zCHG22NU&R~g{h>&P_3yo}jX=K84
z6gldRwyb=3IZn7!boI}kFpgY>i7i0xX5y*<5h90OmmOjo<c;e}|4;h!@`IoG_7cfq
znfPayQH82$=7L6k?!Rvqp3f{<EO6{I*?Q0(ldL?e3{t-S@d4`mVIN#**U8fx?7`Y;
zeM|p3zSHk+$uU6EmHvT-cmCmtdx_D(*el&o@6+%DN}fcRDKn1`Iuk?X=Yena2Uwj%
zWZj=m7hPqggjW)SK8Pfd2zLqC@N}BrauLL-pWQEPUC6Xs{P8lXdx&TMs3P@J#q{U<
ztblM9zi5CGYmgSu!PpPCr1+pq#UlP~q@w*I4jtXzfV;r=LcOsXhLkI=%^Y9(py}}7
z;Ep@g6_IP|U8xh{Z`Oj|8Y-r7zeRw<XF=c%Ic^7L?>Df3o%K*zjuxz-2xaZu3lDjg
z5v8K+p99@9C`Ug@y3Ra#f1Qj$Z<%^dxgvZ^97*sXS@C>M)1KVv=bw7!Ms9L{{F%SO
z3&i`c#K>3<f8@7&CYM+_>@KCQ$7RF~DF>i61Xgli?ich1EwWK~Cs1>)4kSj)V7puq
zH(rf4b9{~?Ltx)44R?cU!m{zlw=PIB4BrG;E(L7t<l`CEkx7ZPqARJnm=~?Jn%$t&
z&8>8lS@pjk7+a{>j0@^QAr5U~2!Bo1UE!+@O~~j67ewgLgt>=bE<xSCG#z`rqm#Ya
zZQsX|5@|;F%kX=5*LD%@YwCAalr+5uUu&+LVDS5Ew)V#XfAtN?rj5@tqg^kp1{E8X
z6GfFz-m>yt95gaJ<mH-hA7-mR&%F2o6&`SDba=~0>#Et8<3|bZMV4Ok)3M@buf)V6
z$Ip4G5@9k=SVOikN#%(I-(HgZ<w<Tx>TJ>QF|YqNyDG&T+BJKRnQH0xj$m#NzH!dn
z6`}ahHM`}jXU1h&C29X229v@4B!;uj?fitd3)k?w{j47sh04UO<l%%$9Upb(`;sQo
zG?vbi2mIGF$HQS<@vD6U0U^|1@qZj<HTrTD2TC;qE?<LIeGg3@T4=5MXU->XuH7cC
zFThykrNJq~SrW~!eN<n~_z$KDU-{f!{`UW7+Ctw#ct_6EM>uniY;<2na57QxwTV8(
z4I+26kb|OYR`E2gu-5%7vRk1Kv8|_u@{^-DQ%#ilY}#x!x6)s>9>`jbg~?)mgDfYh
zpS5s~oTE|2!h#82v0_*}33%@7R(DRGwLmKA-GB1uwIo}Q>K~rXv#*5>M?=yRi&2$?
z4<bah=gir}$Hk)LxOX&Z;FGx&czTJAihY@SD?ICZQ7f>Bv^QVqIA>Hx?&)gz*{4gA
z4Oh&Tq<a}KGhu*dV1>FHvRBELD&~=?hY=KgqTGO3t)j}S>L2`TIrAw+i6jHMk4EYq
z>v`flVrh5b)a~o7^ff^cMn#|951YMsPr))}3q(Ppl{^Q0RAY+hH%^t8s`I9*=EuX)
z!Q?7WV?)`i<_lxZq!7eEQUm&1RFj-bFB>DO?c)w@qg^{h+MD8UDCWj>!qA2nk=^wt
zbvHXD#pVH=9OA@z?+r3GEY1z3rH6pcL4@v##=Lp(_p;_S6X0Rt;NEekegAlXg`dj(
zx{!=l!pyZD`Xxw(6MJ-BZB>)*`vWuQ2~@j4=8{N+_Fkb-YHQDLS5IJB*@ST0pDwu1
zr>TKx>jwv9fYU-j;A*1Sj93Ed*I~^ypBbyFp-{?&z)!NrU3F|S$U9=Mmbea(lezM;
zzKsm{D2n;W+0$w4zLSCecJw_3-KvR;T}2+rdf>kHxdOW-Tz&s{;h6gRVvj8Pi)blX
z3fgI#+DYm#STL1^E$WxHMd#K(B=yX`uHN&?Q#u~})PRRKj^Hl3`f!1W%H@iqai#f(
zr|9UTFg~~6Dh_tTBENP>BX932(f@ArY;A)7w>MeT#)dgBfji{LsY`1$iHWK~Bou|D
zB{7KndIlF?+>Fafl-u5!dg9bDkZQ^@^QR_KEGLz=N6?VID<oKKNXh!Pn%mOXAn2{a
zgx~Zp3WR#+{G?ZN(KwOHo~ae0K)G?(ibu_>r{kbg-jH7_rqKFqYXvV~Yjyg>YeniD
zgT4G6zN{P9-U}o$Y3_=^hw9V!>>P>RPafP2;r~31D%!-d&V%d8W``o{sh*^(<I5i7
zTZQ0Q6NuclS22}0Om>ie^ErXla}hy*^M<?I_$veJq@T>Z-K6WTWjLTqk1Ak+76i#c
z2LC#f<DGBg9!U{GmC_z!Guma-e)HG!23xv3xU61b##oV<lE=d~pkbk+Q+~v+k9}i*
zeWHg4t|}h#-aE=@_pvV@_4!%~3g2KjbE5yIUxu~DG3VmVL2#I2J2o6ScHnKsCITmZ
z-FQce+Qu8%(wCxB;dPUm24kZd49ggM=2cc*ucyAO`lb3C2Xr)gwX~5Kh5U;DK2EQv
zs*!L;ihE~08-9TPeZWh>9(OW&_m%!m@s7G<CemR4pP^Vl-QUU8mt#aiE+*5<y4-(L
z*~wLQd%fLVo^wemFJt|DPa8&V4>nFr*iFf{DE=o_)JF)^X3<WB9kG&Mt132mUtkuD
zjm$7aa!D!$Va3B%zFn|;s_cQ>T`uSm-wxi>G80*H;x4NJq_J{f1fc8>J?SuWsm?hR
znd%?kE;tN_;UEyw^){Xe21GToP1900fS8$V*yV)gY3p$Dqe;@QZ*ju9G85I0QO^tl
zf!Q}V5Pb3;5$B{YiwAs%mvsYMBsDz5ZvI&N`(b91XW#gICopw&gWioOFA$r~ZsHZ)
z?Y7tq**h}MZawFr+o-vSBsXO|G7(Y7AA#4h)AI7QJn4xvVwCKy6iGjhkmyi{CY0E+
z^T*Lv{!c7G`@s<z`L#zl^IyTp_)Q}-*OidK!}bt5EN08R1FTY{<3<Q-`j4gbIy!J1
zvn1FY7@k^W)9QkWv^a}oZ@70T?g)BM+HNZCI;r-rTHCeCdMhEGJlN4QfG7>3;2pPY
zg7?;T?$@UtkOks00-X_^1>$k{{3iUV^@0)jR2mr2AQ$&v!&4<FuV?~&GOdL?UQebE
z(Z^avXk<gH$c?6)g&rWam3!pTv(C*tqW3Vpb|PMljkrKnXo8<^kFZ$;1FOG{idgAc
zwC`R}CmzhL+0+6-ztb9+JZ3w6wO&#&R6Cjp)k;&!Il$U!{Js$J^&|q2l1yLdSn+Mw
zX4{I#n4ZB4dt1zwkJ)yKK6!kH-DOv|r+vTcA3!ZajFQUJlfYOA2F?YLsqA`*hirg)
zHN0-EX2ijS2^BG4;rylN5g|O1;OWVTdhJNU(|5<{h!KsofH>Wr-=(&Id4jF7+oSCe
z4mNW*mbX9f0OmsYNWgCXI>5QQ7hE$?|3P6__^vCzX)J&}Y+Y#h=S<0rC_=)-!;_av
zWjEge9>S5>P3*58>9na{j8<>;t$bvN2#q;%n|+wlGX`&!PcrJ*<G#)ZSfD2#wz8Gt
zHjx6G$IE+wbz^R?aVGV`&-gxo$oA|tU3w4H@835r=Q<KGa6u;S&?TeAzsut0VW1~O
z*`<@-S-VvC@B_+DTaVrfyQ>`O@hz+%Q_{8sNwy)IA+b^`X2?VETH&Hnaw@HbDKCdC
zR@3B?B$@y4x~$qn?SKYgyRSUm>qEA$O(fTHg>t(6zyLpaZljXbVpIHJ2t{A@d{iX&
zUlLLUXm|<a-#jl1ZAfQA+$%3vPKDBa_Z+vWjI+wOg|>uW;p=Mc(MLcjiQ1Z@#R745
zisSal#d`47scM=KGQyMyA_l~lxnHjK69NX$Cr+m!!P~L?Zm?PH%U~j(k9VTKrFq1_
zgy9-3;<!OU=i=;Nf*<`J%hQVzL!;fHFL7OS@fU5go07HF2Q}&xFI>H(x?VTDJ)%pa
zwdnC@J4&bR@fi_u8sY+|_Rkj8GYj#oOCY`NMJ<~{sypl=9}F9dzwmhH_@uQ>1)>(s
z<Qh`8>v)KPFM)%RrF#28xcKgM)wcUwOvp;0VDGPHq`GTjgDx~u={Mab`<*o_d{Vk^
z^<bEEMaAs1Z!o&s#V{r>Zz!H!t7udDIAD;HA9`=8g#H0Sd!5=F(vXSTNzIL20pQxl
zV)mD*N&e-~-ER+48<j#OqhsfES_JO~$x<vn=rw#?dSLZPbxEu304vO6YZCgIceE>7
z`gyk9f|kTI>$ojo>TZPh_SG|Af%A*KG=b$@!e-5eg}43&Y30uLG-E0K*Pzx0YOT5>
ztc_m#m(5UFJWI*i_(2M-LTm1)Q8<x3u-%C<lKV?@7-0Jl(uQ)@X{)cB7pXR{e$;h=
z<Y&?%sxv;)rP9i`=9UltkLpOOW5nFsGND8te8N}nR9)q;2ia?8KUZKnDF)R2!<{dA
zAUAjX*gi(wnrXCK>VdbSQqyAXN_3f!_);>Y>+4y4Kq~Pp&9%D`G@(_nBp;y737_l$
zw$enWllnFa;IilR!b7~xHr?DxNAF{94!QCeT@R<wF^<Phy~w5D0`bQYeR1&RQ`|ct
z*D_!Xy5C56f!uP(Uy5HcGVZiD@~eFV97JDBSOcML=fCENs^|)4Ef3^$_J71-0?N=A
z{Ycu}f4**A-;oZd;lA=ZhDxOCWcR+1Mt;hC*|cqQx%Z-_?1Bp5pi!m<aCj@*NiAAZ
zk1t)y6RN;8H|h1gx9r265i!ouh+}1(<}jRLpm7*{2{eFI5DdK>(IEDvNIdLUFCR3;
zTxF|YI}j@n#MNquu2nvp$OoM_FNuRne<f`tQ*+pOs;Je}O-}S;`;5XTpNhZ_d&lr;
z%IzX!i*Z!;f=fQZT?Xql(9h_uv8O(mjld_}r^x_q4T5E<$^H9G#F|N3gllKahy~X$
zon>s&5jGcA#_c$?B?m(JZ$1zXrZhKk{zO&cz1bHhzc!wq`UH4MY3Ejwrx&NEfOW*i
zePBox@R09V{0WK%`k@>V@NgSRHg3vp`&-ISz<66DBe5GSi#zwSTi>^<G&y6OruPXZ
zL7#g^L2Re`>*A4|y?e{_!jhzSwz9IMOE)`gy5D==V7rNsaQ}@mM-)Vmm@!I%M`Otb
zPwtrmlK=WDWX8GIqE(4<3{N!f(Gm^Gesdv`WG!__fcJ_l5L4Oa!d8g5|9ZJwj#{hO
zt17c5nu*uba&cyq?krS&Ovb$mTC`>SCe-*%2GspM3r6|IYGb2fBpz7Jk$dc4-G}G?
z!<5zrF<NA#)V{Sliex!n=5?qB<r_Sgl9ZVp#3)Q^7m;@ka(-o+g{g*|)_PT3Z{_RS
z`1NOIVlP;hVm8zY@>OH1K2mqUJL0X!O@a?eG=N_T_`>p8@A}uM*0(tWf_C;sGt2D3
zX~CXgDMHY5PT~dPH<*BjqS3Aijm+@5zv68VS;KnTEP6R>Mn276xIbLy04);wx9_zB
zDs;f%C4bBM+_4?r3tb?V64l<odNkY{YBzU=;c}o2n0EWkq=<>$=Lfh$hWlySiyrag
z#BDu`g#1?Y{Xy&B(i+GLsslp)g^DQW^venAM<-2m3BxcR2+4y;+ajrN%zA$gvN7&2
zb?O!+P$;^KqMb4a0oTKoz9VzIaWu(k%K2G2Fdh6OmxB91JwV`Iz)j6tV+Z^ITY|Md
zl}pQVhq-g)O&T{mCh%R7s$J>FO9dXh{6E4JoFe6XFJG}3yUIaPC-BID`}Ic`ce)uc
zI3?7}q#{~qgR$rAaJ;3D_y)wjw-+2$y`mcI&k*cvZ!V5Q{`AjWLSfLu+XhQ~sfc>5
zpGjN%sdjQ_EmC4_*QMTS(jn4m-JAL6NhbmYqW4?yO$)|}mkp&-MyqHAMr0Jd<Zt?S
zBtMte`0tbX2}j{;vG=HMh9XqJt$_wLU)zoTTUV@OiQA_uVtL`Hb-SDCutb$~?W~hv
z>_vl(H)NC%Nx2@YG$0}U9{rK&r#k->TKrxDb~4S@-B}cHJKVh<1TiCl!_J;xtT9J7
zZx(HAP!tcxaMBqnTX-D>yu%t&wBIFW|FPhfY_gQEjJ3kU^vkEi^@R6JsXD&+xT~8O
zaPvS@Osf$S|LrQzcH7<R!Jys8-hC=_olWuCL>#tjQ>zgiBWSnI*oVCBIn}LQ-40WI
zPwT--K@za+Q;c?n>m_(oXu}-S0RMUG#jQ4L5?h+Uyz@DR$027zPk}rTXceDR{My4>
zB>Y3DAkly(_a-O%>$=o&!6<NBk(_FTYbb0zR7jN<`0TzF;@UG&O~`>ERRKVLq|g7=
zjbh=;pniIBv$8$sgL#=;^^d=z$GESvi%4m~w&`p4>b2B-?0G%&q?Cg#L1w~H_YlEh
zcjDe{_~37nqJ-#l3(~bi0(W`FZ%cK_Up{1?1-N}LaF%0wz<t{ga^mp(iC6m)FD`Bn
z-RBE@fCy^&EDbN!GCYZH37(_7;FmP7+uM(}PxSn)?;iu6$IHO`f^q+e+er0y4lDvb
zdoAH*WC`gwXZq<*Eo#7&B9z9I>;yw`-k?`y55a)FsxIQEyP5><KvmE;)38L9G>Zd@
zsxP3C1Cw2nx8?~_*y}$;7*8`OkMjzMe8N43gUm#LT}N%x3**eX#SBYWmIa8oq&Sk*
zT0q!-XhwQ8I^pL#X%-cZ-~IbR)=e%DYta%)oogCdD8f)R@xhp~SQA|Sap!(zGec4R
z^U(O0t~w=_JnYAl7K^P<bpTwz#<uum$X?cl(9Y2`?%m*GthA9N%14sQ+N$CwH^p9N
zFKC`BEtTS}VftWav{ki*MrBK*2L<A4ZI<0e{*(;wBD@Mz)CzS<XKbuJV8?}uQ7FtB
z-)?9$y0`!81Q}dDUm*U9cDR7DwD|B;#^0X8HAj`%aU!_5gPZ0S{A|G1hUSw&4!_}8
zALaG4zjbyy@3v##CsNN0N#p$J=NywRF!zbd{Asg^6@-#|#femYS`-y4I}->Ij5yzX
zmMdG$lxG5`9d<p4&kOhk(fcLvk<`8XXKbQtJ+Ip2bvmwG&H_r%emVyI=8tM~o+2H-
zxDVmfzf)<g<l);zCeOy7T#44o%~q>fB)9_687UU?VrIe6w=d9;s`$*bZ^M~g^5!#Q
z*8U2Vvzj=QO^dDB0@Pu`u2M!#N2rcR3^U~}TI2O}0af7a_#9#Q_=K_%tmK`uuibMF
zNz^b{r@6*YKlc*Tu*X0G7{74d24Z_N_2F=ctdBG9)D&-^t+t8>o^Y|4SD9OTl0Z2`
z;Ded7MDSUe#*$8O?+)1DZIgf=Xipd0dwuz0hh@QiizffRT;mHzCg1*q7vzZI_N@_m
zr4va)-H&C~3VrPPm@Sn$M%g%gtI%ghik#oW5ca4ymW-r&0AO~&Rv;{M$-#sn1=+36
z^h;zajjRoa#|z}>&(|+5qW__$Y<pwu8qHhWfC#%(yyb8?d3$$>4~Vg>vHa-%urjFa
zA1^o}Xrz<hlS1mw3gSvreEvN)*`E4BiP=}Fpa+`V3t$@YT_ye3reUHcay)RkVY;Xk
z`m%q1f8KO>42NZ`=)3U7=>ksF3fvQN#C4lv!~*}m2YJI9QT+<@ox|EwQ1eQZP8q%*
za~y;{@|iR|awQ^iF)HgIBpi<MNeDBUKI{!;sAam8xcUq36U=jYO*k!S#m_)kXDTpF
zfv8GKsu7xG#}h|!F((1tAYk2Y06(CN{J-9Y_O%MCNPp_cDFU`7Y_=ubvQ|4|6VNNx
zAZHd+N|+AK>46DbfYW8K-9Ss6Ej5CEd_YX%^4Y!1OxSDy&kPD&#y&XGNuEm+tu%-d
zlE7lZjH03mLZF-Qpv=Ye%{rQO4|;QB2|gL%l@mCV6UNmZQ{Yesi`jNO)O>SvSQ<RX
zv1^|A^Z{qtGt^M$@bP>w+Vx(GYBOgYkIs;02ZHjUmbM^4ufd}FYOOUYRk_^e#2S!>
z)bX$0aLaARKs|!v<J%7hSn7xmykCw-8jE{*bb^2zYc_)kGOaTe#$58Z0tr;gNCL&w
zs^?G}O)95aO~5ZLY#S4>s5LL2&vQ+sjTjH7uiIC`@7eD(f#NW&Vma_0#V!HY4b$$~
z*2M*xb`sVqg<j@}x#Z<wMw*BQnOM-;IO~&1Ox`3DuA9GaIb?*i2`p-ffWYc_7|hh}
zM~ah;3PXykcYXNWnLv}DLlp6Kye>`N%`@DNalofGqNRR><0<Q6$Yk6mA5f|f5wA#B
z8xh{T@UX79AD`bh+NG=YuMW35NhWYq_c=dQW&`kh_7c?_tM%Uugq_tqAV)qxWL7V8
z8OQKsPOWO|_Ts6lE?qKhF^70u$T31zatgoAxFy_)(U~R*sf-Gpm<8Z@!mnpQGAUP`
z0K-w8je6$X*$cg=9MfHfguBAr5JKZaif(un5Ckt{lxh8o%_6`ID4-tlApKKXcdCvn
z4=8c$2VZ8*`k<MlC;4gBE;m}EQiT6*;)^Q&S1HD$vi2dC4v3A@0n&S=6IG150h;|P
zsJ6koLUJt%c+dHjgVriy13x|x{Nj0#eWg-kfe;NPIZ|%Aqyi9^`{P;|GE>7h+vjUk
z_g|uA-Y2bTjhoT)+q-iA#jN`&+U@!l2(@XyyW9U`HyJVL+(QLnT4I$%1u^JPoqn@!
zIiPF=0W~Wwmiu?6Irv?VsRus!nnDxgzT$+W`3)GHupH-z@{s#SeBfHeGsFh$s77|D
zMK0gc`*#ZhsLaI|kJmoFp6yRqS47?3aQ{`-#n0Ngd$Pb0L;hKCV=Xn-Z4^$-ZfsM2
zfaPn^N-|CM!0W2uWrYCzT!AdERVDzm*{+1YrYpUwMC!Mojryr@l;<z=7j^<$aqQ}a
zx=B_KCTaf6E>i%WneD)NLalbZBXLN_uh8**T-sRVWGPMdXnlI4c9PZ8a@68t8K9@F
zF4KBz{J9rE>7tfXy<ysFchK##vho~PKOX{Tesg$>@3oish>_h_;A-|%Zi`lIKUGuQ
zso<o0wihv~ZiouR=Fv1Pc`DSZfsxq#ywYO%q*^;ag_gP2R*~MMs_wF8G$Z^;^vzoB
zH#8XRhy>~>UD2_Wmw3C?!PUHpxg`KFb^)8MPM+!0hTTME^m!;LOsK6`A#P%Tg-{`F
z2q0+DLB2zO?vUF5U<Z_8nZi^p;U5oCW$BE@JI2snrP79K*!Y;BqhKul!mTgX!VNf%
zJLEpY<WQLtIWV~-_#8Tr><8RU1%2H|5>;#c2aW)HGZ}5@Ixri4`HgzO_3iTev)jTD
zj0%ELsjo)6GBzz{AS{%iTX6t!u7uP&9ZuI=^WFgP=WhlRj4*xMyCSwgvUJuTT2RSb
zlNN^0L$we|(#*gvl8Zp?YCf>Y<%15xzw0O`%=!5TjuIn%%*FW{TCm7lCl+Fx+-Hdr
zELJ91+#2@?f;)~&jl!7giyL!a|FxWeyGY;!OCj+@M%!)NGXh8e&&8s;RTqkfQ`l*Q
zQE+r4n(>7t{R$(WM$}N><G9;%zWv*Zj?u0<;O`ZCu1Kzhzopg*a<-pX_i5{lC3p=8
zkunkk?*HB8vJU|6&=f|I_OEd*5u(I^4`$*+Xu`uOi6i{wJXR`L@KlpuE1C9_4eeA-
z#f`v|Kg73z)*SO&Rk5%YYZKvwk?gkh$hJo~xwq3XR&eDVb-h(%`(E>PHQpBh>?N2Q
zXl8GdOFEYjiQ_e!H#wLO%aCS~#1~G!<XweR>uc2hMXNmf(@HbcNamb>FsR6(m$|8Z
z28bfyw1@Ama5%~KZ;5}bTF`P+_FO77U5r~22Zd6LFT8SyA}AM-J(Wb7-8lEH0{7n%
zJ7BEYnrW`T>S}#!1W;@WnNYh^#BLXJLdpR<WXT?K+QxM>I#}o3T1?=;&Th1e0_^Bn
zI~}x(ztkpm+5kj<!K7Z8&&6T?*vJIXqiNFAOr9${V3wL`cw2lXt+ryqK_&MOHIg>$
zjjf3kX?+%_pGF(a@+ME{bm~{qBurpIdsk@MQhc)6QC?QkB*A>tnu0U1Gj}{3M#r!5
zkzzZ$4WZeICEQ^KrE%m}*LR=$o`+Pw`v6Es5N%mga5-T_aPs{%8^Mkx9ZON6IpRsO
zmiA!>IW&;$@01;b^NOSk2DQX1U$c#&UC$vvLSxcaw-0ldni=>~k_(AUY@JgyK(DqH
zZ?ufh2zGVfioYSOy{JtL@XsHzvBX6d#dP6wP@pE~XLrs)!w$=#2V;$XxpCouc#t@_
z<8f2%q9}l0!G1*VFjbJKV;t>@hl^4X%13iZ63m(x9yVupx|I<PHtRj9*Y8x)J-l*s
zAg)f9^Zs{OtCl)B*diyOThBbjWU`Rg`)(?FG7Nh`+n(-Q^#Z-2nxRm;&~$9<3yN68
zKPyBFCEItjv-TGGF<O|!`HM71Qz%Pz^sFk$v8qgX`WjBym~D**$&%KM@xy0ewq@*h
zCre#A6vBX(>}`iq^DaB`YL8db_`TcDX@h^zHo5y;o*_vmM&V#wq3@>#x%aikv&8c`
z>gI0GQAU%W#-m2URyF{~q4ud00GpCiKa8jy1w>U{1QV=$Z=e?CN*aNK<M~-L6d<OM
zkvRfutNCPCm4R(KV?BCq2r4P9!Oo{z2|j5khfD{>D+e8DMMiT)RruRfNsp#_V<>4w
zM2Cw{*L4@+PVs!62GbC>o1R^u(iDe=Nu1#~p&!43qxK*uHaUE$%3mr1s9IF=dtUXZ
z>xF-u2@t$)5I7iN(W<>Vj&1KTB+pB?YV6x@M-L&pA<A!Y>lOTfFP5@%R%`k)(!^v=
zJT&KT=_K4?!J}+Ee`+Q6$<UA5uftw}uqpBL_{4dx>OtZCX=KTnLjvS;@Ah}^`RskA
z*y0PNHl$$mZ>ygk<-YPz(m#`Tiy_t@bQMnYl^d=<+*cwer3}PI`#~$zwA}&4-Ox+U
zcHq8T5<s2OXzZ8k+s*Wx5BDJr9#~a2dDd9Z&$9+!JmzlHPC6J!rc?7X{V@L!@GGsx
zjMKFLQyqoHAlP@HlZuaG&cZM*K(IhvWu`~zRMmudCG312m`TEu%=<%tO+(%bE)`#{
z2|_I>3*P=5Vq55WkP`TFntv1X0+~}=*+~9VP))1xjn}X0%I<4L0t&^bTJ4|lGJi+m
zicb%8tNXRLioSFumud7zcL@w1(%5ShR0e`7mx9i&KlCAqB)KRo3$qkMWTN7neA6^|
z4cU!I_$<|(sVMetYUQ0XX=4M|_!L(A8S7M`c#e!T08&4=?7{F>^lWbDT+peG!bu?@
zj3|`AeBKy_;`9u2<Q*mVbAEH))90UuAo}L&Oi5=7Rz{Wd0~nUk2QPmKN~Tc*7)p0;
zNX0PS7S(}vb&s;$x>^#iA!h9oW%oH|Xn$P|Z9QMNwi6lVH&;B;)U0a7eG;Tb3L|w;
zGE+um{qFShy4TMJ{Wd}mjDC5^eh+yIMR$}3=q(U7tq$&dBm8lm^?T;dsPsryB+d<u
z6U&N9jsNh%eDSEeF<q{LN~M(w+*!e7rf(r}9<UH4OpV>AoTIJOW&j5BAPm(InzTv<
zlA$r|GlwQKRKex#WPL!ehH@s{XjiWRWeY4-x)l36H(E+k1<Qt8K{g}y-l|3eU+!w=
zSl}I+_*7WJ&oG?cG9+e2H311GXEnT{vd<d>G7yf58&w9T(6_HGERK6$#=xQT(h?KX
zb|G#1Z=O($;|a-~=;KfWX<vR{=B`Mqxn(hFOB(T__@`hVkl0fzGxO6F&83<<yKgZv
zk8`SN+e@j@oa66?_8}0oAo{04wT#rf5eAB2K<>#3oq=prZ>+J4B0A`*`aYnZSu5TO
zG2Nc7NOQU0#rl{dLPMH!lHwl?^lSsjN@36}zcjBwKBl*rUD<6;SgQbtnd#oUhSQz0
zTp5hKvVlO&8`{@#WdBJZaah+Wda^ndVg^)qxE@fJs+je0!7PFSO^T$7JJBT5e*>no
zBa##EHsaI<FdI#QektA9-A#!9&U-U{dA_>!3Hk@f(BpZd0a*i3jezf3W&vdv-M~IK
z1hRP^Q_A)?$hJhJYTAtf9uqc-6!)qR0ANPZ4#=-tzOB4B{x}7I7L!ZwTkZ|naaJsu
z9xNUceH3X{h3-urn=I7?(>zHZeWb<(<oe8-Zc*L7yh#H{c>BnGp}E}a;suOBaUdJ!
zi0+3>_~D2;(6w20oaHOYy9dA$vp3*|{OMn%en3k#0%~f%yM4DCf?!B_H09!88u_*6
zYomw|`DfY-+A-u?tA8g7&79MKW*R`V*Fdi{`&QF|#~wPv)v=wia);W<Vclt?C|TUP
zneu<_MN8o!a}QdNW+sps<)yF@cuTkmm;^+#2Qf&>5WCwZK+rQ_;YW!Tn!q0l+}_Wi
z4-UM#wb?BIG@C67WHo#f*&@Gn+vEeDB}z$KPfHQUJz;=7GSv?B31O;p)GfOo0;B^?
zJ&UvN3n6?UCC7UdH4>(Qe;IyldrOiT!%AP?+kG5OZ~H-4*9wtJ`Zld)BS%6l?{<9}
zQP8Jo1c;|(0c4v^l)DYcQknsy^d>8oNQP`BAteSlLK^M4Au0PxTZw?mxazI6a5)*m
zR<UKrXYn}rjdod<x%R8B;!eFE=j69SiY|&^^ylFEVxn1m+`K@G8c+OA=UaN95F;UW
z_Ud^3Mhpdx8Vw}hc^G{`523jRJRnkYl>y~j)!my~1i(%Y@TUHxYuAw%;4cr|Wb63^
z^b23<?7lS-ib9PC+6l5|Y<jI1FhoNawAmT*4OYUs2!d#NSO2hgU+q6P8z~|QA#J7T
zv#bIV{`xEUPk8Q<P5{ISAdw#&Xs%C+9mx3C4Zr}!0~I1mYVpi)f~Yksfk*&&h6rFS
zOfAuA5lFoH{Q;|F)Oc7gCvOAu*7!=2^6AcF6@G4rBMwk~b9CL!3J16{XDqluTyO*m
z{}oOnPNjvFA&hosgrfTYT{WEe)ENhr0&seTXH&2)ydaV!dmuOqdx--KYx;|#tLA(0
zz}YLR`rY@m(Seqwp3?W<u6PMz)d5jenI937hES{`SWMfqz_RNdWUrqIlr)7Unx(TQ
zgbElc0CMqC0-)5vb*OS0wr^I5{|vCh!<yNBHUb7qznG#-d1N1e6ywiR{GUL%=GI+*
zyLq&YeX@#h#q79hJ{_9>WWpwilU(B-sS#GcxEzs`6%tN%B)_2j6)maaxKFe3Av_L<
z%z}SO0-3BIe;yvMSMSdeD;PYU?u;HXoi2fND*Xe1tpCV?>{G4;)D@jOyCsV|E<7L$
zR{@tFW`opx@Ye8Wu0R3GYx?r~muG7>{C5BjWy*j;o-`$GdYnrG1RfJyn-V@9X)o#D
z1(<Bz0{xVTW?DQEyfZv4yOz(w8ip&(=mBc=^k0_$Pn}IE!0@HDYsCcMVA0WyNeK3*
z^_xV(tN@+QranYIZ&v#gFM<Gn;WO&f`Oh6BN#*o%$`BycWM&2+^Jj61)U_!j^zGp>
z^Pa{ieEKP7KZdVK0DZppDx)NhwmFbgui=?@$Kcx186kYc3pkK_N?QcC-~d?y&P?En
zj8u#pQq*9yO*5Ey(SaP_oJ=<YfzW<GeitA(RBeP;hv0Dj^Gd`})8(IfiR5S?2j2_%
zJs3}PUbcsIT(G`aC=uvgoIjVT&T0%Tup?~}HKCJBXeTnc(q)QkZoInLLC!32OTv$9
z`(uAuB1m}TD3wgsrK0AHHLZ%z0!MiTMxV0%Aq1Mxe)fiLFzpz(kNc53<<Zt}`j*6q
z0YX}I`LhzlaJeh`<sH0KgwWvTm5ukZo98v4{mwP49S6?Cae_$g6j~?wKTKh08=f>;
zHN7ZXo`2&Lfpp?2aX<l7=1px+g2ss<Z3?^IPo_5U5I<?bPXXakKsviUAB|#F>u6H<
zIbX-xP!7Do<D~csS5_4MZvBM85#!F1`Fd7Rr3I4{XgPUEP(1fcF-b7g)d&4BORhIh
zp89*dj1SK8%XrgYiWJ|Ao;-svS3<0mxy22ZEDwt&<Q4w_8RaZ5h<o1~B{9~~X^r1Y
zA7+7j^OXC?^3Eq*cFS<k^hF~p#O~=S`H7XuqN4X=ziI+XmdR8W{a!>(<Q2GS5~86P
z289ctJbp5P<o|s4;D7hsga3biDWd3M&Xo2m@Qn`;-k+AvA;YIVp_3@)a=RdY1_+3f
zNCJe1MGL}=Bmkj-pM;_y(7ONEVys4VvZv{H%A_C=>Qe_jBZ!guYY8hi7hVf%H%l8{
zUl;dB!XPPGUv~>DCmRTZrH!3~t2EnjTNfLHgS9l9p|Co?y1Rmny~9g?Pa9o-4LvJ=
zCo6GlHdz@QDPIYIfQt>pg2C6t+0{$JSDNiVbR~fQA7AsaG5n_r#7UY>)y2ZjMnXc#
z*TGiL&CQuXfS*^4pA8`5X>BW^qp18}B!DMrHhT!fU4oC#$H#})N08Ue(~eI-TwI)w
z{{`QR7d$`>9xp#vh=nhYs~0ms0f*r~G!$*TtUMjuAr5Y?439J|EZw{z(rj!v4F5&i
z{eL0t>h)h50Cd3z6z~b~3i1K87#O60Ckc6Ph`pPqjFtt|#+l)@8=w+5sMKS<|5*a?
z<a=cDzcBs(E(oBs|L)`eO%PuTcR&#S{}KeKCZXVIV*zpVeAJkXf`u#8LW=MI`TGA=
sl>Z?epjJS^eE&U6z{7tJw2dn;x}Lx=R!SHAdz=HRN*apQVDs?*3v4$@8~^|S

diff --git a/inc/images/provisioning/flags/ae.svg b/inc/images/provisioning/flags/ae.svg
deleted file mode 100644
index 64bc2bd6..00000000
--- a/inc/images/provisioning/flags/ae.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 3"><path fill="#00843D" d="M0 0h6v3H0z"/><path fill="#fff" d="M0 1h6v2H0z"/><path d="M0 2h6v1H0z"/><path fill="#C8102E" d="M0 0h1.5v3H0z"/></svg>
\ No newline at end of file
diff --git a/inc/images/provisioning/flags/au.svg b/inc/images/provisioning/flags/au.svg
deleted file mode 100644
index 407fef43..00000000
--- a/inc/images/provisioning/flags/au.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-au" viewBox="0 0 640 480">
-  <path fill="#00008B" d="M0 0h640v480H0z"/>
-  <path fill="#fff" d="m37.5 0 122 90.5L281 0h39v31l-120 89.5 120 89V240h-40l-120-89.5L40.5 240H0v-30l119.5-89L0 32V0z"/>
-  <path fill="red" d="M212 140.5 320 220v20l-135.5-99.5zm-92 10 3 17.5-96 72H0zM320 0v1.5l-124.5 94 1-22L295 0zM0 0l119.5 88h-30L0 21z"/>
-  <path fill="#fff" d="M120.5 0v240h80V0h-80ZM0 80v80h320V80H0Z"/>
-  <path fill="red" d="M0 96.5v48h320v-48zM136.5 0v240h48V0z"/>
-  <path fill="#fff" d="m527 396.7-20.5 2.6 2.2 20.5-14.8-14.4-14.7 14.5 2-20.5-20.5-2.4 17.3-11.2-10.9-17.5 19.6 6.5 6.9-19.5 7.1 19.4 19.5-6.7-10.7 17.6 17.4 11.1Zm-3.7-117.2 2.7-13-9.8-9 13.2-1.5 5.5-12.1 5.5 12.1 13.2 1.5-9.8 9 2.7 13-11.6-6.6-11.6 6.6Zm-104.1-60-20.3 2.2 1.8 20.3-14.4-14.5-14.8 14.1 2.4-20.3-20.2-2.7 17.3-10.8-10.5-17.5 19.3 6.8L387 178l6.7 19.3 19.4-6.3-10.9 17.3 17.1 11.2ZM623 186.7l-20.9 2.7 2.3 20.9-15.1-14.7-15 14.8 2.1-21-20.9-2.4 17.7-11.5-11.1-17.9 20 6.7 7-19.8 7.2 19.8 19.9-6.9-11 18 17.8 11.3Zm-96.1-83.5-20.7 2.3 1.9 20.8-14.7-14.8-15.1 14.4 2.4-20.7-20.7-2.8 17.7-11L467 73.5l19.7 6.9 7.3-19.5 6.8 19.7 19.8-6.5-11.1 17.6 17.4 11.5ZM234 385.7l-45.8 5.4 4.6 45.9-32.8-32.4-33 32.2 4.9-45.9-45.8-5.8 38.9-24.8-24-39.4 43.6 15 15.8-43.4 15.5 43.5 43.7-14.7-24.3 39.2 38.8 25.1Z"/>
-</svg>
diff --git a/inc/images/provisioning/flags/bh.svg b/inc/images/provisioning/flags/bh.svg
deleted file mode 100644
index 7a2ea549..00000000
--- a/inc/images/provisioning/flags/bh.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-bh" viewBox="0 0 640 480">
-  <path fill="#fff" d="M0 0h640v480H0"/>
-  <path fill="#ce1126" d="M640 0H96l110.7 48L96 96l110.7 48L96 192l110.7 48L96 288l110.7 48L96 384l110.7 48L96 480h544"/>
-</svg>
diff --git a/inc/images/provisioning/flags/br.svg b/inc/images/provisioning/flags/br.svg
deleted file mode 100644
index 354a7013..00000000
--- a/inc/images/provisioning/flags/br.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-br" viewBox="0 0 640 480">
-  <g stroke-width="1pt">
-    <path fill="#229e45" fill-rule="evenodd" d="M0 0h640v480H0z"/>
-    <path fill="#f8e509" fill-rule="evenodd" d="m321.4 436 301.5-195.7L319.6 44 17.1 240.7 321.4 436z"/>
-    <path fill="#2b49a3" fill-rule="evenodd" d="M452.8 240c0 70.3-57.1 127.3-127.6 127.3A127.4 127.4 0 1 1 452.8 240z"/>
-    <path fill="#ffffef" fill-rule="evenodd" d="m283.3 316.3-4-2.3-4 2 .9-4.5-3.2-3.4 4.5-.5 2.2-4 1.9 4.2 4.4.8-3.3 3m86 26.3-3.9-2.3-4 2 .8-4.5-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.1m-36.2-30-3.4-2-3.5 1.8.8-3.9-2.8-2.9 4-.4 1.8-3.6 1.6 3.7 3.9.7-3 2.7m87-8.5-3.4-2-3.5 1.8.8-3.9-2.7-2.8 3.9-.4 1.8-3.5 1.6 3.6 3.8.7-2.9 2.6m-87.3-22-4-2.2-4 2 .8-4.6-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.2m-104.6-35-4-2.2-4 2 1-4.6-3.3-3.3 4.6-.5 2-4.1 2 4.2 4.4.8-3.3 3.1m13.3 57.2-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.1-4 2 4.2 4.4.8-3.3 3.1m132-67.3-3.6-2-3.6 1.8.8-4-2.8-3 4-.5 1.9-3.6 1.7 3.8 4 .7-3 2.7m-6.7 38.3-2.7-1.6-2.9 1.4.6-3.2-2.2-2.3 3.2-.4 1.5-2.8 1.3 3 3 .5-2.2 2.2m-142.2 50.4-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2M419 299.8l-2.2-1.1-2.2 1 .5-2.3-1.7-1.6 2.4-.3 1.2-2 1 2 2.5.5-1.9 1.5"/>
-    <path fill="#ffffef" fill-rule="evenodd" d="m219.3 287.6-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2"/>
-    <path fill="#ffffef" fill-rule="evenodd" d="m219.3 287.6-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m42.3 3-2.6-1.4-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .5-2.3 2.1m-4.8 17-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m87.4-22.2-2.6-1.6-2.8 1.4.6-3-2-2.3 3-.3 1.4-2.7 1.2 2.8 3 .5-2.2 2.1m-25.1 3-2.7-1.5-2.7 1.4.6-3-2-2.3 3-.3 1.4-2.8 1.2 2.9 3 .5-2.2 2.1m-68.8-5.8-1.7-1-1.7.8.4-1.9-1.3-1.4 1.9-.2.8-1.7.8 1.8 1.9.3-1.4 1.3m167.8 45.4-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m-20.8 6-2.2-1.4-2.3 1.2.5-2.6-1.7-1.8 2.5-.3 1.2-2.3 1 2.4 2.5.4-1.9 1.8m10.4 2.3-2-1.2-2.1 1 .4-2.3-1.6-1.7 2.3-.3 1.1-2 1 2 2.3.5-1.7 1.6m29.1-22.8-2-1-2 1 .5-2.3-1.6-1.7 2.3-.3 1-2 1 2.1 2.1.4-1.6 1.6m-38.8 41.8-2.5-1.4-2.7 1.2.6-2.8-2-2 3-.3 1.3-2.5 1.2 2.6 3 .5-2.3 1.9m.6 14.2-2.4-1.4-2.4 1.3.6-2.8-1.9-2 2.7-.4 1.2-2.5 1.1 2.6 2.7.5-2 2m-19-23.1-1.9-1.2-2 1 .4-2.2-1.5-1.7 2.2-.2 1-2 1 2 2.2.4-1.6 1.6m-17.8 2.3-2-1.2-2 1 .5-2.2-1.6-1.7 2.3-.2 1-2 1 2 2.1.4-1.6 1.6m-30.4-24.6-2-1.1-2 1 .5-2.3-1.6-1.6 2.2-.3 1-2 1 2 2.2.5-1.6 1.5m3.7 57-1.6-.9-1.8.9.4-2-1.3-1.4 1.9-.2.9-1.7.8 1.8 1.9.3-1.4 1.3m-46.2-86.6-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.2-4 1.9 4.2 4.4.8-3.3 3.1"/>
-    <path fill="#fff" fill-rule="evenodd" d="M444.4 285.8a124.6 124.6 0 0 0 5.8-19.8c-67.8-59.5-143.3-90-238.7-83.7a124.5 124.5 0 0 0-8.5 20.9c113-10.8 196 39.2 241.4 82.6z"/>
-    <path fill="#309e3a" d="m414 252.4 2.3 1.3a3.4 3.4 0 0 0-.3 2.2 3 3 0 0 0 1.4 1.7c.7.5 1.4.8 2 .7.6 0 1-.3 1.3-.7a1.3 1.3 0 0 0 .2-.9 2.3 2.3 0 0 0-.5-1c-.2-.3-.7-1-1.5-1.8a7.7 7.7 0 0 1-1.8-3 3.7 3.7 0 0 1 2-4.4 3.8 3.8 0 0 1 2.3-.2 7 7 0 0 1 2.6 1.2c1.4 1 2.3 2 2.6 3.2a4.1 4.1 0 0 1-.6 3.3l-2.4-1.5c.3-.6.4-1.2.2-1.7-.1-.5-.5-1-1.2-1.4a3.2 3.2 0 0 0-1.8-.7 1 1 0 0 0-.9.5c-.2.3-.2.6-.1 1s.6 1.2 1.6 2.2c1 1 1.6 1.9 2 2.5a3.9 3.9 0 0 1-.3 4.2 4.1 4.1 0 0 1-1.9 1.5 4 4 0 0 1-2.4.3c-.9-.2-1.8-.6-2.8-1.3-1.5-1-2.4-2.1-2.7-3.3a5.4 5.4 0 0 1 .6-4zm-11.6-7.6 2.5 1.3a3.4 3.4 0 0 0-.2 2.2 3 3 0 0 0 1.4 1.6c.8.5 1.4.7 2 .6.6 0 1-.3 1.3-.8a1.3 1.3 0 0 0 .2-.8c0-.3-.2-.7-.5-1a34.6 34.6 0 0 0-1.6-1.8c-1.1-1.1-1.8-2-2-2.8a3.7 3.7 0 0 1 .4-3.1 3.6 3.6 0 0 1 1.6-1.4 3.8 3.8 0 0 1 2.2-.3 7 7 0 0 1 2.6 1c1.5 1 2.4 2 2.7 3.1a4.1 4.1 0 0 1-.4 3.4l-2.5-1.4c.3-.7.4-1.2.2-1.7s-.6-1-1.3-1.4a3.2 3.2 0 0 0-1.9-.6 1 1 0 0 0-.8.5c-.2.3-.2.6-.1 1s.7 1.2 1.7 2.2c1 1 1.7 1.8 2 2.4a3.9 3.9 0 0 1 0 4.2 4.2 4.2 0 0 1-1.8 1.6 4 4 0 0 1-2.4.3 8 8 0 0 1-2.9-1.1 6 6 0 0 1-2.8-3.2 5.4 5.4 0 0 1 .4-4zm-14.2-3.8 7.3-12 8.8 5.5-1.2 2-6.4-4-1.6 2.7 6 3.7-1.3 2-6-3.7-2 3.3 6.7 4-1.2 2-9-5.5zm-20.7-17 1.1-2 5.4 2.7-2.5 5c-.8.2-1.8.3-3 .2a9.4 9.4 0 0 1-3.3-1 7.7 7.7 0 0 1-3-2.6 6 6 0 0 1-1-3.5 8.6 8.6 0 0 1 1-3.7 8 8 0 0 1 2.6-3 6.2 6.2 0 0 1 3.6-1.1c1 0 2 .3 3.2 1 1.6.7 2.6 1.7 3.1 2.8a5 5 0 0 1 .3 3.5l-2.7-.8a3 3 0 0 0-.2-2c-.3-.6-.8-1-1.6-1.4a3.8 3.8 0 0 0-3.1-.3c-1 .3-1.9 1.2-2.6 2.6-.7 1.4-1 2.7-.7 3.8a3.7 3.7 0 0 0 2 2.4c.5.3 1.1.5 1.7.5a6 6 0 0 0 1.8 0l.8-1.6-2.9-1.5zm-90.2-22.3 2-14 4.2.7 1.1 9.8 3.9-9 4.2.6-2 13.8-2.7-.4 1.7-10.9-4.4 10.5-2.7-.4-1.1-11.3-1.6 11-2.6-.4zm-14.1-1.7 1.3-14 10.3 1-.2 2.4-7.5-.7-.3 3 7 .7-.3 2.4-7-.7-.3 3.8 7.8.7-.2 2.4-10.6-1z"/>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="M216.5 191.3c0-1.5.3-2.6.7-3.6a6.7 6.7 0 0 1 1.4-1.9 5.4 5.4 0 0 1 1.8-1.2c1-.3 2-.5 3-.5 2.1 0 3.7.8 5 2a7.4 7.4 0 0 1 1.6 5.5c0 2.2-.7 4-2 5.3a6.5 6.5 0 0 1-5 1.7 6.6 6.6 0 0 1-4.8-2 7.3 7.3 0 0 1-1.7-5.3z"/>
-      <path fill="#f7ffff" d="M219.4 191.3c0 1.5.3 2.7 1 3.6.7.8 1.6 1.3 2.8 1.3a3.5 3.5 0 0 0 2.8-1.1c.7-.8 1-2 1.1-3.7 0-1.6-.2-2.8-1-3.6a3.5 3.5 0 0 0-2.7-1.3 3.6 3.6 0 0 0-2.8 1.2c-.8.8-1.1 2-1.2 3.6z"/>
-    </g>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="m233 198.5.2-14h6c1.5 0 2.5.2 3.2.5.7.2 1.2.7 1.6 1.3s.6 1.4.6 2.3a3.8 3.8 0 0 1-1 2.6 4.5 4.5 0 0 1-2.7 1.2l1.5 1.2c.4.4.9 1.2 1.5 2.3l1.7 2.8h-3.4l-2-3.2-1.4-2a2.1 2.1 0 0 0-.9-.6 5 5 0 0 0-1.4-.2h-.6v5.8H233z"/>
-      <path fill="#fff" d="M236 190.5h2c1.4 0 2.3 0 2.6-.2.3 0 .6-.3.8-.5s.3-.7.3-1c0-.6-.1-1-.4-1.2-.2-.3-.6-.5-1-.6h-2l-2.3-.1v3.5z"/>
-    </g>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="m249 185.2 5.2.3c1.1 0 2 .1 2.6.3a4.7 4.7 0 0 1 2 1.4 6 6 0 0 1 1.2 2.4c.3.9.4 2 .3 3.3a9.3 9.3 0 0 1-.5 3c-.4 1-1 1.8-1.7 2.4a5 5 0 0 1-2 1c-.6.2-1.5.2-2.5.2l-5.3-.3.7-14z"/>
-      <path fill="#fff" d="m251.7 187.7-.5 9.3h3.8c.5 0 .9-.2 1.2-.5.3-.3.6-.7.8-1.3.2-.6.4-1.5.4-2.6l-.1-2.5a3.2 3.2 0 0 0-.8-1.4 2.7 2.7 0 0 0-1.2-.7 13 13 0 0 0-2.3-.3h-1.3z"/>
-    </g>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="m317.6 210.2 3.3-13.6 4.4 1 3.2 1c.7.4 1.3 1 1.6 1.9.4.8.4 1.7.2 2.8-.2.8-.5 1.5-1 2a3.9 3.9 0 0 1-3 1.4c-.7 0-1.7-.2-3-.5l-1.7-.5-1.2 5.2-2.8-.7z"/>
-      <path fill="#fff" d="m323 199.6-.8 3.8 1.5.4c1 .2 1.8.4 2.2.3a1.9 1.9 0 0 0 1.6-1.5c0-.5 0-.9-.2-1.3a2 2 0 0 0-1-.9l-1.9-.5-1.3-.3z"/>
-    </g>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="m330.6 214.1 4.7-13.2 5.5 2c1.5.5 2.4 1 3 1.4.5.5.9 1 1 1.8s.2 1.5 0 2.3c-.4 1-1 1.7-1.8 2.2-.8.4-1.8.5-3 .3.4.5.8 1 1 1.6l.8 2.7.6 3.1-3.1-1.1-1-3.6a19.5 19.5 0 0 0-.7-2.4 2.1 2.1 0 0 0-.6-.8c-.2-.3-.6-.5-1.3-.7l-.5-.2-2 5.6-2.6-1z"/>
-      <path fill="#fff" d="m336 207.4 1.9.7c1.3.5 2.1.7 2.5.7.3 0 .6 0 .9-.3.3-.2.5-.5.6-.9.2-.4.2-.8 0-1.2a1.7 1.7 0 0 0-.8-.9l-2-.7-2-.7-1.2 3.3z"/>
-    </g>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="M347 213.6a9 9 0 0 1 1.7-3.2 6.6 6.6 0 0 1 1.8-1.5 6 6 0 0 1 2-.7c1 0 2 0 3.1.4a6.5 6.5 0 0 1 4.2 3.3c.8 1.6.8 3.5.2 5.7a7.4 7.4 0 0 1-3.4 4.5c-1.5.9-3.3 1-5.2.4a6.6 6.6 0 0 1-4.2-3.3 7.3 7.3 0 0 1-.2-5.6z"/>
-      <path fill="#fff" d="M349.8 214.4c-.4 1.5-.5 2.8 0 3.8s1.2 1.6 2.3 2c1 .3 2 .2 3-.4 1-.5 1.6-1.6 2.1-3.2.5-1.5.5-2.7 0-3.7a3.5 3.5 0 0 0-2.2-2 3.6 3.6 0 0 0-3 .3c-1 .6-1.7 1.6-2.2 3.2z"/>
-    </g>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="m374.3 233.1 6.4-12.4 5.3 2.7a10 10 0 0 1 2.7 1.9c.5.5.8 1.1.8 1.9s0 1.5-.4 2.2a3.8 3.8 0 0 1-2 2c-1 .2-2 .2-3.1-.2.4.6.6 1.2.8 1.7.2.6.3 1.5.4 2.8l.2 3.2-3-1.5-.4-3.7a20 20 0 0 0-.3-2.5 2 2 0 0 0-.5-1l-1.2-.7-.5-.3-2.7 5.2-2.5-1.3z"/>
-      <path fill="#fff" d="m380.5 227.2 1.9 1c1.2.6 2 1 2.3 1 .3 0 .7 0 1-.2.3-.1.5-.4.7-.8.2-.4.3-.8.2-1.2a2 2 0 0 0-.7-1 23.7 23.7 0 0 0-1.8-1l-2-1-1.6 3.2z"/>
-    </g>
-    <g stroke-opacity=".5">
-      <path fill="#309e3a" d="M426.1 258.7a8.9 8.9 0 0 1 2.5-2.6 6.6 6.6 0 0 1 2.2-.9 5.5 5.5 0 0 1 2.2 0c1 .2 1.9.6 2.8 1.2a6.6 6.6 0 0 1 3 4.4c.3 1.7-.2 3.6-1.4 5.5a7.3 7.3 0 0 1-4.5 3.3 6.5 6.5 0 0 1-5.2-1.1 6.6 6.6 0 0 1-3-4.4c-.3-1.8.2-3.6 1.4-5.4z"/>
-      <path fill="#fff" d="M428.6 260.3c-1 1.3-1.3 2.5-1.1 3.6a3.6 3.6 0 0 0 1.6 2.5c1 .7 2 .9 3 .6 1-.3 2-1 2.9-2.4.9-1.4 1.3-2.6 1.1-3.6-.1-1-.7-1.9-1.6-2.6s-2-.8-3-.5c-1 .2-2 1-3 2.4z"/>
-    </g>
-    <path fill="#309e3a" d="m301.8 204.5 2.3-9.8 7.2 1.7-.3 1.6-5.3-1.2-.5 2.2 4.9 1.1-.4 1.7-4.9-1.2-.6 2.7 5.5 1.3-.4 1.6-7.5-1.7z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/ca.svg b/inc/images/provisioning/flags/ca.svg
deleted file mode 100644
index f1b2c968..00000000
--- a/inc/images/provisioning/flags/ca.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ca" viewBox="0 0 640 480">
-  <path fill="#fff" d="M150.1 0h339.7v480H150z"/>
-  <path fill="#d52b1e" d="M-19.7 0h169.8v480H-19.7zm509.5 0h169.8v480H489.9zM201 232l-13.3 4.4 61.4 54c4.7 13.7-1.6 17.8-5.6 25l66.6-8.4-1.6 67 13.9-.3-3.1-66.6 66.7 8c-4.1-8.7-7.8-13.3-4-27.2l61.3-51-10.7-4c-8.8-6.8 3.8-32.6 5.6-48.9 0 0-35.7 12.3-38 5.8l-9.2-17.5-32.6 35.8c-3.5.9-5-.5-5.9-3.5l15-74.8-23.8 13.4c-2 .9-4 .1-5.2-2.2l-23-46-23.6 47.8c-1.8 1.7-3.6 1.9-5 .7L264 130.8l13.7 74.1c-1.1 3-3.7 3.8-6.7 2.2l-31.2-35.3c-4 6.5-6.8 17.1-12.2 19.5-5.4 2.3-23.5-4.5-35.6-7 4.2 14.8 17 39.6 9 47.7z"/>
-</svg>
diff --git a/inc/images/provisioning/flags/de.svg b/inc/images/provisioning/flags/de.svg
deleted file mode 100644
index b08334b6..00000000
--- a/inc/images/provisioning/flags/de.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-de" viewBox="0 0 640 480">
-  <path fill="#ffce00" d="M0 320h640v160H0z"/>
-  <path d="M0 0h640v160H0z"/>
-  <path fill="#d00" d="M0 160h640v160H0z"/>
-</svg>
diff --git a/inc/images/provisioning/flags/fr.svg b/inc/images/provisioning/flags/fr.svg
deleted file mode 100644
index 1be61911..00000000
--- a/inc/images/provisioning/flags/fr.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-fr" viewBox="0 0 640 480">
-  <g fill-rule="evenodd" stroke-width="1pt">
-    <path fill="#fff" d="M0 0h640v480H0z"/>
-    <path fill="#002654" d="M0 0h213.3v480H0z"/>
-    <path fill="#ce1126" d="M426.7 0H640v480H426.7z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/gb.svg b/inc/images/provisioning/flags/gb.svg
deleted file mode 100644
index dbac25ea..00000000
--- a/inc/images/provisioning/flags/gb.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-gb" viewBox="0 0 640 480">
-  <path fill="#012169" d="M0 0h640v480H0z"/>
-  <path fill="#FFF" d="m75 0 244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0h75z"/>
-  <path fill="#C8102E" d="m424 281 216 159v40L369 281h55zm-184 20 6 35L54 480H0l240-179zM640 0v3L391 191l2-44L590 0h50zM0 0l239 176h-60L0 42V0z"/>
-  <path fill="#FFF" d="M241 0v480h160V0H241zM0 160v160h640V160H0z"/>
-  <path fill="#C8102E" d="M0 193v96h640v-96H0zM273 0v480h96V0h-96z"/>
-</svg>
diff --git a/inc/images/provisioning/flags/hk.svg b/inc/images/provisioning/flags/hk.svg
deleted file mode 100644
index e32924f1..00000000
--- a/inc/images/provisioning/flags/hk.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-hk" viewBox="0 0 640 480">
-  <defs>
-    <clipPath id="a">
-      <path fill-opacity=".7" d="M-89 0h682.6v512H-89z"/>
-    </clipPath>
-  </defs>
-  <g clip-path="url(#a)" transform="translate(83.5) scale(.94)">
-    <path fill="#ba0000" fill-rule="evenodd" d="M618 512h-731.4V0H618z"/>
-    <path fill="#fff" fill-rule="evenodd" d="M241.9 247.8s-51.6-22.2-44.2-79.8c7.1-27.7 19.8-46.6 42.7-56.9 10.8-3.3 21.8-4.8 33-5.7-3 2.8-5.4 5.6-6.7 9-2.4 6.4-.6 12.4 2.7 18.5 4.1 7 6.6 14.2 7.4 23.6a36.6 36.6 0 0 1-14.6 33.7c-6.6 5.1-14.4 6.9-20.8 12.7-5 4.8-8 9.7-9 18.1-.2 16.1 4.1 18.4 9.5 26.8z"/>
-    <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="M232 164.5v-.3"/>
-    <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M235.3 241.8c-20-17.7-18.3-62.4-3-77.3"/>
-    <path fill="#ba0000" fill-rule="evenodd" d="m244.6 154.5 3.3 5.5-6-2.5-4.7 5 .8-6.5-6-2.5 6.5-1.5.8-6.4 3.3 5.5 6.6-1.5"/>
-    <path fill="#fff" fill-rule="evenodd" d="M246.3 244s6-55.9 63.3-65.7c28.6-1.2 50.4 5.3 67 24.3 6.3 9.3 10.9 19.4 15 29.8-3.5-2-6.8-3.5-10.6-3.7-6.7-.5-12 3-16.8 7.9a53.2 53.2 0 0 1-20.4 14 36.6 36.6 0 0 1-36.5-4c-6.8-4.9-10.8-11.8-18.2-16.2a28.2 28.2 0 0 0-20-3.4c-15.5 4.6-16.3 9.4-22.8 17z"/>
-    <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="M323 210.2h.3"/>
-    <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M250 236c11.2-24.4 54.4-35.8 73.1-25.6"/>
-    <path fill="#ba0000" fill-rule="evenodd" d="M336.3 219.3 332 224l.6-6.5-6-3 6.3-1 .6-6.7 3.4 6 6.4-1.2-4.3 4.7 3.3 6"/>
-    <path fill="#fff" fill-rule="evenodd" d="M250.1 248s55-12 82.4 39.3c10.3 26.7 11 49.4-1.7 71.1-6.8 9-15 16.5-23.5 23.8.8-4 1.1-7.6.1-11.2-1.6-6.6-6.6-10.5-12.8-13.5a53.1 53.1 0 0 1-19.8-15 36.6 36.6 0 0 1-7.7-35.8c2.4-8 7.7-14 9.5-22.4a28 28 0 0 0-3.1-20c-9.3-13.2-14.1-12.5-23.4-16.3z"/>
-    <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="m306.5 310.1.2.2"/>
-    <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M259 249c26.6 2.9 51.1 40.2 47.4 61.3"/>
-    <path fill="#ba0000" fill-rule="evenodd" d="m302.1 325.6-5.9-2.6 6.5-1.5.8-6.7 3.1 5.7 6.5-1.5-4.5 5 3 5.7-5.8-2.6-4.5 5.1"/>
-    <path fill="#fff" fill-rule="evenodd" d="M248.9 253.7s26.9 49.4-14.5 90c-22.8 17.4-44.4 24.5-68.8 18.4-10.5-4-20-9.7-29.5-15.9 4-.3 7.7-1 10.9-3 5.8-3.4 8.1-9.3 9.3-16a53 53 0 0 1 8.8-23.3 36.6 36.6 0 0 1 32.2-17.5c8.4.1 15.6 3.6 24.2 3 6.9-.9 12.3-2.8 18.4-8.8 10-12.5 8-17 9-27z"/>
-    <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="m205.1 325.3-.1.2"/>
-    <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M250.3 262.4c4.9 26.4-24.1 60.5-45.4 62.7"/>
-    <path fill="#ba0000" fill-rule="evenodd" d="m189 325.4.9-6.4 3.3 5.7 6.6-1-4.6 4.6 3.3 5.7-6.1-2.9-4.6 4.6.8-6.4-6.1-2.9"/>
-    <path fill="#fff" fill-rule="evenodd" d="M242.8 252.6S205.2 294.4 153 269c-24-15.7-37.8-33.8-40.1-58.8.3-11.3 2.4-22.1 5.1-33 1.7 3.6 3.6 6.8 6.5 9.2 5.1 4.3 11.5 4.5 18.3 3.4a52 52 0 0 1 24.7.6 36.6 36.6 0 0 1 27.3 24.6c2.7 7.9 1.8 15.9 5.3 23.8 3 6.2 6.6 10.6 14.3 14.4 15.2 5.3 18.7 1.9 28.4-.5z"/>
-    <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="m160.7 235.2-.2-.1"/>
-    <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M235 256.9c-23.2 13.3-65-2.7-74.2-22"/>
-    <path fill="#ba0000" fill-rule="evenodd" d="m155.3 220 6.3-1.3-4.3 5 3.1 5.9-5.8-2.8-4.3 5 .7-6.8-5.9-2.8 6.3-1.3.7-6.8"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/ie.svg b/inc/images/provisioning/flags/ie.svg
deleted file mode 100644
index 049be14d..00000000
--- a/inc/images/provisioning/flags/ie.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ie" viewBox="0 0 640 480">
-  <g fill-rule="evenodd" stroke-width="1pt">
-    <path fill="#fff" d="M0 0h640v480H0z"/>
-    <path fill="#009A49" d="M0 0h213.3v480H0z"/>
-    <path fill="#FF7900" d="M426.7 0H640v480H426.7z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/in.svg b/inc/images/provisioning/flags/in.svg
deleted file mode 100644
index 53c29b3a..00000000
--- a/inc/images/provisioning/flags/in.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-in" viewBox="0 0 640 480">
-  <path fill="#f93" d="M0 0h640v160H0z"/>
-  <path fill="#fff" d="M0 160h640v160H0z"/>
-  <path fill="#128807" d="M0 320h640v160H0z"/>
-  <g transform="matrix(3.2 0 0 3.2 320 240)">
-    <circle r="20" fill="#008"/>
-    <circle r="17.5" fill="#fff"/>
-    <circle r="3.5" fill="#008"/>
-    <g id="d">
-      <g id="c">
-        <g id="b">
-          <g id="a" fill="#008">
-            <circle r=".9" transform="rotate(7.5 -8.8 133.5)"/>
-            <path d="M0 17.5.6 7 0 2l-.6 5L0 17.5z"/>
-          </g>
-          <use xlink:href="#a" width="100%" height="100%" transform="rotate(15)"/>
-        </g>
-        <use xlink:href="#b" width="100%" height="100%" transform="rotate(30)"/>
-      </g>
-      <use xlink:href="#c" width="100%" height="100%" transform="rotate(60)"/>
-    </g>
-    <use xlink:href="#d" width="100%" height="100%" transform="rotate(120)"/>
-    <use xlink:href="#d" width="100%" height="100%" transform="rotate(-120)"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/jp.svg b/inc/images/provisioning/flags/jp.svg
deleted file mode 100644
index acc57aff..00000000
--- a/inc/images/provisioning/flags/jp.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-jp" viewBox="0 0 640 480">
-  <defs>
-    <clipPath id="a">
-      <path fill-opacity=".7" d="M-88 32h640v480H-88z"/>
-    </clipPath>
-  </defs>
-  <g fill-rule="evenodd" stroke-width="1pt" clip-path="url(#a)" transform="translate(88 -32)">
-    <path fill="#fff" d="M-128 32h720v480h-720z"/>
-    <circle cx="523.1" cy="344.1" r="194.9" fill="#d30000" transform="translate(-168.4 8.6) scale(.76554)"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/kh.svg b/inc/images/provisioning/flags/kh.svg
deleted file mode 100644
index 984e84e5..00000000
--- a/inc/images/provisioning/flags/kh.svg
+++ /dev/null
@@ -1,61 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-kh" viewBox="0 0 640 480">
-  <path fill="#032ea1" d="M0 0h640v480H0z"/>
-  <path fill="#e00025" d="M0 120h640v240H0z"/>
-  <g fill="#fff" stroke="#000" transform="matrix(1.2 0 0 1.2 85.6 -522)">
-    <g stroke-linejoin="bevel">
-      <path d="M139 623.5h113.8v43.8H139z"/>
-      <path d="M247 647.6h3.5v16.5H247zm-108-8.1h113.8v5H139zm0-7h113.8v4.6H139z"/>
-      <path stroke-width=".9" d="M139 625.7h113.8v4.3H139z"/>
-      <path d="M169 647.6h3.6v16.5H169zm49 0h3.6v16.5H218zm-78 0h3.5v16.5H140zm7 0h3.5v16.5H147zm7.5 0h3.5v16.5h-3.5zm7.5 0h3.5v16.5H162zm62.8 0h3.6v16.5h-3.6zm7.5 0h3.6v16.5h-3.6zm7.5 0h3.6v16.5h-3.6z"/>
-      <path stroke-linejoin="miter" d="M94.5 669.5a9.3 9.3 0 0 0 4.4-5.3H292a9.3 9.3 0 0 0 4.4 5.3z"/>
-    </g>
-    <path d="M193 556.8s-.1-4.1 2.3-4.2c2.3 0 2.2 4.2 2.2 4.2zm-12.5 54.5v-5.5c0-2.8-2.8-3-2.8-5 0 0-.4-3 .4-4.4 1.1 4 3 3.3 3 1.6 0-1.4-1-2.8-3.3-6.3-.8-1.1-.3-4.6.7-5.9.4 3 .9 4.5 2.2 4.5.8 0 1.4-.5 1.4-2 0-2-1.3-3-2-4.8a5 5 0 0 1 1.1-5.3c.5 3 .4 4.2 1.7 4.2 2.7-.9 0-4.8-.6-5.8-.6-1.1 1-3.4 1-3.4.8 2.7 1 2.9 2 2.6 1.2-.3 1-2-.4-3.4-.9-1-.8-2.3.2-3.3 1 1.9 2.2 1.8 2.3.6l-.8-4.4H204l-.9 4.3c-.2 1.2 1.4 1.5 2.4-.5 1 1 1.1 2.4.2 3.3-1.4 1.4-1.6 3.1-.4 3.4 1 .3 1.2 0 2-2.6 0 0 1.5 1.5 1 3.4-.6 1-3.3 5-.6 5.8 1.3 0 1.2-1.2 1.7-4.2a5 5 0 0 1 1 5.3c-.6 1.8-2 2.8-2 4.8 0 1.5.7 2 1.5 2 1.3 0 1.8-1.4 2.2-4.5 1 1.3 1.5 4.8.7 6-2.3 3.4-3.4 4.8-3.4 6.2 0 1.7 2 2.4 3-1.6.9 1.4.5 4.4.5 4.4 0 2-2.7 2.2-2.8 5v5.5zm7.2-46-.4-3.1h15.9l-.4 3.1zm1-3.2-.2-2.5H202l-.3 2.5zm2.3-2.6-.3-2.6h9l-.1 2.6zm33 110c-2-.7-5-2.9-5-5v-24.3l2.6-3.4H169l2.5 3.4v24.3c0 2.1-2 4.3-4 5z"/>
-    <path stroke-linejoin="bevel" d="M178.2 647.6h3.6v16.5h-3.6zm30.4 0h3.6v16.5h-3.6z"/>
-    <path d="M168 609.2v27.6h54v-27.6a4.2 4.2 0 0 0-2.6 2.8v11.8h-48.7V612s-.6-2-2.8-2.8z"/>
-    <path d="M214.6 669.5c-1.8-.7-5.6-2.9-5.6-5v-27.2c.4-1.5 2.4-2.4 3.7-3.4H177c1.7 1 3.6 1.7 4.3 3.4v27.2c0 2.1-3 4.3-4.8 5z"/>
-    <path d="M219.4 634.2v-19.6h-4.9v-1.9h-38.8v2h-5v19.5zM207 669.5c-1.8-.7-4.3-2.9-4.3-5v-23.2l1.4-2.1h-17.7l1.5 2v23.3c0 2.1-2.6 4.3-4.3 5z"/>
-    <path d="M190.7 639.2h9v30.3h-9z"/>
-    <path stroke-linejoin="bevel" d="M204.4 632.5c0-2 5.8-2.1 8.8-3.8h-36c3 1.7 8.7 1.8 8.7 3.8l1.2 3.9 15 .6z"/>
-    <path d="M211.4 611.3c0-4.9.2-6.7 1.7-6.7V620c-3.7 1.4-6.3 6-6.3 6h-23.2s-2.6-4.6-6.3-6v-15.5c1.8 0 1.8 2 1.8 6.7zm1.7-2c0-5.6 4.9-6.2 4.9-6.2v5c-1.9-.1-2.8 1.6-2.8 4 0 2.5 1.5 2.5 1.5 2.5v14.2h-3.6z"/>
-    <path d="M177.3 609.3c0-5.6-4.9-6.2-4.9-6.2v5c1.9-.1 2.8 1.6 2.8 4 0 2.5-1.5 2.5-1.5 2.5v14.2h3.6z"/>
-    <g fill="none" stroke-width=".8">
-      <path d="M186.8 570.6H204m-19.2 5.4h21m-23 6.5h24.9m-27 7.9h29.5m-30.2 9h30.4"/>
-      <path stroke-width="1" d="M170.8 629h48.6m-33.2 0h18v6.6h-18z"/>
-    </g>
-    <path d="M184 614.2c3 3.6 2.6 9.7 2.6 13.3H204c0-3.6-.4-9.7 2.6-13.3zm9.7-41-2.4-1.3v-3.5c1 .3 2 .4 2.2 2 .3-2.3 1-2.1 1.9-3 1 .9 1.5.7 1.9 3 0-1.6 1.2-1.7 2.1-2v3.5l-2.3 1.2z"/>
-    <path d="m193.5 578.9-4-2.8V573c1.5.3 3 .5 3.2 2.2.4-2.5 1.3-3.7 2.7-4.7 1.3 1 2.2 2.2 2.7 4.7.1-1.7 1.7-1.9 3-2.2v3.2l-3.9 2.7z"/>
-    <path d="m193.2 587.8-4.5-4v-4.7c1.6.4 3.4.6 3.6 3.1.5-3.5 1.5-5.4 3-6.8 1.6 1.4 2.6 3.3 3.2 6.8.2-2.5 2-2.7 3.6-3.1v4.7l-4.6 4zm8.4 5.3-4 5.7h-4.7l-4.1-5.7zm-15.2 9.5c2 1.1 2.8 3.4 3 7.6H201c.2-4.2 1-6.5 3-7.6z"/>
-    <path stroke-linejoin="bevel" d="M204.2 593v-5.6a5.2 5.2 0 0 0-3.8 3.3c0-2-2.5-6.3-5.2-8.5-2.7 2.4-5.3 6.4-5.2 8.4-.5-1.5-1.8-2.7-3.8-3.2v5.7z"/>
-    <path stroke-linejoin="bevel" d="M205 602.6V597c-2.1.6-3.5 1.7-4.1 3.3 0-2-2.7-6.3-5.7-8.5-3 2.5-5.8 6.4-5.7 8.5-.5-1.5-2-2.7-4.1-3.3v5.7z"/>
-    <path stroke-linejoin="bevel" d="M207.4 614.3v-6.6a9.6 9.6 0 0 0-5.1 3.8c0-3.5-4-9-7.1-10.7-3.2 1.8-7.1 7.4-7.1 10.7a9.7 9.7 0 0 0-5.2-3.8v6.6z"/>
-    <path stroke-linejoin="bevel" d="M206 629v-6.8c-2.4.9-3 3.1-3.8 4.7.3-6.9-3.8-14.2-7-16.1-3.2 1.9-7.4 9.4-7 16-.8-1.4-1.5-3.7-3.8-4.6v6.7z"/>
-    <path d="M204.4 639.2v-6.8c-2.5.6-2.6 1.5-3.4 3 .3-4.1-2.6-8.8-5.8-10.6-3.2 1.8-6 6.5-5.8 10.6-.8-1.5-.9-2.4-3.4-3v6.8z"/>
-    <g id="a">
-      <path d="M99 664.2v-20.4c-.7-2.6-3-5-4.6-5.4v-18l3.7 2 4.3 18.9v23z"/>
-      <path d="M99 664.3v-20.5c-.7-2.6-3-5-4.6-5.4v-19.2c2.5 0 3.7 3.2 3.7 3.2l4.3 18.9v22.9z"/>
-      <path d="M96.3 669.5c1.7-.7 4.2-2.9 4.2-5v-25.6l-1.2-2H143l-1.7 2v25.6a6 6 0 0 0 3.4 5z"/>
-      <path d="M135.8 669.5c-1.7-.7-4.2-2.9-4.2-5v-24.3l3.6-3.4h-29.6l3.6 3.4v24.3c0 2.1-2.5 4.3-4.2 5z"/>
-      <path d="M131.7 669.5c-1.7-.7-4.3-2.9-4.3-5v-22l2.4-3.3H111l2.4 3.3v22c0 2.1-2.5 4.3-4.3 5z"/>
-      <path d="M116 639.2h8.9v30.4h-9z"/>
-      <path stroke-linejoin="bevel" d="M103.7 647.6h3.6v16.5h-3.6zm30.8 0h3.5v16.5h-3.6zm-33.9-27.8h4.4v17h-4.4zm0-3.2h4.3v3.2h-4.3zm35.6 6.9h6.1v13h-6.1z"/>
-      <path d="M104.9 636.6v-29c1.2 0 1.4 4.3 4.2 4.3 1.5 0 1.4-1.8.5-3.2-.7-1.3-1.6-3-.4-6.3.9 2.5 3.1 3.3 2.7 1.8-.7-2.7-2.8-3.2-1.2-7.3.5 3.4 2.7 3.3 2.2 1.3-.6-2.3-1.9-3.3-.3-6.5.9 3.7 2 3.5 2 1.2 0-3.4 0-7 4.2-8.3 0 0 .3-3 1.9-3 1.5 0 1.8 3 1.8 3 4.3 1.3 4.2 5 4.2 8.3 0 2.3 1.1 2.5 2-1.2 1.6 3.2.3 4.2-.3 6.5-.5 2 1.7 2.1 2.2-1.3 1.6 4.1-.5 4.6-1.2 7.3-.4 1.5 1.8.7 2.7-1.8 1.2 3.3.3 5-.4 6.3-.8 1.4-1 3.2.5 3.2 2.8 0 3-4.2 4.2-4.2v28.9zM98 614.7v22.1h2.5v-22.1c-.9-.5-1.7-.5-2.5 0z"/>
-      <path d="M98.2 629c3.1 1.6 6.2 3.5 7 7.8h-7zm43.2-6.6v14.4h2v-14.4c-.6-.3-1.5-.4-2 0z"/>
-      <path d="M143.4 629c-3.1 1.5-6.2 3.3-7 7.7h7zm-20.6-33.7 1.8-1.5v-2c-.6 0-1 .3-1.5 1a5 5 0 0 0-2.5-3 5 5 0 0 0-2.6 2.9c-.5-.7-.8-.8-1.5-1v2l1.8 1.6z"/>
-      <path d="m123.8 600.2.8-1.9v-2.5c-.6 0-1 .3-1.5 1a5 5 0 0 0-2.5-3 5 5 0 0 0-2.6 2.9c-.5-.7-.8-.8-1.5-.9v2.5l.8 1.9z"/>
-      <path d="m124 606.8 2.6-3.3v-3.2c-1 0-1.5.5-2.2 1.6-.7-2.3-2-2.7-3.8-3.8-1.9 1-3.2 1.5-3.8 3.7-.8-1.1-1.3-1.4-2.3-1.5v3.2l2.7 3.3z"/>
-      <path d="M124.7 613.3s3.2-2.7 3.3-4.2v-3.5c-1.2.1-2.3.4-3.2 1.9-.8-2.9-2-3.7-4.2-5-2.3 1.3-3.5 2.1-4.2 5-1-1.5-2-1.8-3.3-2v3.6a15 15 0 0 0 3.3 4.2z"/>
-      <path d="M126 625.3s4.4-4.7 4.5-6.6v-5.4c-1.6.2-3.2 1.3-4.4 3.6-1-4.5-2.6-7.6-5.5-9.8-3 2.2-4.6 5.3-5.6 9.8-1.2-2.3-2.7-3.4-4.3-3.6v5.4c.3 1.9 4.4 6.6 4.4 6.6z"/>
-      <path d="M126 632.4s3.7-3.7 4.5-5.3v-5.4c-1.6.2-3.2 1.3-4.4 3.5a14 14 0 0 0-5.5-9.2c-3 2.2-4.6 4.7-5.6 9.2-1.2-2.2-2.7-3.3-4.3-3.5v5.4c1 1.6 4.4 5.3 4.4 5.3z"/>
-      <path d="M127.5 636.6c-1-4.7-2-8.2-7.1-11.7-5.2 3.5-6.1 7-7.2 11.7z"/>
-      <path d="M130.2 639.2v-6.8c-2.4 1-4.5 2.3-5.3 3.8-.8-3.8-2.5-5.4-4.6-7.7-2.1 2.3-3.5 4-4.4 7.7-.8-1.5-2.9-2.9-5.2-3.8v6.8z"/>
-    </g>
-    <use xlink:href="#a" width="100%" height="100%" transform="matrix(-1 0 0 1 390.7 0)"/>
-    <path d="M72.7 694.3H318v12.5H72.7zm-6.5 12.5h258.3v12.5H66.2zm19.4-31.3H305v8.1H85.6z"/>
-    <path d="M79.2 683.6h232.4v10.6H79.2zm10.2-14.3h212v6.2h-212z"/>
-    <path d="M112.4 669.3h16v50h-16z"/>
-    <path d="M116 669.3h8.9v50h-9zm71 0h16v50h-16z"/>
-    <path d="M190.7 669.3h9v50h-9zm71.5 0h16v50h-16z"/>
-    <path d="M265.7 669.3h9v50h-9z"/>
-    <path fill="none" d="M99 664.2h193M115.8 713h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m65.8 37.5h8.6m-8.6-6.3h8.6m-8.6-6.2h8.6m-8.6-6.3h8.6m-8.6-6.2h8.6m-8.6-6.3h8.6m-8.6-6.2h8.6m66.2 37.5h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/kr.svg b/inc/images/provisioning/flags/kr.svg
deleted file mode 100644
index 39fa999e..00000000
--- a/inc/images/provisioning/flags/kr.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-kr" viewBox="0 0 640 480">
-  <defs>
-    <clipPath id="a">
-      <path fill-opacity=".7" d="M-95.8-.4h682.7v512H-95.8z"/>
-    </clipPath>
-  </defs>
-  <g fill-rule="evenodd" clip-path="url(#a)" transform="translate(89.8 .4) scale(.9375)">
-    <path fill="#fff" d="M-95.8-.4H587v512H-95.8Z"/>
-    <g transform="rotate(-56.3 361.6 -101.3) scale(10.66667)">
-      <g id="c">
-        <path id="b" d="M-6-26H6v2H-6Zm0 3H6v2H-6Zm0 3H6v2H-6Z"/>
-        <use xlink:href="#b" width="100%" height="100%" y="44"/>
-      </g>
-      <path stroke="#fff" d="M0 17v10"/>
-      <path fill="#cd2e3a" d="M0-12a12 12 0 0 1 0 24Z"/>
-      <path fill="#0047a0" d="M0-12a12 12 0 0 0 0 24A6 6 0 0 0 0 0Z"/>
-      <circle cy="-6" r="6" fill="#cd2e3a"/>
-    </g>
-    <g transform="rotate(-123.7 191.2 62.2) scale(10.66667)">
-      <use xlink:href="#c" width="100%" height="100%"/>
-      <path stroke="#fff" d="M0-23.5v3M0 17v3.5m0 3v3"/>
-    </g>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/kz.svg b/inc/images/provisioning/flags/kz.svg
deleted file mode 100644
index 64776c38..00000000
--- a/inc/images/provisioning/flags/kz.svg
+++ /dev/null
@@ -1,23 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-kz" viewBox="0 0 640 480">
-  <g fill-rule="evenodd">
-    <path fill="#00abc2" d="M0 0h640v480H0z"/>
-    <g fill="#ffec2d">
-      <path d="M60.2 467c3.3 3.2 2.2 8.5 11.3 7.8 13.8 0 14.2-8.4 14.2-14.3S65 446.4 64 437.7c-1-8.7 4.8-11 9.6-11 4.7 0 8 2.7 8 5.1S79.4 435 76 435s1.5-1.7-1.4-3-4.8 2-4.8 4c0 2.2 7.2 2.8 12 1.3 1 4.7 1.4 5-5.3 13 4.8-3.1 5.2-3.8 10.5-2-5.3-4.6-1.3-13.8-1.2-16.1s-1-5.1-3-6.5c-3.9-3.5-12.2-3.7-17.2-1.4-7.3 3.2-7.7 12.8-5.8 16L80 460.7c1.4 2.4 2 9.2-6.6 9.5-9 .7-12.2-11.6-13.8-15.7-2.1 4.5-4.5 16.8-13.6 16.1-8.6-.3-10.2-7-8.8-9.5l20.7-21c2-3.2 1.6-12.8-5.7-16-5-2.3-13.3-2-17.1 1.4-2.2 1.4-3.4 4.1-3.2 6.5s4.1 11.5-1.1 16c5.2-1.7 5.7-1 10.5 2-6.7-7.9-6.2-8.2-5.3-13 4.8 1.6 12 1 12-1.1s-2-5.6-4.9-4.2c-2.8 1.4 2 3.1-1.4 3.1-3.3 0-5.7-.7-5.7-3s3.3-5.3 8.1-5.3 10.5 2.4 9.5 11.1-22 18.1-22 24c0 6 1.4 13.1 15.2 13.1 9 .7 10.1-4.6 13.4-7.8z"/>
-      <path d="M59.1 343.3c3.3-3.2 6-12.6 15-12 13.8 0 19 7.7 19 13.6 0 5.9-28 54-29 62.7-1 8.7 4.8 11.1 9.5 11.1 4.8 0 8.1-2.7 8.1-5.2s-2.4-3-5.7-3 1.4 1.7-1.4 3-4.8-2-4.8-4.1c0-2.1 7.2-2.8 12-1.2.9-4.7 1.3-5-5.3-13 4.8 3 5.2 3.8 10.5 2-5.3 4.6-1.4 13.7-1.2 16s-1 5.2-3.1 6.6c-3.8 3.5-12.2 3.6-17.2 1.4-7.2-3.3-7.6-12.8-5.7-16L87 346.6c1.5-2.4-2.3-10.4-10.9-10.7-9-.7-12.1 8.8-13.7 12.9l12.3-1s.5 2 0 3.2a110 110 0 0 0-12.3 1.6l-.5 6.2h6l-.4 2.8s-5.1-.4-5.6 0c-.5.3-1 6.2-1 6.2s-1 .4-2 .4-2-.4-2-.4-.4-5.9-.9-6.2c-.5-.4-5.6 0-5.6 0l-.5-2.8H56l-.5-6.2s-6-1.2-12.3-1.6c-.4-1.2 0-3.1 0-3.1l12.3.9c-1.6-4.1-4.7-13.6-13.7-13-8.6.4-12.4 8.4-11 10.8L58 405.2c1.9 3.1 1.5 12.7-5.7 16-5 2.2-13.4 2-17.2-1.4-2.1-1.4-3.3-4.2-3.1-6.5s4-11.6-1.2-16c5.3 1.7 5.8 1 10.5-2.1-6.6 8-6.2 8.3-5.2 13 4.7-1.6 11.9-1 11.9 1.2 0 2-2 5.5-4.8 4.1-2.8-1.4 2-3-1.4-3-3.3 0-5.7.6-5.7 3s3.3 5.2 8 5.2 10.5-2.4 9.6-11c-1-8.7-29-57-29-62.8 0-6 5.2-13.5 19-13.5 9-.7 12.3 8.7 15.5 11.9z"/>
-      <path d="M59.1 319.4c3.3 3.2 6 12.6 15 12 13.8 0 19-7.7 19-13.6 0-5.9-28-54-29-62.7-1-8.7 4.8-11.1 9.5-11.1 4.8 0 8.1 2.7 8.1 5.2s-2.4 3-5.7 3 1.4-1.6-1.4-3-4.8 2-4.8 4.1c0 2.1 7.2 2.8 12 1.2.9 4.7 1.3 5-5.3 13 4.8-3 5.2-3.8 10.5-2-5.3-4.6-1.4-13.7-1.2-16s-1-5.2-3.1-6.6c-3.8-3.4-12.2-3.6-17.2-1.4-7.2 3.3-7.6 12.8-5.7 16L87 316c1.5 2.4-2.3 10.4-10.9 10.7-9 .7-12.1-8.8-13.7-12.9l12.3 1s.5-2 0-3.2a110 110 0 0 1-12.3-1.6l-.5-6.2h6l-.4-2.8s-5.1.4-5.6 0c-.5-.3-1-6.2-1-6.2s-1-.4-2-.4-2 .4-2 .4-.4 5.9-.9 6.2c-.5.4-5.6 0-5.6 0l-.5 2.8H56l-.5 6.2s-6 1.2-12.3 1.6c-.4 1.2 0 3.1 0 3.1l12.3-.9c-1.6 4.1-4.7 13.6-13.7 13-8.6-.4-12.4-8.4-11-10.8L58 257.5c1.9-3.2 1.5-12.7-5.7-16-5-2.2-13.4-2-17.2 1.4-2.1 1.4-3.3 4.2-3.1 6.5s4 11.5-1.2 16c5.3-1.7 5.8-1 10.5 2.1-6.6-8-6.2-8.3-5.2-13 4.7 1.6 11.9 1 11.9-1.2 0-2-2-5.5-4.8-4.1-2.8 1.4 2 3-1.4 3-3.3 0-5.7-.6-5.7-3s3.3-5.2 8-5.2 10.5 2.4 9.6 11c-1 8.7-29 57-29 62.8 0 6 5.2 13.5 19 13.5 9 .7 12.3-8.7 15.5-11.9z"/>
-      <path d="M59.1 160.6c3.3-3.2 6-12.6 15-12 13.8 0 19 7.7 19 13.6 0 5.9-28 54-29 62.8-1 8.6 4.8 11 9.5 11 4.8 0 8.1-2.7 8.1-5.1s-2.4-3.2-5.7-3.2 1.4 1.8-1.4 3.2-4.8-2.1-4.8-4.2c0-2 7.2-2.8 12-1.2.9-4.7 1.3-5-5.3-13 4.8 3.1 5.2 3.8 10.5 2-5.3 4.6-1.4 13.8-1.2 16s-1 5.2-3.1 6.6c-3.8 3.5-12.2 3.6-17.2 1.4-7.2-3.3-7.6-12.8-5.7-16L87 164c1.5-2.4-2.3-10.4-10.9-10.7-9-.7-12.1 8.8-13.7 12.9l12.3-1s.5 2 0 3.2c-6.4.4-12.3 1.6-12.3 1.6l-.5 6.2h6l-.4 2.8s-5.1-.3-5.6 0-1 6.3-1 6.3-1 .3-2 .3-2-.3-2-.3-.4-6-.9-6.3c-.5-.3-5.6 0-5.6 0l-.5-2.8H56l-.5-6.2s-6-1.2-12.3-1.6c-.4-1.2 0-3.1 0-3.1l12.3.9c-1.6-4.1-4.7-13.6-13.7-13-8.6.4-12.4 8.4-11 10.8L58 222.5c1.9 3.2 1.5 12.7-5.7 16-5 2.2-13.4 2-17.2-1.4-2.1-1.4-3.3-4.2-3.1-6.5s4-11.5-1.2-16c5.3 1.7 5.8 1 10.5-2.1-6.6 8-6.2 8.3-5.2 13 4.7-1.6 11.9-.9 11.9 1.2 0 2-2 5.5-4.8 4.1-2.8-1.3 2-3-1.4-3-3.3 0-5.7.6-5.7 3s3.3 5.2 8 5.2 10.5-2.4 9.6-11c-1-8.7-29-56.9-29-62.8 0-5.9 5.2-13.5 19-13.5 9-.7 12.3 8.7 15.5 12z"/>
-      <path d="M59.1 136.7c3.3 3.2 6 12.7 15 12 13.8 0 19-7.7 19-13.6 0-5.9-28-54-29-62.7-1-8.7 4.8-11.1 9.5-11.1 4.8 0 8.1 2.8 8.1 5.2s-2.4 3.1-5.7 3.1 1.4-1.7-1.4-3.1-4.8 2-4.8 4.1c0 2.1 7.2 2.8 12 1.2.9 4.7 1.3 5-5.3 13 4.8-3 5.2-3.8 10.5-2-5.3-4.5-1.4-13.7-1.2-16s-1-5.2-3.1-6.6c-3.8-3.4-12.2-3.6-17.2-1.3-7.2 3.2-7.6 12.8-5.7 15.9L87 133.4c1.5 2.4-2.3 10.4-10.9 10.8-9 .6-12.1-8.8-13.7-13l12.3 1s.5-2 0-3.2a111.5 111.5 0 0 1-12.3-1.5l-.5-6.3h6l-.4-2.8s-5.1.4-5.6 0c-.5-.3-1-6.2-1-6.2s-1-.4-2-.4-2 .4-2 .4-.4 5.9-.9 6.2c-.5.4-5.6 0-5.6 0l-.5 2.8H56l-.5 6.3s-6 1.1-12.3 1.5c-.4 1.3 0 3.2 0 3.2l12.3-1c-1.6 4.2-4.7 13.6-13.7 13-8.6-.4-12.4-8.4-11-10.8L58 74.8c1.9-3.1 1.5-12.7-5.7-16-5-2.2-13.4-2-17.2 1.4-2.1 1.4-3.3 4.2-3.1 6.5s4 11.6-1.2 16c5.3-1.7 5.8-1 10.5 2.1-6.6-8-6.2-8.3-5.2-13 4.8 1.6 11.9 1 11.9-1.2 0-2-2-5.5-4.8-4.1-2.8 1.4 2 3.1-1.4 3.1-3.3 0-5.7-.7-5.7-3.1s3.3-5.2 8-5.2 10.6 2.4 9.6 11c-1 8.7-29 57-29 62.8 0 6 5.2 13.6 19 13.6 9 .7 12.3-8.8 15.5-12z"/>
-      <path d="M60.2 13c3.3-3.2 2.2-8.5 11.3-7.8 13.8 0 14.2 8.4 14.2 14.3S65 33.6 64 42.3c-1 8.7 4.8 11 9.6 11 4.7 0 8-2.7 8-5.1S79.4 45 76 45s1.5 1.7-1.4 3-4.8-2-4.8-4c0-2.2 7.2-2.9 12-1.3 1-4.7 1.4-5-5.3-13 4.8 3.1 5.2 3.8 10.5 2-5.3 4.6-1.3 13.8-1.2 16.1s-1 5.1-3 6.5c-4 3.7-12.3 3.7-17.3 1.5-7.3-3.2-7.7-12.8-5.8-16L80 19.3c1.4-2.4 2-9.2-6.6-9.5-9-.7-12.2 11.6-13.8 15.7C57.5 21 55.1 8.6 46 9.3c-8.6.3-10.2 7-8.8 9.5l20.7 21c2 3.2 1.6 12.8-5.7 16-5 2.3-13.3 2.1-17.1-1.4-2.2-1.4-3.4-4.1-3.2-6.5s4.1-11.5-1.1-16c5.2 1.7 5.7 1 10.4-2-6.6 7.9-6.1 8.2-5.2 13 4.8-1.6 12-1 12 1.1s-2 5.6-4.9 4.2c-2.8-1.4 2-3.1-1.4-3.1-3.3 0-5.7.7-5.7 3s3.3 5.3 8.1 5.3 10.5-2.4 9.5-11.1-22-18.1-22-24c0-6 1.4-13.1 15.2-13.1 9-.7 10.1 4.6 13.4 7.8z"/>
-    </g>
-    <g fill="#ffec2d" transform="translate(-194.7 8.3) scale(1.0673)">
-      <rect width="170.2" height="161.3" x="425.9" y="104.5" rx="85.1" ry="80.7"/>
-      <path d="M507 56.4c-.8 0-4.6 26.8-6 32.8-1.4 13.5 18 13 14.8-.5L507 56.3zm6.8 259.8c.7 0 6.5-26.5 8.4-32.4 2.3-13.3-17.1-14-15-.4l6.6 32.8zM378.2 184.6c0 .7 27.9 6.3 34.1 8.1 14 2.3 15-16 .6-14l-34.7 6zm271.7 3.2c0-.7-28.2-5.3-34.5-6.9-14.1-1.7-14.2 16.6 0 14.1l34.5-7.2zM406.8 99.6c-.5.5 17.9 21.3 21.6 26.4 9.6 10 22.3-4 9.6-10.8l-31.2-15.5zm211.1 171c.5-.5-19.7-19.7-23.9-24.4-10.5-9.2-21.8 5.7-8.6 11.5l32.5 13zm-169-200c-.6.3 8 26.1 9.4 32.2 4.8 12.7 22.2 4.4 13.2-6.5L449 70.6zM572 303c.7-.3-6-26.6-6.9-32.7-3.9-13-21.8-6-13.7 5.6l20.7 27zm30.3-214.4c-.6-.5-22.8 16.6-28.2 20-10.7 9 3.8 21.2 11.2 9.3l17-29.3zm-183 193.7c.5.5 24-15 29.6-18.1 11.3-8.2-2.2-21.4-10.5-10l-19 28.1zm-35-144.1c-.3.6 24 14.7 29.3 18.4 12.5 6.5 19.8-10.5 5.5-13.2l-34.8-5.2zM638 236.6c.3-.6-23-16.3-28-20.3-12-7.4-20.5 9.1-6.4 12.7l34.4 7.6zM557.4 63.7c-.7-.2-14.6 23.4-18.3 28.5a7.8 7.8 0 0 0 14 4.7l4.3-33.2zM463.5 308c.7.3 16.3-22.4 20.3-27.3 7.3-11.6-10.4-19-13.7-5.6l-6.6 32.9zM386 238.7c.3.6 28-6 34.5-7 13.6-3.8 6-20.6-6-12.8L386 238.7zM638.1 136c-.2-.6-28.3 4.1-34.8 4.7-14 2.9-7.5 20.2 5 13.2l29.8-17.9z"/>
-      <path d="M534.6 58.1c-.7-.1-10.1 25.4-12.9 31-4.1 13 15 16.2 14.7 2.4L534.7 58zM486.1 314c.7.2 12-24.7 15.2-30.2 5-12.6-13.8-17-14.5-3.3L486 314zm-9.7-253.4c-.7.2 1.9 27.2 1.9 33.4 1.9 13.3 20.6 8.7 14.4-3.7l-16.3-29.7zm68 251.9c.7-.1 0-27.2.5-33.4-.9-13.5-20-10.1-14.6 2.7l14 30.7zM428.2 83c-.6.4 12.7 24.3 15.2 30 7.2 11.7 22.7.7 11.8-8.6l-27-21.4zM593 290.9c.6-.4-11-25.2-13-31-6.3-12.1-22.5-2.1-12.4 7.8l25.4 23.2zM393 116.6c-.4.6 21.1 18.4 25.6 23 11.1 8.4 21.4-7.2 7.8-12.1L393 116.6zm234.2 139.7c.4-.6-19.7-19.8-23.9-24.6-10.4-9.1-21.8 5.8-8.6 11.6l32.5 13zm-249.6-97.8c-.2.7 26.3 10.8 32.1 13.7 13.4 4.5 17.7-13.4 3.1-13.8l-35.2.1zM645 216.3c.3-.6-25.4-12.4-31-15.7-13-5.4-18.7 12.2-4.2 13.6l35.2 2.1zM376.7 210c.1.6 28.7.2 35.2.7 14.2-.7 10.8-18.8-2.8-13.9L376.7 210zm270.2-45c0-.7-28.6-2.2-35-3.1-14.3-.2-12.2 18.1 1.7 14l33.3-11zm-245.7 98.4c.4.6 26-11.6 32-13.9 12.4-6.5 1-21.4-8.9-11.3l-23.1 25.2zm222.3-152.3c-.4-.6-26.7 9.9-33 11.8-12.9 5.7-2.6 21.3 8 11.9l25-23.7zM442.8 298.8c.6.3 18.9-20.5 23.5-24.9 8.7-10.7-8-20-12.9-7l-10.6 31.9zM582.5 75c-.5-.4-20.3 19.1-25.2 23.2-9.4 10.1 6.6 20.5 12.4 7.9L582.4 75z"/>
-      <g transform="matrix(2.1824 0 0 2.0629 -405 -272.6)">
-        <path d="M360.1 247.9c.7 2.5.8 16.5 14.9 30 14 13.4 38 16.4 38 16.4s.1 1.9-1.6 2c-1.7.2-9.9-1.5-14-2.8-4-1.2-7.6-3.4-8-3.3-.5.2-1.3 1.6-2.5 1.4s-7-6.2-9.6-7.8a80.6 80.6 0 0 1-13.7-15.3c-2.8-4.5-3.5-7.5-4.4-7.5s-4.2 2.2-4.2 2.2-3-4.5-5.6-11.7c-2.7-7.2-2.4-11.4-1.8-11.7.7-.3.7 5.3 2.7 10.4 2 5.2 4.8 6.8 4.8 6.8s-1.8-2.7-3.2-9.4-2-13.2-1-15.2 1.9-2.6 2-2.5c.2.2-1.7 3.1-.4 10.8s4.8 14.2 5.6 13.9c.8-.3-.5-1.9-1-6.4s.5-7.3 1.6-7.7c.5-.4 1.3 5 1.4 7.4zm-9.8 12.8c-2.7-2.5-6.9-11.2-7.8-10.8-1 .5 6.8 13 7 14 .2 1.2 1.9 4.6.6 4.1s-10.6-10.3-9.5-8.4 8.1 10.5 7.7 11-5.8-4.8-6-4.1c-.1.6 5.3 5.8 5.2 6.4s-3.5-3.3-3.5-2.5 3.5 4.7 3.5 5.3-3-2.8-2-1c.9 2 3.5 3.7 3.4 4.3s-2.2-.8-2.2-.5c0 .3 3.9 1.7 4.8 2.8 1 1.1 7.4 8.5 12.2 12.2s18.6 10.2 19.6 10.2c.9 0 2.3-2 2-2.8-.3-.8-13.8-5.4-17.5-8.8-3.8-3.4-13-11.6-13.8-12-.7-.5-2.8-.3-2.8-.8s2.7.3 2.5 0c-.1-.3-3.7-1.9-3.6-2.2.2-.3 2.5.6 2.5.3s-4.2-2.6-4-3.1c.1-.5 3.1 1.4 3.1 1 0-.2-4-3-3.9-3.5.1-.5 3.1 2.2 3 1.6s-2.4-4-2.4-4.4c0-.5 3.6 3.4 4 2.6.2-.7-1.3-7.2-1.2-7.3s2.7 1.4 3.1.5c.5-1-1.8-2.3-4-4.1zm46.1 49.2c-1.9.3-2.8-.4-1.7-2 1.5 0 5.5-1.3 6.9-1.9s2.9-1.4 4.1-2.5c1.2-1.3 2 .7 1.3 1.8-.5.7-2.8 2-4.5 2.7-2.5.8-4.7 2-6.1 1.9zm12.5-5.1c-1.3-1.4-.2-2.4 1.7-3.5 2.8-1.5 2-3.6 5.6-5.3 1.6-1 24-10 31.3-14.8s27.8-20.3 33.3-31c5.4-10.6 2.8-11.4 3.6-11.8.7-.5 1.5 1.5 1.4 3.9-.2 2.3-2 9.3-1.4 10s8.2-5.5 11.4-13 5.6-15.3 7.1-15.3c1.6 0-2.6 12.8-5.3 17.8-2.6 5-5.7 7.5-5 8.6.8 1 8.6-5.5 11.3-10.3 2.6-4.9 5.1-9.2 5.6-8.3a34 34 0 0 1-6.7 16.1c-4.2 4.8-9.2 8.3-8.4 9 .7.8 6.4 1.6 12.3-2.4 6-4.1 6.6-10 7.3-9.7.8.3-.7 8.4-6.4 13.4s-13.2 5.5-13 6.6c.4 1 16.3-4.6 16-3.3-.3 1.2-20.6 9.2-20.8 10 0 .6 3.5.8 9-.5 5.4-1.2 10.6-5.5 11.3-4.5.2 1.4-3.9 4.8-10.1 6.4-6.3 1.6-9.4 3.7-9.6 4.2-.1.5 11.2-1.4 11.2-.8s-14.8 3.5-14.9 4.3c-.2.7 14-2.9 13.8-2-.4.7-19.3 6.3-19.1 6.6.1.4 15.8-3.4 15.5-2.8-.4.7-26.4 8-26.6 8.5-.2.4 23-5.2 22.8-4.7s-12 3.4-12 3.7c0 .3 9.5-1.5 9.3-1-.1.4-24 6.5-24.5 7.4-.5 1 12.4-2.5 12.2-.7s-27.7 11-27.8 9.3c-.2-1.7 16.7-6 16.6-6.5-.2-.5-9.7 1-9.9.1-.1-1 6.3-3 5.8-3.4-.5-.5-5.3 1.4-4.9.3.5-1.1 9.6-5.3 9.4-5.6-.1-.3-3.3 1-3 0 .4-1.1 19.7-6.7 19.4-7.4-.3-.6-8.9 1.4-9.7 1.6-.3-.6 12-5.2 11.8-6-.4-.7-6.6 2.7-7 1.8-.2-1 10.9-5.3 10.2-6s-5.7 1.8-6.4 1.1 10.5-8.4 8.8-8.6c-1.7-.1-3.8 2.4-4 .8.2-2 8.7-5.3 6.8-6.9-3-.9-13.1.7-17.3 3.2s-18.2 16.4-21.6 18.6c-3.4 2.1-15 7-17.2 8-3.4 1.2-4 3-7.5 4.8-6.3 1.7-6.2 3.6-9.2 4.7-1.1.3-12.4 5.7-12.5 5.3zm-15.8 7c-1.9 1-3.6 3.4-2.5 4.4.6 1.2 2.5-2.7 4-2.5l8 .4c4.3.3 6.4-.9 8.8-.7s7.7-1.3 10.2-1.3 3 .3 3.2-.8c.3-1-7.8-.3-11.4-.4-3.6-.2-8.1.7-10.8.7-2.5-.1-6.8-.9-9.5.2z"/>
-        <rect width="3.4" height="3" x="401.7" y="309.1" rx="1.7" ry="1.5"/>
-        <path d="M445 307.7c1.7-.3 6.3 1.3 9.5 2 5.8 2.3 16.6 1.2 16.6 2.3s-.7 2.4-3.2 2.6-8.8-1-8.6-1 5 2.3 3.6 2.9-5.5-1.3-6.2-.8 3.8 1.4 3 1.7c-.6.3-3.7-.4-4.7-.3-1 .2.8 1.3-.4 1.7-1.2.5-3.2-.6-4-.3-.9.3 1.8 2 .6 2.2-1.2.2-4-.8-5.6-1-1.6 0 1.5 1.6.5 1.8-1 .1-3.8-1.3-4.5-1.3s0 2-1 2-2.2-1.7-2.8-1.7 0 2-1 2-1.4-2.1-2.2-2c-1 .2 0 2.7-1.4 2.5-1.3-.1-1.5-2.6-2.6-2.5-1 .2.2 2.5-.8 2.5s-1.2-2.3-2.2-2.5c-1-.1-.6 2.2-1.2 2.2s-1.2-2.2-1.6-2.2c-.3 0 0 2.2-1.2 2s-1.2-2.4-1.5-2.3c-.4.2-.4 1.8-1.2 1.8s-.9-1.6-1.2-1.4c-.4.1-1.6 2.1-2.4 1.8-.9-.3.2-1.9-.2-1.9s-1.4 1.1-2 1 0-1.4-.2-1.4-1.7.8-2.4.8-2.6 1-3.1.1c-.5-1 1.3-1 1.7-1.9.3-.9-1-3.6.4-4.5 1.3-1 5.6 1.3 12-.3 11.6-3.1 20.6-6.7 21.5-6.6z"/>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/lu.svg b/inc/images/provisioning/flags/lu.svg
deleted file mode 100644
index c31d2bfa..00000000
--- a/inc/images/provisioning/flags/lu.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-lu" viewBox="0 0 640 480">
-  <path fill="#00a1de" d="M0 240h640v240H0z"/>
-  <path fill="#ed2939" d="M0 0h640v240H0z"/>
-  <path fill="#fff" d="M0 160h640v160H0z"/>
-</svg>
diff --git a/inc/images/provisioning/flags/nl.svg b/inc/images/provisioning/flags/nl.svg
deleted file mode 100644
index 4faaf498..00000000
--- a/inc/images/provisioning/flags/nl.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-nl" viewBox="0 0 640 480">
-  <path fill="#21468b" d="M0 0h640v480H0z"/>
-  <path fill="#fff" d="M0 0h640v320H0z"/>
-  <path fill="#ae1c28" d="M0 0h640v160H0z"/>
-</svg>
diff --git a/inc/images/provisioning/flags/pl.svg b/inc/images/provisioning/flags/pl.svg
deleted file mode 100644
index 0fa51452..00000000
--- a/inc/images/provisioning/flags/pl.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-pl" viewBox="0 0 640 480">
-  <g fill-rule="evenodd">
-    <path fill="#fff" d="M640 480H0V0h640z"/>
-    <path fill="#dc143c" d="M640 480H0V240h640z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/ru.svg b/inc/images/provisioning/flags/ru.svg
deleted file mode 100644
index f4d27efc..00000000
--- a/inc/images/provisioning/flags/ru.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ru" viewBox="0 0 640 480">
-  <g fill-rule="evenodd" stroke-width="1pt">
-    <path fill="#fff" d="M0 0h640v480H0z"/>
-    <path fill="#0039a6" d="M0 160h640v320H0z"/>
-    <path fill="#d52b1e" d="M0 320h640v160H0z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/se.svg b/inc/images/provisioning/flags/se.svg
deleted file mode 100644
index 0e41780e..00000000
--- a/inc/images/provisioning/flags/se.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-se" viewBox="0 0 640 480">
-  <path fill="#005293" d="M0 0h640v480H0z"/>
-  <path fill="#fecb00" d="M176 0v192H0v96h176v192h96V288h368v-96H272V0h-96z"/>
-</svg>
diff --git a/inc/images/provisioning/flags/sg.svg b/inc/images/provisioning/flags/sg.svg
deleted file mode 100644
index c0d3d083..00000000
--- a/inc/images/provisioning/flags/sg.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-sg" viewBox="0 0 640 480">
-  <defs>
-    <clipPath id="a">
-      <path fill-opacity=".7" d="M0 0h640v480H0z"/>
-    </clipPath>
-  </defs>
-  <g fill-rule="evenodd" clip-path="url(#a)">
-    <path fill="#fff" d="M-20 0h720v480H-20z"/>
-    <path fill="#df0000" d="M-20 0h720v240H-20z"/>
-    <path fill="#fff" d="M146 40.2a84.4 84.4 0 0 0 .8 165.2 86 86 0 0 1-106.6-59 86 86 0 0 1 59-106c16-4.6 30.8-4.7 46.9-.2z"/>
-    <path fill="#fff" d="m133 110 4.9 15-13-9.2-12.8 9.4 4.7-15.2-12.8-9.3 15.9-.2 5-15 5 15h15.8zm17.5 52 5 15.1-13-9.2-12.9 9.3 4.8-15.1-12.8-9.4 15.9-.1 4.9-15.1 5 15h16zm58.5-.4 4.9 15.2-13-9.3-12.8 9.3 4.7-15.1-12.8-9.3 15.9-.2 5-15 5 15h15.8zm17.4-51.6 4.9 15.1-13-9.2-12.8 9.3 4.8-15.1-12.9-9.4 16-.1 4.8-15.1 5 15h16zm-46.3-34.3 5 15.2-13-9.3-12.9 9.4 4.8-15.2-12.8-9.4 15.8-.1 5-15.1 5 15h16z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/tr.svg b/inc/images/provisioning/flags/tr.svg
deleted file mode 100644
index a92804f8..00000000
--- a/inc/images/provisioning/flags/tr.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-tr" viewBox="0 0 640 480">
-  <g fill-rule="evenodd">
-    <path fill="#e30a17" d="M0 0h640v480H0z"/>
-    <path fill="#fff" d="M407 247.5c0 66.2-54.6 119.9-122 119.9s-122-53.7-122-120 54.6-119.8 122-119.8 122 53.7 122 119.9z"/>
-    <path fill="#e30a17" d="M413 247.5c0 53-43.6 95.9-97.5 95.9s-97.6-43-97.6-96 43.7-95.8 97.6-95.8 97.6 42.9 97.6 95.9z"/>
-    <path fill="#fff" d="m430.7 191.5-1 44.3-41.3 11.2 40.8 14.5-1 40.7 26.5-31.8 40.2 14-23.2-34.1 28.3-33.9-43.5 12-25.8-37z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/ua.svg b/inc/images/provisioning/flags/ua.svg
deleted file mode 100644
index a339eb1b..00000000
--- a/inc/images/provisioning/flags/ua.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ua" viewBox="0 0 640 480">
-  <g fill-rule="evenodd" stroke-width="1pt">
-    <path fill="gold" d="M0 0h640v480H0z"/>
-    <path fill="#0057b8" d="M0 0h640v240H0z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/us.svg b/inc/images/provisioning/flags/us.svg
deleted file mode 100644
index 73b62457..00000000
--- a/inc/images/provisioning/flags/us.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-us" viewBox="0 0 640 480">
-  <g fill-rule="evenodd">
-    <g stroke-width="1pt">
-      <path fill="#bd3d44" d="M0 0h912v37H0zm0 73.9h912v37H0zm0 73.8h912v37H0zm0 73.8h912v37H0zm0 74h912v36.8H0zm0 73.7h912v37H0zM0 443h912V480H0z"/>
-      <path fill="#fff" d="M0 37h912v36.9H0zm0 73.8h912v36.9H0zm0 73.8h912v37H0zm0 73.9h912v37H0zm0 73.8h912v37H0zm0 73.8h912v37H0z"/>
-    </g>
-    <path fill="#192f5d" d="M0 0h364.8v258.5H0z"/>
-    <path fill="#fff" d="m30.4 11 3.4 10.3h10.6l-8.6 6.3 3.3 10.3-8.7-6.4-8.6 6.3L25 27.6l-8.7-6.3h10.9zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.2 10.3-8.6-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.6zm60.8 0 3.3 10.3H166l-8.6 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.4-10.2-8.8-6.3h10.7zm60.8 0 3.3 10.3h10.7l-8.6 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.3 10.3h10.8l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3 3.4-10.2-8.8-6.3h10.8zM60.8 37l3.3 10.2H75l-8.7 6.2 3.2 10.3-8.5-6.3-8.7 6.3 3.1-10.3-8.4-6.2h10.7zm60.8 0 3.4 10.2h10.7l-8.8 6.2 3.4 10.3-8.7-6.3-8.7 6.3 3.3-10.3-8.7-6.2h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.2 3.3 10.3-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.2H179zm60.8 0 3.4 10.2h10.7l-8.8 6.2 3.4 10.3-8.7-6.3-8.6 6.3 3.2-10.3-8.7-6.2H240zm60.8 0 3.3 10.2h10.8l-8.7 6.2 3.3 10.3-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.2h10.7zM30.4 62.6l3.4 10.4h10.6l-8.6 6.3 3.3 10.2-8.7-6.3-8.6 6.3L25 79.3 16.3 73h10.9zm60.8 0L94.5 73h10.8l-8.7 6.3 3.2 10.2-8.6-6.3-8.7 6.3 3.3-10.3-8.6-6.3h10.6zm60.8 0 3.3 10.3H166l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.7zm60.8 0 3.3 10.3h10.7l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.3h10.7zm60.8 0 3.3 10.3h10.8l-8.8 6.3 3.4 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.8zM60.8 88.6l3.3 10.2H75l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.4 10.2h10.7l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3H179zm60.8 0 3.4 10.2h10.7l-8.7 6.3 3.3 10.3-8.7-6.4-8.6 6.3 3.2-10.2-8.7-6.3H240zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zM30.4 114.5l3.4 10.2h10.6l-8.6 6.3 3.3 10.3-8.7-6.4-8.6 6.3L25 131l-8.7-6.3h10.9zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.2 10.2-8.6-6.3-8.7 6.3 3.3-10.2-8.6-6.3h10.6zm60.8 0 3.3 10.2H166l-8.6 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.4-10.2-8.8-6.3h10.7zm60.8 0 3.3 10.2h10.7L279 131l3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.3 10.2h10.8l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3L329 131l-8.8-6.3h10.8zM60.8 140.3l3.3 10.3H75l-8.7 6.2 3.3 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.6-6.3h10.7zm60.8 0 3.4 10.3h10.7l-8.8 6.2 3.4 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.2 3.3 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.6-6.3H179zm60.8 0 3.4 10.3h10.7l-8.7 6.2 3.3 10.3-8.7-6.4-8.6 6.4 3.2-10.3-8.7-6.3H240zm60.8 0 3.3 10.3h10.8l-8.7 6.2 3.3 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.6-6.3h10.7zM30.4 166.1l3.4 10.3h10.6l-8.6 6.3 3.3 10.1-8.7-6.2-8.6 6.2 3.2-10.2-8.7-6.3h10.9zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.4-10.2-8.7-6.3h10.6zm60.8 0 3.3 10.3H166l-8.6 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.4-10.2-8.8-6.3h10.7zm60.8 0 3.3 10.3h10.7l-8.6 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.3 10.3h10.8l-8.8 6.3 3.4 10.1-8.7-6.2-8.7 6.2 3.4-10.2-8.8-6.3h10.8zM60.8 192l3.3 10.2H75l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.4 10.2h10.7l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3H179zm60.8 0 3.4 10.2h10.7l-8.7 6.3 3.3 10.3-8.7-6.4-8.6 6.3 3.2-10.2-8.7-6.3H240zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zM30.4 217.9l3.4 10.2h10.6l-8.6 6.3 3.3 10.2-8.7-6.3-8.6 6.3 3.2-10.3-8.7-6.3h10.9zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.7-6.3h10.6zm60.8 0 3.3 10.2H166l-8.4 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.7zm60.8 0 3.3 10.2h10.7l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.3h10.7zm60.8 0 3.3 10.2h10.8l-8.8 6.3 3.4 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.8z"/>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/flags/za.svg b/inc/images/provisioning/flags/za.svg
deleted file mode 100644
index ea1937f3..00000000
--- a/inc/images/provisioning/flags/za.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-za" viewBox="0 0 640 480">
-  <defs>
-    <clipPath id="a">
-      <path fill-opacity=".7" d="M-71.9 0h682.7v512H-71.9z"/>
-    </clipPath>
-  </defs>
-  <g clip-path="url(#a)" transform="translate(67.4) scale(.93748)">
-    <g fill-rule="evenodd" stroke-width="1pt">
-      <path d="M-71.9 407.8V104.4L154 256.1-72 407.8z"/>
-      <path fill="#00c" d="m82.2 512.1 253.6-170.6H696V512H82.2z"/>
-      <path fill="red" d="M66 0h630v170.8H335.7S69.3-1.7 66 0z"/>
-      <path fill="#fc0" d="M-71.9 64v40.4L154 256-72 407.8v40.3l284.5-192L-72 64z"/>
-      <path fill="#093" d="M-71.9 64V0h95l301.2 204h371.8v104.2H324.3L23 512h-94.9v-63.9l284.4-192L-71.8 64z"/>
-      <path fill="#fff" d="M23 0h59.2l253.6 170.7H696V204H324.3L23 .1zm0 512.1h59.2l253.6-170.6H696v-33.2H324.3L23 512z"/>
-    </g>
-  </g>
-</svg>
diff --git a/inc/images/provisioning/oss/.DS_Store b/inc/images/provisioning/oss/.DS_Store
deleted file mode 100644
index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6148
zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3
zem<@ulZcFPQ@L2!n>{z**<q8>++&mCkOWA81W14cNZ<zv;LbK1Poaz?KmsK2CSc!(
z0ynLxE!0092;Krf2c+FF_Fe*7ECH>lEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ
zLs35+`xjp>T0<F0fCPF1$Cyrb|F7^5{eNG?83~ZUUlGt@xh*qZDeu<Z%US-OSsOPv
j)R!Z4KLME7ReXlK;d!wEw5GODWMKRea10D2@KpjYNUI8I

diff --git a/inc/images/provisioning/oss/centos.svg b/inc/images/provisioning/oss/centos.svg
deleted file mode 100644
index 1ed0f7bd..00000000
--- a/inc/images/provisioning/oss/centos.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="15" height="15" viewBox="0.038 0.038 25.514 25.514" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><path d="m10.786 11.864 0.922 0.918 -0.922 0.917H4.29v3.057L0.329 12.782l3.961 -3.907v2.99h6.496Zm2.855 -7.807H21.535v7.893H13.642V4.057Z" fill="#932279"/><path d="m13.727 10.786 -0.917 0.922 -0.917 -0.922V4.29h-3.058L12.81 0.329l3.907 3.961h-2.99v6.496Zm-0.085 2.855H21.535V21.535H13.642V13.642Z" fill="#EFA724"/><path d="m14.806 13.727 -0.922 -0.917 0.922 -0.917h6.496v-3.058l3.962 3.975 -3.962 3.907v-2.99h-6.496Zm-10.748 -0.085h7.893V21.535H4.057V13.642Z" fill="#262577"/><path d="m11.864 14.806 0.917 -0.922 0.918 0.922v6.496h3.057l-3.975 3.961 -3.907 -3.961h2.99v-6.496ZM4.057 4.057h7.893v7.893H4.057V4.057Z" fill="#9CCD2A"/><path d="M3.775 3.775h8.457v8.457H3.775V3.775Zm0.563 7.893H11.667V4.34H4.34v7.328ZM13.359 3.775h8.457v8.457H13.359V3.775Zm0.563 7.893h7.328V4.34H13.923v7.328Zm-0.563 1.692h8.457v8.457H13.359V13.36Zm0.563 7.893h7.328V13.925H13.923v7.328ZM3.775 13.36h8.457v8.457H3.775V13.36Zm0.563 7.893H11.667V13.925H4.34v7.328Z" fill="#FFF"/><path d="M6.02 18.775 0.04 12.796l5.978 -5.979 5.98 5.98 -5.98 5.98ZM0.837 12.796l5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Zm11.96 -0.797 -5.98 -5.979L12.796 0.038l5.98 5.98 -5.98 5.98ZM7.613 6.02l5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Zm11.96 12.757 -5.98 -5.98 5.98 -5.98 5.98 5.98 -5.98 5.98Zm-5.182 -5.98 5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Zm-1.595 12.757 -5.98 -5.981 5.98 -5.98 5.98 5.98 -5.98 5.98Zm-5.183 -5.981 5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Z" fill="#FFF"/></svg>
diff --git a/inc/images/provisioning/oss/debian.svg b/inc/images/provisioning/oss/debian.svg
deleted file mode 100644
index 0808548a..00000000
--- a/inc/images/provisioning/oss/debian.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="15" height="18.574" viewBox="0 0 15 18.574" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><g fill="#A80030"><path d="M8.953 9.81c-.308.004.058.159.46.22a4.06 4.06 0 0 0 .301-.259c-.25.061-.505.063-.761.039m1.651-.412c.183-.252.317-.529.364-.816-.041.205-.152.381-.256.567-.575.362-.054-.215 0-.435-.619.779-.085.467-.108.684m.61-1.586c.037-.554-.109-.379-.158-.167.057.03.102.39.158.167M7.786.24c.164.029.355.052.328.091.18-.04.221-.076-.328-.091m.328.091-.116.024.108-.01.008-.014"/><path d="M13.234 8.022c.019.498-.145.739-.293 1.167l-.266.133c-.217.422.021.268-.135.604-.339.302-1.03.945-1.252 1.004-.161-.004.11-.191.145-.264-.455.312-.365.469-1.06.658l-.021-.045c-1.715.807-4.097-.792-4.066-2.974-.018.139-.052.104-.09.16-.089-1.123.518-2.25 1.542-2.711 1.001-.495 2.175-.292 2.892.377-.394-.517-1.178-1.064-2.107-1.012-.911.014-1.762.593-2.046 1.221-.467.293-.521 1.131-.724 1.285-.274 2.009.514 2.878 1.847 3.899.21.141.059.163.087.27a3.614 3.614 0 0 1-1.181-.903c.177.259.368.511.614.708-.417-.141-.975-1.011-1.138-1.047.72 1.289 2.92 2.26 4.072 1.778-.533.02-1.21.011-1.809-.21-.252-.13-.594-.398-.533-.448 1.572.587 3.196.445 4.557-.646.346-.269.724-.728.833-.734-.165.247.028.119-.098.337.345-.556-.15-.226.356-.96l.187.258c-.069-.462.573-1.023.508-1.753.148-.223.165.241.008.754.217-.57.057-.661.113-1.131.06.158.14.326.18.492-.141-.55.145-.927.216-1.247-.07-.031-.218.244-.252-.407.005-.282.079-.148.107-.218-.055-.031-.201-.248-.29-.663.065-.098.172.253.259.267-.056-.33-.153-.582-.156-.835-.256-.534-.091.071-.298-.229-.271-.847.226-.197.259-.582.412.597.647 1.521.754 1.904a7.809 7.809 0 0 0-.377-1.357c.125.053-.201-.96.162-.289-.388-1.43-1.663-2.766-2.836-3.393.144.131.325.296.26.322-.583-.348-.481-.375-.564-.521-.475-.194-.506.015-.821 0C9.883.566 9.711.617 8.887.319l.037.175c-.593-.197-.691.075-1.332.001-.039-.031.205-.11.407-.14-.574.076-.547-.113-1.108.021.138-.097.284-.161.432-.244-.468.029-1.117.273-.917.051-.762.34-2.117.818-2.878 1.531l-.024-.16c-.348.419-1.519 1.249-1.612 1.791l-.094.022c-.181.307-.298.655-.442.971-.237.404-.348.155-.314.219-.466.945-.698 1.74-.898 2.391.143.214.003 1.284.057 2.14-.234 4.23 2.969 8.337 6.47 9.285.513.183 1.276.176 1.925.195-.766-.219-.865-.116-1.611-.376-.538-.254-.656-.543-1.037-.874l.151.267c-.748-.265-.435-.327-1.043-.52l.161-.21c-.242-.019-.642-.409-.751-.625l-.265.011c-.318-.393-.488-.676-.476-.896l-.085.153c-.097-.167-1.172-1.474-.615-1.17-.103-.094-.241-.154-.39-.425l.113-.13c-.268-.345-.493-.787-.476-.935.143.194.242.23.341.263-.678-1.681-.716-.093-1.229-1.711l.108-.009c-.083-.125-.133-.261-.2-.395l.047-.471c-.488-.564-.136-2.398-.066-3.404.049-.409.407-.844.68-1.527l-.166-.029c.317-.553 1.812-2.223 2.504-2.137.336-.422-.066-.002-.132-.108.737-.762.969-.539 1.466-.676.536-.318-.46.124-.206-.121.927-.237.657-.539 1.866-.659.128.073-.296.112-.402.207.772-.378 2.444-.292 3.53.209 1.26.589 2.675 2.33 2.731 3.967l.064.017c-.033.651.099 1.404-.129 2.096l.155-.328"/><path d="m5.595 10.232-.043.216c.202.275.362.572.62.787-.185-.363-.323-.512-.577-1.003m.478-.018c-.107-.119-.171-.261-.241-.403.067.249.206.464.335.682l-.094-.279m8.458-1.839-.045.113a5.485 5.485 0 0 1-.536 1.712c.303-.57.499-1.193.581-1.825M7.847.092C8.055.016 8.358.05 8.579 0c-.287.024-.574.039-.856.075l.124.017M.544 3.975c.048.444-.334.616.084.324.225-.505-.087-.14-.084-.324M.052 6.029c.097-.296.114-.473.151-.644-.267.34-.123.413-.151.644"/></g></svg>
diff --git a/inc/images/provisioning/oss/fedora.svg b/inc/images/provisioning/oss/fedora.svg
deleted file mode 100644
index c4b42466..00000000
--- a/inc/images/provisioning/oss/fedora.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><path d="M15 7.5a7.5 7.5 0 0 0-15-.005v5.804A1.705 1.705 0 0 0 1.705 15h5.797A7.5 7.5 0 0 0 15 7.5" fill="#294172"/><path d="M9.702 1.776a3.522 3.522 0 0 0-3.518 3.518v1.867h-1.86a3.522 3.522 0 0 0-3.518 3.518 3.522 3.522 0 0 0 3.518 3.519 3.522 3.522 0 0 0 3.518-3.518V8.812h1.859a3.522 3.522 0 0 0 3.518-3.518 3.522 3.522 0 0 0-3.518-3.518ZM6.197 10.68a1.875 1.875 0 0 1-1.873 1.872 1.874 1.874 0 0 1-1.872-1.872 1.875 1.875 0 0 1 1.872-1.873h1.86v.005h.013v1.868Zm3.505-3.513H7.843v-.005H7.83V5.294a1.875 1.875 0 0 1 1.872-1.873 1.875 1.875 0 0 1 1.873 1.873 1.875 1.875 0 0 1-1.873 1.872Z" fill="#3C6EB4"/><path d="M10.48 1.882a2.812 2.812 0 0 0-.778-.104 3.52 3.52 0 0 0-3.52 3.52v1.866H4.707a.82.82 0 1 0-.008 1.638H5.92c.145 0 .262.117.262.262v1.614a1.859 1.859 0 0 1-1.858 1.855c-.347 0-.433-.046-.67-.046-.498 0-.832.334-.832.792.001.38.325.706.724.811.273.071.483.104.777.104a3.52 3.52 0 0 0 3.52-3.52V8.808h1.474a.822.822 0 0 0 .831-.82.817.817 0 0 0-.822-.819H8.107a.263.263 0 0 1-.263-.262V5.295A1.859 1.859 0 0 1 9.702 3.44c.348 0 .433.046.67.046.498 0 .831-.334.831-.792 0-.38-.325-.706-.723-.811" fill="#FFF"/></svg>
diff --git a/inc/images/provisioning/oss/rocky-linux.svg b/inc/images/provisioning/oss/rocky-linux.svg
deleted file mode 100644
index 504bbdb1..00000000
--- a/inc/images/provisioning/oss/rocky-linux.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="23" height="5.054" viewBox="0 0 23 5.054" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.316 3.153a1.894 1.894 0 1 0-3.14.703l1.923-1.922.474.475.743.744Zm-.345.602-.872-.872-1.366 1.366a1.893 1.893 0 0 0 2.238-.494Z" fill="#10B981"/><path d="M5.589 3.514v-1.99h.972c.1 0 .192.015.276.046a.62.62 0 0 1 .218.127.548.548 0 0 1 .142.194.604.604 0 0 1-.056.585.637.637 0 0 1-.282.22l.441.818h-.461l-.39-.762h-.448v.762h-.412Zm.935-1.634h-.523v.533h.523a.32.32 0 0 0 .221-.073.244.244 0 0 0 .086-.193.246.246 0 0 0-.086-.194.32.32 0 0 0-.221-.073Zm.815.895a.757.757 0 0 1 .226-.546.814.814 0 0 1 .873-.165c.097.04.181.095.25.165a.742.742 0 0 1 .231.546.758.758 0 0 1-.231.546.8.8 0 0 1-.56.221.808.808 0 0 1-.563-.221.793.793 0 0 1-.167-.242.773.773 0 0 1-.059-.304Zm.789.43c.114 0 .21-.042.29-.126a.421.421 0 0 0 .12-.304.422.422 0 0 0-.12-.306.381.381 0 0 0-.29-.126.383.383 0 0 0-.29.126.426.426 0 0 0-.119.306c0 .12.04.221.119.304.08.084.177.126.29.126Zm1.767-.003a.438.438 0 0 0 .184-.04.522.522 0 0 0 .168-.126l.233.242a.831.831 0 0 1-.273.197.814.814 0 0 1-.329.067.794.794 0 0 1-.555-.221.781.781 0 0 1-.163-.242.773.773 0 0 1-.058-.304.756.756 0 0 1 .468-.711.836.836 0 0 1 .645.012.744.744 0 0 1 .276.193l-.239.253a.537.537 0 0 0-.17-.133.423.423 0 0 0-.197-.046.367.367 0 0 0-.283.126.43.43 0 0 0-.114.306c0 .121.039.223.117.304.08.081.176.123.29.123Zm.788.312v-1.99l.389-.086v1.221l.64-.626h.44l-.693.679.736.802h-.497l-.626-.676v.676h-.389Zm2.044.068.023-.054-.577-1.495h.429l.367 1.009.42-1.009h.422l-.683 1.598c-.076.178-.164.305-.265.38a.625.625 0 0 1-.392.114 1.08 1.08 0 0 1-.174-.017v-.334c.02.003.039.006.06.007a.837.837 0 0 0 .077.003.3.3 0 0 0 .176-.05.351.351 0 0 0 .117-.152Zm1.858-.068v-1.99h.218v1.794h1.187v.196h-1.405Zm1.78-1.697a.136.136 0 0 1-.099-.043.136.136 0 0 1-.042-.1c0-.039.014-.072.042-.099a.139.139 0 0 1 .099-.042c.04 0 .074.014.1.042a.13.13 0 0 1 .043.099.133.133 0 0 1-.043.1.129.129 0 0 1-.1.043Zm.106.273v1.424h-.21V2.09h.21Zm.359 1.424V2.09h.21v.167a.531.531 0 0 1 .196-.144.609.609 0 0 1 .253-.052c.161 0 .293.052.396.155a.531.531 0 0 1 .153.397v.901h-.207v-.858a.408.408 0 0 0-.109-.299.385.385 0 0 0-.29-.111.464.464 0 0 0-.23.057.444.444 0 0 0-.162.163v1.048h-.21Zm1.748-1.424v.859c0 .124.037.223.109.299.07.073.168.11.29.11a.434.434 0 0 0 .392-.222V2.09h.21v1.424h-.21v-.165a.534.534 0 0 1-.196.145.616.616 0 0 1-.252.048.54.54 0 0 1-.397-.153.534.534 0 0 1-.153-.397V2.09h.207Zm1.193 1.424.561-.734-.532-.69h.25l.403.535.405-.535h.241l-.526.688.562.736h-.249l-.434-.579-.442.579h-.239Zm1.552-1.508v-.309h-.103v-.059h.103v-.12l.069-.018v.138h.142v.059h-.142v.292c0 .024.004.043.016.055.011.011.03.015.056.015a.175.175 0 0 0 .035-.003.107.107 0 0 0 .034-.009v.061a.146.146 0 0 1-.04.01c-.016.003-.029.003-.043.003a.137.137 0 0 1-.095-.03c-.022-.019-.032-.047-.032-.085Zm.286.107v-.475h.071v.052a.178.178 0 0 1 .139-.062.167.167 0 0 1 .149.086.188.188 0 0 1 .071-.064.198.198 0 0 1 .092-.022c.052 0 .093.017.125.051a.182.182 0 0 1 .049.133v.301h-.069v-.287c0-.041-.01-.075-.033-.099a.113.113 0 0 0-.089-.037.128.128 0 0 0-.072.02.152.152 0 0 0-.054.058l.002.021c.001.007.003.014.003.023v.301h-.069v-.287a.148.148 0 0 0-.034-.099.114.114 0 0 0-.089-.037.131.131 0 0 0-.069.018.127.127 0 0 0-.052.051v.354h-.071Z" fill="#000"/></svg>
diff --git a/inc/images/provisioning/oss/suse.svg b/inc/images/provisioning/oss/suse.svg
deleted file mode 100644
index 61a8c547..00000000
--- a/inc/images/provisioning/oss/suse.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 1.157 1.157"><g fill-rule="evenodd" clip-rule="evenodd"><path fill="#fff" d="M0 0h1.157v1.157H0V0z"/><path d="M.095.868c.002.061.047.087.103.087.048 0 .097-.022.097-.077A.065.065 0 0 0 .247.816 1.313 1.313 0 0 1 .176.797C.159.793.147.783.147.766c0-.025.025-.032.045-.032.029 0 .05.012.053.043h.042C.287.726.245.699.193.699c-.044 0-.09.023-.09.072 0 .025.012.051.055.062.034.009.055.014.073.02.01.003.021.011.021.03C.252.901.237.92.2.92.165.92.138.905.138.867H.095zM.532.772H.493v.103C.493.903.482.923.45.923.428.923.415.912.415.881V.772H.376v.113c0 .046.02.069.067.069a.058.058 0 0 0 .05-.029h.001v.024h.038V.772zm.082.096c.001.061.047.087.102.087.049 0 .098-.022.098-.077A.065.065 0 0 0 .766.816 1.101 1.101 0 0 1 .695.797C.678.793.666.783.666.766c0-.025.025-.032.045-.032.029 0 .051.012.053.043h.043C.807.726.764.699.713.699.669.699.624.722.624.771c0 .025.012.051.054.062.034.009.056.014.074.02.01.003.02.011.02.03C.772.901.758.92.72.92.686.92.659.905.659.867H.616zM.9.95h.179V.914H.944V.842h.123V.807H.944V.743h.133V.706H.9v.245z" fill="#0c0e0f"/><path d="M.059.602.06.605c.019.051.055.072.115.068C.216.669.233.644.224.602L.172.601C.171.615.164.627.148.629H.146a.05.05 0 0 1-.04-.027L.058.601zm.068 0c.005.006.011.01.02.01a.01.01 0 0 0 .008-.01L.127.601zm.211 0c0 .009 0 .023.019.023.025 0 .025-.012.027-.022L.338.602zm.102 0c0 .017.003.023.018.025.019.002.023-.01.024-.016l.002-.01H.44zm.28 0c.003.01.003.027.027.025C.762.625.763.612.761.602H.72zm.098 0C.826.621.836.626.85.623.859.62.862.616.86.602H.818z" fill="#9dc14e"/><path d="M.053.527a.166.166 0 0 0 .006.074h.048A.066.066 0 0 1 .104.553L.105.551A.07.07 0 0 1 .124.526H.053zm.28 0L.338.6l.001.002h.046V.601C.386.551.386.544.388.527H.333zm.109 0C.443.53.442.535.441.539v.063L.485.601C.489.574.488.564.492.54L.494.526H.442zm.257 0 .02.072.002.003h.041L.761.593.752.53.751.527H.699zm.096 0 .017.058.006.016v.001H.86L.856.583S.842.548.85.528H.795zm-.64.075A.02.02 0 0 0 .153.589C.143.591.137.575.148.572.164.567.174.585.172.603L.224.602.221.59C.205.559.188.541.169.535l-.01.003C.143.541.129.543.12.56.116.578.118.593.128.602h.028z" fill="#9dc14e"/><path d="M.091.427a.248.248 0 0 0-.038.1h.07A.217.217 0 0 1 .157.515C.165.498.185.481.216.468.274.453.323.465.333.519v.008h.055L.389.52C.394.494.442.486.443.527h.052C.498.507.51.499.56.507c.034.01.055.005.101.001.033-.007.031.001.038.017L.7.527h.052C.748.504.768.461.795.524l.001.003h.055C.854.518.861.512.874.513.882.511.891.51.893.504.87.494.857.483.811.447.802.44.813.426.821.433c.058.045.073.06.125.073a.161.161 0 0 0 .152-.08h-.029a.31.31 0 0 1-.074.012.175.175 0 0 1-.042-.007.235.235 0 0 0-.014-.005H.091z" fill="#9dc14e"/><path d="M.938.427C.922.421.904.412.887.41.873.408.877.392.886.392.92.397.96.423.994.424c.048-.001.082-.016.112-.028C1.09.339 1.019.277.959.294.867.239.848.236.737.212A.88.88 0 0 0 .39.23C.311.257.251.272.147.362a.301.301 0 0 0-.055.066h.847zm.159 0 .006-.012c-.011.004-.022.009-.035.012h.029zM.989.307c.028 0 .055.021.055.048 0 .028-.028.047-.055.047S.943.379.943.351c0-.027.018-.044.046-.044zm.004.012a.036.036 0 0 0-.037.036c0 .019.016.035.037.035S1.03.374 1.03.355A.036.036 0 0 0 .993.319zm.003.012c.014 0 .02.01.02.023S1.009.377.995.377C.982.377.968.369.968.355c0-.013.015-.024.028-.024zM.993.345a.01.01 0 0 0-.01.01c0 .006.004.011.01.011s.011-.005.011-.011c0-.005-.005-.01-.011-.01z" fill="#9dc14e"/><path d="M.252.639h.824v.027H.242s.01-.01.01-.027z" fill="#0c0e0f"/></g></svg>
diff --git a/inc/images/provisioning/oss/ubuntu.svg b/inc/images/provisioning/oss/ubuntu.svg
deleted file mode 100644
index 78bc7c96..00000000
--- a/inc/images/provisioning/oss/ubuntu.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg id="Livello_1" data-name="Livello 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 178.36 183.21"><defs><style>.cls-1{fill:#ffb516;}.cls-2{fill:#fe6309;}.cls-3{fill:#d70000;}</style></defs><title>Ubuntu_Linux_logo</title><path class="cls-1" d="M208.94,319.38a44.2,44.2,0,0,1,17-34.86l-15.8-25.28a74.15,74.15,0,0,0-27.9,39.28,26.64,26.64,0,0,1,.8,44.29A74.2,74.2,0,0,0,210.76,380l14.68-26.11A44.21,44.21,0,0,1,208.94,319.38Z" transform="translate(-148.68 -229.83)"/><path class="cls-2" d="M187,320.93a19.15,19.15,0,1,1-19.15-19.15A19.15,19.15,0,0,1,187,320.93Z" transform="translate(-148.68 -229.83)"/><path class="cls-3" d="M294.58,367.26a26.52,26.52,0,0,1,12.34,3A73.66,73.66,0,0,0,327,324.53L297.28,324a44.3,44.3,0,0,1-61.9,36L220.59,385.8a73.63,73.63,0,0,0,32.64,7.58,74.44,74.44,0,0,0,14.8-1.49A26.62,26.62,0,0,1,294.58,367.26Z" transform="translate(-148.68 -229.83)"/><path class="cls-1" d="M313.74,393.89a19.16,19.16,0,1,1-19.16-19.16A19.15,19.15,0,0,1,313.74,393.89Z" transform="translate(-148.68 -229.83)"/><path class="cls-2" d="M309,270.72A26.63,26.63,0,0,1,267,249c0-.77,0-1.54.1-2.3a74.94,74.94,0,0,0-13.82-1.29,73.67,73.67,0,0,0-32.94,7.72L235,279a44.3,44.3,0,0,1,62.2,35.22l29.76-.9A73.6,73.6,0,0,0,309,270.72Z" transform="translate(-148.68 -229.83)"/><path class="cls-3" d="M312.74,249a19.16,19.16,0,1,1-19.16-19.15A19.16,19.16,0,0,1,312.74,249Z" transform="translate(-148.68 -229.83)"/></svg>
\ No newline at end of file
diff --git a/inc/images/provisioning/oss/windows.svg b/inc/images/provisioning/oss/windows.svg
deleted file mode 100644
index bb0d991f..00000000
--- a/inc/images/provisioning/oss/windows.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 88 88"><path d="m0 12.402 35.687-4.8602.0156 34.423-35.67.20313zm35.67 33.529.0277 34.453-35.67-4.9041-.002-29.78zm4.3261-39.025 47.318-6.906v41.527l-47.318.37565zm47.329 39.349-.0111 41.34-47.318-6.6784-.0663-34.739z" fill="#00adef"/></svg>
\ No newline at end of file
diff --git a/inc/images/provisioning/providers/aws.svg b/inc/images/provisioning/providers/aws.svg
deleted file mode 100644
index 3fd29769..00000000
--- a/inc/images/provisioning/providers/aws.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 304 182" style="enable-background:new 0 0 304 182" xml:space="preserve"><style>.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#f90}</style><path d="M86.4 66.4c0 3.7.4 6.7 1.1 8.9.8 2.2 1.8 4.6 3.2 7.2.5.8.7 1.6.7 2.3 0 1-.6 2-1.9 3L83.2 92c-.9.6-1.8.9-2.6.9-1 0-2-.5-3-1.4-1.4-1.5-2.6-3.1-3.6-4.7-1-1.7-2-3.6-3.1-5.9-7.8 9.2-17.6 13.8-29.4 13.8-8.4 0-15.1-2.4-20-7.2-4.9-4.8-7.4-11.2-7.4-19.2 0-8.5 3-15.4 9.1-20.6 6.1-5.2 14.2-7.8 24.5-7.8 3.4 0 6.9.3 10.6.8 3.7.5 7.5 1.3 11.5 2.2v-7.3c0-7.6-1.6-12.9-4.7-16-3.2-3.1-8.6-4.6-16.3-4.6-3.5 0-7.1.4-10.8 1.3-3.7.9-7.3 2-10.8 3.4-1.6.7-2.8 1.1-3.5 1.3-.7.2-1.2.3-1.6.3-1.4 0-2.1-1-2.1-3.1v-4.9c0-1.6.2-2.8.7-3.5.5-.7 1.4-1.4 2.8-2.1 3.5-1.8 7.7-3.3 12.6-4.5C41 1.9 46.2 1.3 51.7 1.3c11.9 0 20.6 2.7 26.2 8.1 5.5 5.4 8.3 13.6 8.3 24.6v32.4zM45.8 81.6c3.3 0 6.7-.6 10.3-1.8 3.6-1.2 6.8-3.4 9.5-6.4 1.6-1.9 2.8-4 3.4-6.4.6-2.4 1-5.3 1-8.7v-4.2c-2.9-.7-6-1.3-9.2-1.7-3.2-.4-6.3-.6-9.4-.6-6.7 0-11.6 1.3-14.9 4-3.3 2.7-4.9 6.5-4.9 11.5 0 4.7 1.2 8.2 3.7 10.6 2.4 2.5 5.9 3.7 10.5 3.7zm80.3 10.8c-1.8 0-3-.3-3.8-1-.8-.6-1.5-2-2.1-3.9L96.7 10.2c-.6-2-.9-3.3-.9-4 0-1.6.8-2.5 2.4-2.5h9.8c1.9 0 3.2.3 3.9 1 .8.6 1.4 2 2 3.9l16.8 66.2 15.6-66.2c.5-2 1.1-3.3 1.9-3.9.8-.6 2.2-1 4-1h8c1.9 0 3.2.3 4 1 .8.6 1.5 2 1.9 3.9l15.8 67 17.3-67c.6-2 1.3-3.3 2-3.9.8-.6 2.1-1 3.9-1h9.3c1.6 0 2.5.8 2.5 2.5 0 .5-.1 1-.2 1.6-.1.6-.3 1.4-.7 2.5l-24.1 77.3c-.6 2-1.3 3.3-2.1 3.9-.8.6-2.1 1-3.8 1h-8.6c-1.9 0-3.2-.3-4-1-.8-.7-1.5-2-1.9-4L156 23l-15.4 64.4c-.5 2-1.1 3.3-1.9 4-.8.7-2.2 1-4 1h-8.6zm128.5 2.7c-5.2 0-10.4-.6-15.4-1.8-5-1.2-8.9-2.5-11.5-4-1.6-.9-2.7-1.9-3.1-2.8-.4-.9-.6-1.9-.6-2.8v-5.1c0-2.1.8-3.1 2.3-3.1.6 0 1.2.1 1.8.3.6.2 1.5.6 2.5 1 3.4 1.5 7.1 2.7 11 3.5 4 .8 7.9 1.2 11.9 1.2 6.3 0 11.2-1.1 14.6-3.3 3.4-2.2 5.2-5.4 5.2-9.5 0-2.8-.9-5.1-2.7-7-1.8-1.9-5.2-3.6-10.1-5.2L246 52c-7.3-2.3-12.7-5.7-16-10.2-3.3-4.4-5-9.3-5-14.5 0-4.2.9-7.9 2.7-11.1 1.8-3.2 4.2-6 7.2-8.2 3-2.3 6.4-4 10.4-5.2 4-1.2 8.2-1.7 12.6-1.7 2.2 0 4.5.1 6.7.4 2.3.3 4.4.7 6.5 1.1 2 .5 3.9 1 5.7 1.6 1.8.6 3.2 1.2 4.2 1.8 1.4.8 2.4 1.6 3 2.5.6.8.9 1.9.9 3.3v4.7c0 2.1-.8 3.2-2.3 3.2-.8 0-2.1-.4-3.8-1.2-5.7-2.6-12.1-3.9-19.2-3.9-5.7 0-10.2.9-13.3 2.8-3.1 1.9-4.7 4.8-4.7 8.9 0 2.8 1 5.2 3 7.1 2 1.9 5.7 3.8 11 5.5l14.2 4.5c7.2 2.3 12.4 5.5 15.5 9.6 3.1 4.1 4.6 8.8 4.6 14 0 4.3-.9 8.2-2.6 11.6-1.8 3.4-4.2 6.4-7.3 8.8-3.1 2.5-6.8 4.3-11.1 5.6-4.5 1.4-9.2 2.1-14.3 2.1z" style="fill:#252f3e"/><path class="st1" d="M273.5 143.7c-32.9 24.3-80.7 37.2-121.8 37.2-57.6 0-109.5-21.3-148.7-56.7-3.1-2.8-.3-6.6 3.4-4.4 42.4 24.6 94.7 39.5 148.8 39.5 36.5 0 76.6-7.6 113.5-23.2 5.5-2.5 10.2 3.6 4.8 7.6z"/><path class="st1" d="M287.2 128.1c-4.2-5.4-27.8-2.6-38.5-1.3-3.2.4-3.7-2.4-.8-4.5 18.8-13.2 49.7-9.4 53.3-5 3.6 4.5-1 35.4-18.6 50.2-2.7 2.3-5.3 1.1-4.1-1.9 4-9.9 12.9-32.2 8.7-37.5z"/></svg>
diff --git a/inc/images/provisioning/providers/do.svg b/inc/images/provisioning/providers/do.svg
deleted file mode 100644
index 27c48093..00000000
--- a/inc/images/provisioning/providers/do.svg
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 354 354" style="enable-background:new 0 0 354 354;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#0080FF;}
-	.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#0080FF;}
-</style>
-<g id="XMLID_229_">
-	<g id="XMLID_690_">
-		<g id="XMLID_691_">
-			<g>
-				<g id="XMLID_44_">
-					<g id="XMLID_48_">
-						<path id="XMLID_49_" class="st0" d="M177,221.5l0-34.2c36.2,0,64.3-35.9,50.4-74C222.3,99.3,211,88,196.9,82.9
-							c-38.1-13.8-74,14.2-74,50.4c0,0,0,0,0,0l-34.1,0c0-57.7,55.8-102.7,116.3-83.8c26.4,8.3,47.5,29.3,55.7,55.7
-							C279.7,165.7,234.7,221.5,177,221.5z"/>
-					</g>
-					<polygon id="XMLID_47_" class="st1" points="177.1,187.5 143,187.5 143,153.4 143,153.4 177.1,153.4 177.1,153.4 					"/>
-					<polygon id="XMLID_46_" class="st1" points="143,213.6 116.9,213.6 116.9,213.6 116.9,187.5 143,187.5 143,213.6 					"/>
-					<path id="XMLID_45_" class="st1" d="M116.9,187.5H95c0,0,0,0,0,0v-21.9c0,0,0,0,0,0h21.9c0,0,0,0,0,0V187.5z"/>
-				</g>
-			</g>
-		</g>
-	</g>
-	<g id="XMLID_234_">
-		<path id="XMLID_677_" class="st0" d="M31.2,256.1c-4.4-3.1-10-4.6-16.4-4.6H0.8V296h14.1c6.4,0,12-1.6,16.4-4.9
-			c2.4-1.7,4.3-4.1,5.7-7.1c1.3-3,2-6.6,2-10.5c0-3.9-0.7-7.4-2-10.4C35.6,260.1,33.7,257.7,31.2,256.1z M9,259h4.4
-			c4.9,0,8.9,1,12,2.9c3.4,2.1,5.1,6,5.1,11.6c0,5.8-1.7,9.9-5.1,12.1h0c-2.9,1.9-6.9,2.9-11.9,2.9H9V259z"/>
-		<path id="XMLID_676_" class="st0" d="M48.7,250.9c-1.4,0-2.5,0.5-3.5,1.4c-0.9,0.9-1.4,2-1.4,3.4c0,1.4,0.5,2.5,1.4,3.5
-			c0.9,0.9,2.1,1.4,3.5,1.4c1.3,0,2.5-0.5,3.5-1.4c0.9-0.9,1.4-2.1,1.4-3.5c0-1.4-0.5-2.5-1.4-3.4C51.2,251.4,50,250.9,48.7,250.9z"
-			/>
-		<rect id="XMLID_675_" x="44.7" y="264.6" class="st0" width="7.9" height="31.4"/>
-		<path id="XMLID_670_" class="st0" d="M81.3,267.2c-2.4-2.1-5-3.4-7.9-3.4c-4.4,0-8,1.5-10.8,4.5c-2.8,2.9-4.3,6.7-4.3,11.3
-			c0,4.4,1.4,8.2,4.2,11.2c2.8,2.9,6.5,4.4,10.8,4.4c3,0,5.7-0.8,7.8-2.5v0.7c0,2.6-0.7,4.6-2.1,6c-1.4,1.4-3.3,2.1-5.7,2.1
-			c-3.6,0-5.9-1.4-8.7-5.2l-5.4,5.2l0.1,0.2c1.2,1.6,2.9,3.2,5.3,4.7c2.3,1.5,5.3,2.3,8.8,2.3c4.7,0,8.5-1.4,11.3-4.3
-			c2.8-2.9,4.2-6.7,4.2-11.4v-28.5h-7.8V267.2z M79.2,285.8c-1.4,1.6-3.2,2.3-5.4,2.3c-2.3,0-4-0.8-5.4-2.3c-1.4-1.6-2-3.6-2-6.1
-			c0-2.6,0.7-4.6,2-6.2c1.3-1.6,3.2-2.3,5.4-2.3c2.3,0,4,0.8,5.4,2.3c1.4,1.6,2.1,3.7,2.1,6.2C81.3,282.2,80.6,284.2,79.2,285.8z"/>
-		<rect id="XMLID_668_" x="95.8" y="264.6" class="st0" width="7.9" height="31.4"/>
-		<path id="XMLID_660_" class="st0" d="M99.8,250.9c-1.4,0-2.5,0.5-3.5,1.4c-0.9,0.9-1.4,2-1.4,3.4c0,1.4,0.5,2.5,1.4,3.5
-			c0.9,0.9,2.1,1.4,3.5,1.4c1.3,0,2.5-0.5,3.5-1.4c0.9-0.9,1.4-2.1,1.4-3.5c0-1.4-0.5-2.5-1.4-3.4
-			C102.3,251.4,101.2,250.9,99.8,250.9z"/>
-		<path id="XMLID_652_" class="st0" d="M121,256.1h-7.8v8.5h-4.5v7.2h4.5v13c0,4.1,0.8,7,2.4,8.7c1.6,1.7,4.5,2.5,8.5,2.5
-			c1.3,0,2.6,0,3.8-0.1l0.4,0v-7.2l-2.7,0.1c-1.9,0-3.1-0.3-3.7-1c-0.6-0.7-0.9-2.1-0.9-4.2v-11.9h7.4v-7.2H121V256.1z"/>
-		<rect id="XMLID_642_" x="165.4" y="251.4" class="st0" width="7.9" height="44.6"/>
-		<path id="XMLID_448_" class="st0" d="M253.1,284.8c-1.4,1.6-2.9,3-4,3.7v0c-1.1,0.7-2.5,1.1-4.1,1.1c-2.3,0-4.2-0.8-5.7-2.6
-			c-1.5-1.7-2.3-4-2.3-6.6c0-2.7,0.8-4.9,2.3-6.6c1.5-1.7,3.4-2.6,5.7-2.6c2.5,0,5.2,1.6,7.5,4.3l5.2-5l0,0
-			c-3.4-4.4-7.7-6.5-12.9-6.5c-4.3,0-8.1,1.6-11.2,4.7c-3.1,3.1-4.6,7-4.6,11.7s1.6,8.6,4.6,11.7c3.1,3.1,6.8,4.7,11.2,4.7
-			c5.7,0,10.3-2.5,13.5-7L253.1,284.8z"/>
-		<path id="XMLID_445_" class="st0" d="M285.6,269c-1.1-1.6-2.6-2.8-4.5-3.7c-1.9-0.9-4.1-1.4-6.5-1.4c-4.4,0-8,1.6-10.7,4.8
-			c-2.6,3.2-4,7.1-4,11.8c0,4.8,1.5,8.7,4.3,11.7c2.9,3,6.7,4.5,11.4,4.5c5.3,0,9.7-2.2,13-6.4l0.2-0.2l-5.2-5l0,0
-			c-0.5,0.6-1.2,1.2-1.8,1.8c-0.8,0.7-1.5,1.3-2.3,1.7c-1.2,0.6-2.5,0.9-4,0.9c-2.2,0-4-0.6-5.4-1.9c-1.3-1.2-2.1-2.8-2.3-4.8h20.9
-			l0.1-2.9c0-2-0.3-4-0.8-5.8C287.5,272.3,286.7,270.6,285.6,269z M268.3,276.4c0.4-1.5,1.1-2.8,2.1-3.7c1.1-1.1,2.5-1.6,4.1-1.6
-			c1.9,0,3.4,0.5,4.4,1.6c0.9,1,1.5,2.2,1.6,3.7H268.3z"/>
-		<path id="XMLID_442_" class="st0" d="M315.9,267L315.9,267c-2.4-2-5.7-3.1-9.8-3.1c-2.6,0-5.1,0.6-7.3,1.7c-2.1,1-4.1,2.8-5.4,5
-			l0.1,0.1l5.1,4.8c2.1-3.3,4.4-4.5,7.5-4.5c1.7,0,3,0.4,4.1,1.3c1,0.9,1.6,2,1.6,3.4v1.5c-2-0.6-3.9-0.9-5.8-0.9
-			c-3.9,0-7.1,0.9-9.5,2.7c-2.4,1.8-3.6,4.5-3.6,7.9c0,3,1,5.3,3.1,7.1c2.1,1.7,4.6,2.6,7.6,2.6c3,0,5.8-1.2,8.4-3.3v2.6h7.8v-20.2
-			C319.5,272,318.3,269,315.9,267z M301.9,284c0.9-0.6,2.2-0.9,3.8-0.9c1.9,0,3.9,0.4,6,1.1v3.1c-1.7,1.6-4,2.4-6.8,2.4
-			c-1.4,0-2.4-0.3-3.2-0.9c-0.7-0.6-1.1-1.3-1.1-2.3C300.6,285.4,301,284.6,301.9,284z"/>
-		<path id="XMLID_393_" class="st0" d="M349.9,267.6c-2.2-2.5-5.3-3.7-9.2-3.7c-3.1,0-5.7,0.9-7.6,2.7v-1.9h-7.7V296h7.9v-17.3
-			c0-2.4,0.6-4.3,1.7-5.6c1.1-1.3,2.6-2,4.7-2c1.8,0,3.1,0.6,4.1,1.8c1,1.2,1.5,2.9,1.5,4.9V296h7.9v-18.2
-			C353.2,273.5,352.1,270,349.9,267.6z"/>
-		<path id="XMLID_320_" class="st0" d="M155.5,267L155.5,267c-2.4-2-5.7-3.1-9.8-3.1c-2.6,0-5.1,0.6-7.3,1.7c-2.1,1-4.1,2.8-5.4,5
-			l0.1,0.1l5.1,4.8c2.1-3.3,4.4-4.5,7.5-4.5c1.7,0,3,0.4,4.1,1.3c1,0.9,1.6,2,1.6,3.4v1.5c-2-0.6-3.9-0.9-5.8-0.9
-			c-3.9,0-7.1,0.9-9.5,2.7c-2.4,1.8-3.6,4.5-3.6,7.9c0,3,1,5.3,3.1,7.1c2.1,1.7,4.6,2.6,7.6,2.6c3,0,5.8-1.2,8.4-3.3v2.6h7.8v-20.2
-			C159.1,272,157.9,269,155.5,267z M141.5,284c0.9-0.6,2.2-0.9,3.8-0.9c1.9,0,3.9,0.4,6,1.1v3.1c-1.7,1.6-4,2.4-6.8,2.4
-			c-1.4,0-2.4-0.3-3.2-0.9c-0.7-0.6-1.1-1.3-1.1-2.3C140.2,285.4,140.6,284.6,141.5,284z"/>
-		<path id="XMLID_235_" class="st0" d="M202,296.7c-12.7,0-23-10.3-23-23s10.3-23,23-23s23,10.3,23,23S214.7,296.7,202,296.7z
-			 M202,258.8c-8.2,0-14.9,6.7-14.9,14.9s6.7,14.9,14.9,14.9s14.9-6.7,14.9-14.9S210.2,258.8,202,258.8z"/>
-	</g>
-</g>
-</svg>
diff --git a/inc/images/provisioning/providers/gcore.svg b/inc/images/provisioning/providers/gcore.svg
deleted file mode 100644
index bc1bcdb6..00000000
--- a/inc/images/provisioning/providers/gcore.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15"><g fill="#818181" fill-rule="evenodd"><path fill="#231F20" d="M7.515 0c1.683 0 3.311.569 4.628 1.619l.39.307-.345.351-1.332 1.337a5.105 5.105 0 0 1 1.534 2.342h2.591V7.59l-.005.01c-.059 4.134-3.449 7.441-7.569 7.381-4.121-.06-7.417-3.461-7.358-7.6C.109 3.287 3.434 0 7.515 0z"/><path fill="#FF4713" d="M10.855 3.609a5.105 5.105 0 0 1 1.534 2.342H9.512l-.128.128-2.181 2.193-.755.757h5.127a4.335 4.335 0 0 1-5.595 2.54 4.36 4.36 0 0 1-2.531-5.614 4.335 4.335 0 0 1 6.567-2.024l.301.213.262-.263.276-.272z"/><path fill="#FFF" d="m10.505 3.332 1.367-1.371a7.012 7.012 0 0 0-9.869 1.158 7.063 7.063 0 0 0 1.154 9.901 7.013 7.013 0 0 0 9.869-1.153 7.068 7.068 0 0 0 1.515-4.332V6.401H9.7L7.519 8.589h4.653a4.782 4.782 0 0 1-5.748 3.574c-2.571-.604-4.164-3.188-3.563-5.768a4.778 4.778 0 0 1 7.407-2.826l.237-.237z"/></g></svg>
diff --git a/inc/metrics-6.3.16.0.js b/inc/metrics.js
similarity index 94%
rename from inc/metrics-6.3.16.0.js
rename to inc/metrics.js
index 626c40cd..b22ab557 100644
--- a/inc/metrics-6.3.16.0.js
+++ b/inc/metrics.js
@@ -4,12 +4,9 @@ function getHttpChartData(server) {
         return false;
     }
     $.ajax({
-        url: "options.py",
+        url: "/app/metrics/haproxy/" + server + "/http",
 		data: {
-			new_http_metrics: '1',
-			server: server,
             time_range: $( "#time-range option:selected" ).val(),
-			token: $('#token').val()
 		},
 		type: "POST",
         success: function (result) {    
@@ -129,12 +126,9 @@ function renderHttpChart(data, labels, server) {
 }
 function getChartData(server) {
     $.ajax({
-        url: "options.py",
+        url: "/app/metrics/haproxy/" + server,
 		data: {
-			new_metrics: '1',
-			server: server,
             time_range: $( "#time-range option:selected" ).val(),
-			token: $('#token').val()
 		},
 		type: "POST",
         success: function (result) {
@@ -238,12 +232,9 @@ function renderChart(data, labels, server) {
 }
 function getWafChartData(server) {
     $.ajax({
-        url: "options.py",
+        url: "/app/metrics/waf/" + server,
 		data: {
-			new_waf_metrics: '1',
-			server: server,
             time_range: $( "#time-range option:selected" ).val(),
-			token: $('#token').val()
 		},
 		type: "POST",
         success: function (result) {   
@@ -328,12 +319,9 @@ function renderServiceChart(data, labels, server, service) {
 }
 function getNginxChartData(server) {
     $.ajax({
-        url: "options.py",
+        url: "/app/metrics/nginx/" + server,
 		data: {
-			new_nginx_metrics: '1',
-			server: server,
             time_range: $( "#time-range option:selected" ).val(),
-			token: $('#token').val()
 		},
 		type: "POST",
         success: function (result) {
@@ -347,12 +335,9 @@ function getNginxChartData(server) {
 }
 function getApacheChartData(server) {
     $.ajax({
-        url: "options.py",
+        url: "/app/metrics/apache/" + server,
 		data: {
-			new_apache_metrics: '1',
-			server: server,
             time_range: $( "#time-range option:selected" ).val(),
-			token: $('#token').val()
 		},
 		type: "POST",
         success: function (result) {
@@ -365,16 +350,13 @@ function getApacheChartData(server) {
     });
 }
 function loadMetrics() {
-	 $.ajax({
-        url: "options.py",
-		data: {
-			table_metrics: '1',
-			token: $('#token').val()
-		},
-		beforeSend: function() {
-			$('#table_metrics').html('<img class="loading_full_page" src="/inc/images/loading.gif" />')
-		},
-		type: "POST",
+    var service = $('#service').val();
+    $.ajax({
+        url: "/app/metrics/" + service + "/table-metrics",
+        beforeSend: function () {
+            $('#table_metrics').html('<img class="loading_full_page" src="/app/static/images/loading.gif" />')
+        },
+        type: "GET",
         success: function (data) {
             if (data.indexOf('error:') != '-1') {
                 toastr.error(data);
@@ -386,14 +368,14 @@ function loadMetrics() {
 }
 function getChartDataHapWiRam(ip) {
     $.ajax({
-        url: "options.py",
+        url: "/app/metrics/ram",
 		data: {
 			metrics_hapwi_ram: '1',
 			ip: ip,
 			token: $('#token').val()
 		},
 		beforeSend: function() {
-			$('#ram').html('<img class="loading_hapwi_overview" src="/inc/images/loading.gif" />')
+			$('#ram').html('<img class="loading_hapwi_overview" src="/app/static/images/loading.gif" />')
 		},
 		type: "POST",
         success: function (result) {  
@@ -464,7 +446,7 @@ function renderChartHapWiRam(data) {
 }
 function getChartDataHapWiCpu(ip) {
     $.ajax({
-        url: "options.py",
+        url: "/app/metrics/cpu",
 		data: {
 			metrics_hapwi_cpu: '1',
 			ip: ip,
@@ -529,7 +511,8 @@ function renderChartHapWiCpu(data) {
             scales: {
                 x: {
                     ticks: {
-                        max: 100
+                        max: 100,
+                        min: 100
                     }
                 }
             },
@@ -602,15 +585,11 @@ function updatingCpuRamCharts() {
 }
 function getSmonHistoryCheckData(server, check_id) {
     $.ajax({
-        url: "options.py",
-        data: {
-            smon_history_check: '1',
-            check_id: check_id,
-            server_id: server,
+        url: "/app/smon/history/metric/" + server + "/" + check_id,
+        // data: {
             // time_range: $( "#time-range option:selected" ).val(),
-            token: $('#token').val()
-        },
-        type: "POST",
+        // },
+        // type: "POST",
         success: function (result) {
             var data = [];
             data.push(result.chartData.curr_con);
diff --git a/inc/overview-6.3.9.js b/inc/overview.js
similarity index 63%
rename from inc/overview-6.3.9.js
rename to inc/overview.js
index c131d04a..490c6463 100644
--- a/inc/overview-6.3.9.js
+++ b/inc/overview.js
@@ -1,5 +1,5 @@
-var cur_url = window.location.href.split('/').pop();
-cur_url = cur_url.split('?');
+var cur_url = window.location.href.split('/app/').pop();
+cur_url = cur_url.split('/');
 function showHapservers(serv, hostnamea, service) {
 	var i;
 	for (i = 0; i < serv.length; i++) {
@@ -8,17 +8,11 @@ function showHapservers(serv, hostnamea, service) {
 }
 function showHapserversCallBack(serv, hostnamea, service) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "overviewHapservers",
-			serv: serv,
-			service: service,
-			token: $('#token').val()
-		},
+		url: "/app/service/" + service + "/" + serv + "/last-edit",
 		beforeSend: function() {
-			$("#edit_date_"+hostnamea).html('<img class="loading_small_haproxyservers" src="/inc/images/loading.gif" />');
+			$("#edit_date_"+hostnamea).html('<img class="loading_small_haproxyservers" src="/app/static/images/loading.gif" />');
 		},
-		type: "POST",
+		type: "GET",
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -36,17 +30,10 @@ function showHapserversCallBack(serv, hostnamea, service) {
 }
 function overviewHapserverBackends(serv, hostnamea, service) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "overviewHapserverBackends",
-			serv: serv[0],
-			service: service,
-			token: $('#token').val()
-		},
+		url: "/app/service/" + service + "/backends/" + serv[0],
 		beforeSend: function() {
-			$("#top-"+hostnamea).html('<img class="loading_small" style="padding-left: 45%;" src="/inc/images/loading.gif" />');
+			$("#top-"+hostnamea).html('<img class="loading_small" style="padding-left: 45%;" src="/app/static/images/loading.gif" />');
 		},
-		type: "POST",
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -70,16 +57,11 @@ function showOverview(serv, hostnamea) {
 }
 function showOverviewCallBack(serv, hostnamea) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "overview",
-			serv: serv,
-			token: $('#token').val()
-		},
+		url: "/app/overview/server/"+serv,
 		beforeSend: function() {
-			$("#"+hostnamea).html('<img class="loading_small" src="/inc/images/loading.gif" />');
+			$("#"+hostnamea).html('<img class="loading_small" src="/app/static/images/loading.gif" />');
 		},
-		type: "POST",
+		type: "GET",
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -92,16 +74,12 @@ function showOverviewCallBack(serv, hostnamea) {
 }
 function showServicesOverview() {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "overviewServices",
-			token: $('#token').val()
-		},
+		url: "/app/overview/services",
 		beforeSend: function() {
-			$("#services_ovw").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/inc/images/loading.gif" />');
+			$("#services_ovw").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/app/static/images/loading.gif" />');
 
 		},
-		type: "POST",
+		type: "GET",
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -114,17 +92,7 @@ function showServicesOverview() {
 }
 function showOverviewServer(name, ip, id, service) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "overviewServers",
-			name: name,
-			serv: ip,
-			id: id,
-			service: service,
-			page: 'hapservers.py',
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/service/cpu-ram-metrics/" + ip + "/" + id + "/" + name + "/" + service,
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -148,15 +116,11 @@ function showOverviewServer(name, ip, id, service) {
 		}					
 	} );
 }
-function ajaxActionServers(action, id) {
-	var bad_ans = 'Bad config, check please';
+function ajaxActionServers(action, id, service) {
+	// var cur_url = window.location.href.split('/app/').pop();
+	// cur_url = cur_url.split('/');
 	$.ajax( {
-		url: "options.py",
-		data: {
-			action_hap: action,
-			serv: id,
-			token: $('#token').val()
-		},
+		url: "/app/service/action/" + service + "/" + id + "/" + action,
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
 			if( data ==  'Bad config, check please ' ) {
@@ -164,14 +128,12 @@ function ajaxActionServers(action, id) {
 			} else {
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
-				} else if (cur_url[0] == "hapservers.py") {
+				} else {
 					if (data.indexOf('warning: ') != '-1') {
 						toastr.warning(data);
 					} else {
 						location.reload();
 					}
-				} else {
-					setTimeout(showOverview(ip, hostnamea), 2000);
 				}
 			}
 		},
@@ -180,149 +142,9 @@ function ajaxActionServers(action, id) {
 		}
 	} );
 }
-function ajaxActionNginxServers(action, id) {
-	var bad_ans = 'Bad config, check please';
-	$.ajax( {
-		url: "options.py",
-		data: {
-			action_nginx: action,
-			serv: id,
-			token: $('#token').val()
-		},
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if( data ==  'Bad config, check please ' ) {
-				alert(data);
-			} else {
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else if (cur_url[0] == "hapservers.py") {
-					if (data.indexOf('warning: ') != '-1') {
-						toastr.warning(data)
-					} else {
-						location.reload()
-					}
-				} else if (cur_url[0] == "waf.py") {
-					setTimeout(showOverviewWaf(ip, hostnamea), 2000)
-				} else {
-					setTimeout(showOverview(ip, hostnamea), 2000)
-				}
-			}
-		},
-		error: function(){
-			alert(w.data_error);
-		}
-	} );
-}
-function ajaxActionKeepalivedServers(action, id) {
-	var bad_ans = 'Bad config, check please';
-	$.ajax( {
-		url: "options.py",
-		data: {
-			action_keepalived: action,
-			serv: id,
-			token: $('#token').val()
-		},
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if( data ==  'Bad config, check please ' ) {
-				alert(data);
-			} else {
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else if (cur_url[0] == "hapservers.py") {
-					location.reload()
-				} else {
-					setTimeout(showOverview(ip, hostnamea), 2000)
-				}
-			}
-		},
-		error: function(){
-			alert(w.data_error);
-		}
-	} );
-}
-function ajaxActionApacheServers(action, id) {
-	var bad_ans = 'Bad config, check please';
-	$.ajax( {
-		url: "options.py",
-		data: {
-			action_apache: action,
-			serv: id,
-			token: $('#token').val()
-		},
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if( data ==  'Bad config, check please ' ) {
-				alert(data);
-			} else {
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else if (cur_url[0] == "hapservers.py") {
-					if (data.indexOf('warning: ') != '-1') {
-						toastr.warning(data)
-					} else {
-						location.reload()
-					}
-				} else {
-					setTimeout(showOverview(ip, hostnamea), 2000)
-				}
-			}
-		},
-		error: function(){
-			alert(w.data_error);
-		}
-	} );
-}
-function ajaxActionWafServers(action, id) {
-	$.ajax( {
-		url: "options.py",
-			data: {
-				action_waf: action,
-				serv: id,
-				token: $('#token').val()
-			},
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else if( data ==  'Bad config, check please ' ) {
-					toastr.error(data);
-				} else {
-					setTimeout(showOverviewWaf(ip, hostnamea), 2000)
-				}
-			},
-			error: function(){
-				alert(w.data_error);
-			}
-	} );
-}
-function ajaxActionWafNginxServers(action, id) {
-	$.ajax( {
-		url: "options.py",
-			data: {
-				action_waf_nginx: action,
-				serv: id,
-				token: $('#token').val()
-			},
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else if( data ==  'Bad config, check please ' ) {
-					toastr.error(data);
-				} else {
-					setTimeout(showOverviewWaf(ip, hostnamea), 2000)
-				}
-			},
-			error: function(){
-				alert(w.data_error);
-			}
-	} );
-}
 $( function() {
 	try {
-		if ((cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[1].split('=')[0] == 'serv') || cur_url[0] == 'overview.py') {
+		if ((cur_url[0] == 'service' && cur_url[2] != '') || cur_url[0] == '') {
 			ChartsIntervalId = setInterval(updatingCpuRamCharts, 30000);
 			$(window).focus(function () {
 				ChartsIntervalId = setInterval(updatingCpuRamCharts, 30000);
@@ -335,7 +157,7 @@ $( function() {
 		console.log(e);
 	}
 	try {
-		if (cur_url[0] == 'overview.py') {
+		if (cur_url[0] == '') {
 			UsersShowIntervalId = setInterval(showUsersOverview, 600000);
 			$(window).focus(function () {
 				UsersShowIntervalId = setInterval(showUsersOverview, 600000);
@@ -380,7 +202,7 @@ $( function() {
 		$("#show-all-haproxy-wi-log").css("display", "block");
 	});
 
-	if (cur_url[0] == "overview.py" || cur_url[0] == "waf.py" || cur_url[0] == "metrics.py") {
+	if (cur_url[0] == "" || cur_url[0] == "waf" || cur_url[0] == "metrics") {
 		$('#secIntervals').css('display', 'none');
 	}
 	$('#apply_close').click( function() {
@@ -390,14 +212,15 @@ $( function() {
 	$( ".server-act-links" ).change(function() {
 		var id = $(this).attr('id').split('-');
 
-		try {
-			var service_name = id[2]
- 		}
-		catch (err) {
-			var service_name = 'haproxy'
-		}
+		if (cur_url[0] != 'portscanner') {
+			try {
+				var service_name = id[2]
+			} catch (err) {
+				var service_name = 'haproxy'
+			}
 
-		updateHapWIServer(id[1], service_name)
+			updateHapWIServer(id[1], service_name)
+		}
 	});
 });
 function confirmAjaxAction(action, service, id) {
@@ -414,7 +237,7 @@ function confirmAjaxAction(action, service, id) {
 			click: function () {
 				$(this).dialog("close");
 				if (service == "haproxy") {
-					ajaxActionServers(action, id);
+					ajaxActionServers(action, id, service);
 					if (action == "restart" || action == "reload") {
 						if (localStorage.getItem('restart')) {
 							localStorage.removeItem('restart');
@@ -422,15 +245,15 @@ function confirmAjaxAction(action, service, id) {
 						}
 					}
 				} else if (service == "waf") {
-					ajaxActionWafServers(action, id)
+					ajaxActionServers(action, id, 'waf_haproxy');
 				} else if (service == "nginx") {
-					ajaxActionNginxServers(action, id)
+					ajaxActionServers(action, id, service);
 				} else if (service == "keepalived") {
-					ajaxActionKeepalivedServers(action, id)
+					ajaxActionServers(action, id, service);
 				} else if (service == "apache") {
-					ajaxActionApacheServers(action, id)
+					ajaxActionServers(action, id, service);
 				} else if (service == "waf_nginx") {
-					ajaxActionWafNginxServers(action, id)
+					ajaxActionServers(action, id, service);
 				}
 			}
 		}, {
@@ -445,65 +268,62 @@ function updateHapWIServer(id, service_name) {
 	var alert_en = 0;
 	var metrics = 0;
 	var active = 0;
-	if ($('#alert-'+id).is(':checked')) {
+	if ($('#alert-' + id).is(':checked')) {
 		alert_en = '1';
 	}
-	if ($('#metrics-'+id).is(':checked')) {
+	if ($('#metrics-' + id).is(':checked')) {
 		metrics = '1';
 	}
-	if ($('#active-'+id).is(':checked')) {
+	if ($('#active-' + id).is(':checked')) {
 		active = '1';
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/service/" + service_name + "/tools/update",
 		data: {
-			updatehapwiserver: id,
-			name: $('#server-name-'+id).val(),
+			server_id: id,
+			name: $('#server-name-' + id).val(),
 			metrics: metrics,
 			alert_en: alert_en,
 			active: active,
-			service_name: service_name,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
-				$("#server-"+id+"-"+service_name).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#server-"+id+"-"+service_name).removeClass( "update" );
-				}, 2500 );
+				$("#server-" + id + "-" + service_name).addClass("update", 1000);
+				setTimeout(function () {
+					$("#server-" + id + "-" + service_name).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function change_pos(pos, id) {
-	$.ajax( {
-		url: "options.py",
-			data: {
-				change_pos: pos,
-				pos_server_id: id,
-				token: $('#token').val()
-			},
-		error: function(){
+	$.ajax({
+		url: "/app/service/position/" + id + "/" + pos,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		error: function () {
 			console.log(w.data_error);
 		}
-	} );
+	});
 }
 function showBytes(serv) {
 	$.ajax( {
-		url: "options.py",
+		url: "/app/service/haproxy/bytes",
 		data: {
-			showBytes: serv,
-			token: $('#token').val()
+			showBytes: serv
 		},
 		type: "POST",
 		beforeSend: function() {
-			$("#show_bin_bout").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />');
-			$("#sessions").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />');
+			$("#show_bin_bout").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />');
+			$("#sessions").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />');
 		},
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
@@ -518,14 +338,13 @@ function showBytes(serv) {
 }
 function showNginxConnections(serv) {
 	$.ajax( {
-		url: "options.py",
+		url: "/app/service/nginx/connections",
 		data: {
-			nginxConnections: serv,
-			token: $('#token').val()
+			nginxConnections: serv
 		},
 		type: "POST",
 		beforeSend: function() {
-			$("#sessions").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />');
+			$("#sessions").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />');
 		},
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
@@ -540,14 +359,13 @@ function showNginxConnections(serv) {
 }
 function showApachekBytes(serv) {
 	$.ajax( {
-		url: "options.py",
+		url: "/app/service/apache/bytes",
 		data: {
-			apachekBytes: serv,
-			token: $('#token').val()
+			apachekBytes: serv
 		},
 		type: "POST",
 		beforeSend: function() {
-			$("#sessions").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />');
+			$("#sessions").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />');
 		},
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
@@ -562,14 +380,13 @@ function showApachekBytes(serv) {
 }
 function keepalivedBecameMaster(serv) {
 	$.ajax( {
-		url: "options.py",
+		url: "/app/service/keepalived/become-master",
 		data: {
-			keepalivedBecameMaster: serv,
-			token: $('#token').val()
+			keepalivedBecameMaster: serv
 		},
 		type: "POST",
 		beforeSend: function() {
-			$("#bin_bout").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />');
+			$("#bin_bout").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />');
 		},
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
@@ -584,14 +401,14 @@ function keepalivedBecameMaster(serv) {
 }
 function showUsersOverview() {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			show_users_ovw: 1,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "overview/users",
+		// data: {
+		// 	show_users_ovw: 1,
+		// 	token: $('#token').val()
+		// },
+		type: "GET",
 		beforeSend: function() {
-			$("#users-table").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/inc/images/loading.gif" />');
+			$("#users-table").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/app/static/images/loading.gif" />');
 		},
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
@@ -605,14 +422,14 @@ function showUsersOverview() {
 }
 function showSubOverview() {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			show_sub_ovw: 1,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/overview/sub",
+		// data: {
+		// 	show_sub_ovw: 1,
+		// 	token: $('#token').val()
+		// },
+		type: "GET",
 		beforeSend: function() {
-			$("#sub-table").html('<img class="loading_small_bin_bout" style="padding-left: 40%;padding-top: 40px;padding-bottom: 40px;" src="/inc/images/loading.gif" />');
+			$("#sub-table").html('<img class="loading_small_bin_bout" style="padding-left: 40%;padding-top: 40px;padding-bottom: 40px;" src="/app/static/images/loading.gif" />');
 		},
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
@@ -631,26 +448,24 @@ function serverSettings(id, name) {
 	var for_word = $('#translate').attr('data-for');
 	var service = $('#service').val();
 	$.ajax({
-		url: "options.py",
-		data: {
-			serverSettings: id,
-			serverSettingsService: service,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/service/settings/" + service + "/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
 			} else {
 				$("#dialog-settings-service").html(data)
-				$( "input[type=checkbox]" ).checkboxradio();
+				$("input[type=checkbox]").checkboxradio();
 				$("#dialog-settings-service").dialog({
 					resizable: false,
 					height: "auto",
 					width: 400,
 					modal: true,
-					title: settings_word + " "+for_word+" " + name,
+					title: settings_word + " " + for_word + " " + name,
 					buttons: [{
 						text: save_word,
 						click: function () {
@@ -694,10 +509,9 @@ function serverSettingsSave(id, name, service, dialog_id) {
 		service_restart = '1';
 	}
 	$.ajax({
-		url: "options.py",
+		url: "/app/service/settings/" + service,
 		data: {
 			serverSettingsSave: id,
-			serverSettingsService: service,
 			serverSettingsEnterprise: haproxy_enterprise,
 			serverSettingsDockerized: service_dockerized,
 			serverSettingsRestart: service_restart,
@@ -717,19 +531,17 @@ function serverSettingsSave(id, name, service, dialog_id) {
 }
 function check_service_status(id, ip, service) {
 	NProgress.configure({showSpinner: false});
+	if (service == 'keepalived') return false;
 	$.ajax({
-		url: "options.py",
+		url: "/app/service/action/check-service",
 		data: {
-			act: 'check_service',
 			service: service,
-			serv: ip,
-			server_id: id,
-			token: $('#token').val()
+			server_ip: ip
 		},
 		type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
-			if (cur_url[0] == 'hapservers.py') {
+			if (cur_url[0] == 'service') {
 				if (data.indexOf('up') != '-1') {
 					$('#div-server-' + id).addClass('div-server-head-up');
 					$('#div-server-' + id).removeClass('div-server-head-down');
@@ -737,7 +549,7 @@ function check_service_status(id, ip, service) {
 					$('#div-server-' + id).removeClass('div-server-head-up');
 					$('#div-server-' + id).addClass('div-server-head-down');
 				}
-			} else if (cur_url[0] == 'overview.py') {
+			} else if (cur_url[0] == '') {
 				let span_id = $('#' + service + "_" + id);
 				if (data.indexOf('up') != '-1') {
 					span_id.addClass('serverUp');
diff --git a/inc/provisioning.js b/inc/provisioning.js
deleted file mode 100644
index 064b0a60..00000000
--- a/inc/provisioning.js
+++ /dev/null
@@ -1,2050 +0,0 @@
-$( function() {
-    $('#add-provider-button').click(function() {
-		addProvidersChoosing.dialog('open');
-	});
-    $('#create-provider-button').click(function() {
-		createProvidersChoosing.dialog('open');
-	});
-    $('#do_create_ssh_choose').on('selectmenuchange', function (){
-    	if ($('#do_create_ssh_choose option:selected').val() == 'ssh_name') {
-    		$('#do_create_ssh_name_tr').show();
-    		$('#do_create_ssh_ids_tr').hide();
-		} else if ($('#do_create_ssh_choose option:selected').val() == 'ssh_ids') {
-    		$('#do_create_ssh_name_tr').hide();
-    		$('#do_create_ssh_ids_tr').show();
-		}
-	});
-    $('#gcore_create_network_type').on('selectmenuchange', function (){
-    	if ($('#gcore_create_network_type option:selected').val() == 'any_subnet') {
-    		$('#gcore_any_subnet').show();
-		} else if ($('#gcore_create_network_type option:selected').val() == 'external') {
-    		$('#gcore_any_subnet').hide();
-		}
-	});
-    $('#gcore-instance-enter').on('click', function() {
-		$('#gcore_create_size').css('display', 'none');
-		$('#gcore-instance-enter').css('display', 'none');
-		$('#gcore_create_size').attr('id', 'gcore_create_size_select');
-		$("#gcore_create_size_select" ).selectmenu( "destroy" );
-		$("#gcore_create_size_select" ).css('display', 'none');
-		$('#gcore_create_size_text').attr('id', 'gcore_create_size');
-		$('#gcore_create_size').css('display', 'inline');
-		$('#gcore-instance-enter-select').css('display', 'inline');
-	});
-    $('#gcore-instance-enter-select').on('click', function() {
-		$('#gcore_create_size').css('display', 'none');
-		$('#gcore_create_size').attr('id', 'gcore_create_size_text');
-		$('#gcore_create_size_select').attr('id', 'gcore_create_size');
-		$("#gcore_create_size" ).selectmenu();
-		$("#gcore-instance-enter-select" ).css('display', 'none');
-		$('#gcore-instance-enter').css('display', 'inline');
-	});
-    $('#do-instance-enter').on('click', function() {
-		$('#do_create_size').css('display', 'none');
-		$('#do-instance-enter').css('display', 'none');
-		$('#do_create_size').attr('id', 'do_create_size_select');
-		$("#do_create_size_select" ).selectmenu( "destroy" );
-		$("#do_create_size_select" ).css('display', 'none');
-		$('#do_create_size_text').attr('id', 'do_create_size');
-		$('#do_create_size').css('display', 'inline');
-		$('#do-instance-enter-select').css('display', 'inline');
-	});
-    $('#do-instance-enter-select').on('click', function() {
-		$('#do_create_size').css('display', 'none');
-		$('#do_create_size').attr('id', 'do_create_size_text');
-		$('#do_create_size_select').attr('id', 'do_create_size');
-		$("#do_create_size" ).selectmenu();
-		$("#do-instance-enter-select" ).css('display', 'none');
-		$('#do-instance-enter').css('display', 'inline');
-	});
-});
-var addProvidersChoosing = $( "#add_providers_choosing" ).dialog({
-		autoOpen: false,
-		width: 250,
-		modal: true,
-		title: "Add a new provider",
-		buttons: {
-			"Add": function() {
-                addProvider($('#add_select_providers option:selected').val());
-                $( this ).dialog( "close" );
-                clearTips();
-			},
-			Cancel: function() {
-				$( this ).dialog( "close" );
-				clearTips();
-			}
-		}
-	});
-var createProvidersChoosing = $( "#create_providers_choosing" ).dialog({
-		autoOpen: false,
-		width: 250,
-		modal: true,
-		title: "Choose provider for provisioning",
-		buttons: {
-			"Choose": function() {
-                CreateServer($('#create_select_providers option:selected').val());
-                $( this ).dialog( "close" );
-                clearTips();
-			},
-			Cancel: function() {
-				$( this ).dialog( "close" );
-				clearTips();
-			}
-		}
-	});
-var awsProvider = $( "#aws_provider" ).dialog({
-	autoOpen: false,
-	width: 574,
-	modal: true,
-	title: "Add AWS as provider",
-	buttons: {
-	    "Add": function() {
-            addAwsProvider($( this ));
-            clearTips();
-        },
-        Cancel: function() {
-		    $( this ).dialog( "close" );
-			addProvidersChoosing.dialog('open');
-			clearTips();
-        }
-    }
-});
-var doProvider = $( "#do_provider" ).dialog({
-    autoOpen: false,
-	width: 574,
-	modal: true,
-	title: "Add DigitalOcean as provider",
-	buttons: {
-	    "Add": function() {
-            addDoProvider($( this ));
-            clearTips();
-        },
-        Cancel: function() {
-            $( this ).dialog( "close" );
-            addProvidersChoosing.dialog('open');
-            clearTips();
-        }
-    }
-});
-var gcoreProvider = $( "#gcore_provider" ).dialog({
-    autoOpen: false,
-	width: 574,
-	modal: true,
-	title: "Add G-Core Labs as provider",
-	buttons: {
-	    "Add": function() {
-            addGcoreProvider($( this ));
-            clearTips();
-        },
-        Cancel: function() {
-            $( this ).dialog( "close" );
-            addProvidersChoosing.dialog('open');
-            clearTips();
-        }
-    }
-});
-var doCreate = $( "#do_create" ).dialog({
-    autoOpen: false,
-	width: 574,
-	modal: true,
-	title: "Create a new Droplet in DigitalOcean",
-	buttons: {
-	    "Create": function() {
-            doCreateServer($(this));
-            clearTips();
-        },
-        Cancel: function() {
-            $( this ).dialog( "close" );
-            createProvidersChoosing.dialog('open');
-            clearTips();
-        }
-    }
-});
-var gcoreCreate = $( "#gcore_create" ).dialog({
-    autoOpen: false,
-	width: 574,
-	modal: true,
-	title: "Create a new Instance in G-Core Labs",
-	buttons: {
-	    "Create": function() {
-            gcoreCreateServer($(this));
-            clearTips();
-        },
-        Cancel: function() {
-            $( this ).dialog( "close" );
-            createProvidersChoosing.dialog('open');
-            clearTips();
-        }
-    }
-});
-var awsCreate = $( "#aws_create" ).dialog({
-    autoOpen: false,
-	width: 574,
-	modal: true,
-	title: "Create a new Instance in AWS",
-	buttons: {
-	    "Create": function() {
-            awsCreateServer($(this));
-        },
-        Cancel: function() {
-            $( this ).dialog( "close" );
-            createProvidersChoosing.dialog('open');
-            clearTips();
-        }
-    }
-});
-var creatingServer = $( "#server_creating" ).dialog({
-    autoOpen: false,
-    height: 420,
-	width: 574,
-	modal: true,
-	title: "Server is creating",
-	buttons: {
-        Close: function() {
-            $( this ).dialog( "close" );
-            $('#wait-mess').show();
-            cleanProvisioningProccess('#server_creating ul li', '#created-mess');
-            remove_button_after_server_created();
-            hideProvisioningError('#creating-error');
-            clearTips();
-        }
-    }
-});
-var editingServer = $( "#server_editing" ).dialog({
-    autoOpen: false,
-    height: 420,
-	width: 574,
-	modal: true,
-	title: "Server is editing",
-	buttons: {
-        Close: function() {
-            $( this ).dialog( "close" );
-            $('#editing-wait-mess').show();
-            cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
-            hideProvisioningError('#editing-error');
-            clearTips();
-            $('#edited-mess').html('');
-            $('#edited-mess').hide();
-        }
-    }
-});
-function addProvider(provider) {
-    if (provider == 'aws') {
-        awsProvider.dialog('open');
-    } else if (provider == 'do') {
-        doProvider.dialog('open');
-    } else if (provider == 'gcore') {
-        gcoreProvider.dialog('open');
-    } else {
-        toastr.error('Choose provider before adding');
-    }
-}
-function CreateServer(provider) {
-    if (provider == 'aws') {
-        awsCreate.dialog('open');
-    } else if (provider == 'do') {
-        doCreate.dialog('open');
-    } else if (provider == 'gcore') {
-        gcoreCreate.dialog('open');
-    } else {
-        toastr.error('Choose provider before creating server');
-    }
-}
-function doCreateServer(dialog_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#do_create_server_name') ).add( $('#do_create_size'))
-        .add( $('#do_create_regions') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#do_create_server_name'), "Server name", 1 );
-	valid = valid && checkLength( $('#do_create_size'), "Droplet size", 1 );
-	if (valid) {
-		clearTips();
-	    dialog_id.dialog('close');
-	    startCreatingServer('do');
-	}
-}
-function gcoreCreateServer(dialog_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#gcore_create_server_name') ).add( $('#gcore_create_size') ).add( $('#gcore_create_volume_size') )
-        .add( $('#gcore_create_project_name') ).add( $('#gcore_create_ssh_name') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#gcore_create_server_name'), "Server name", 1 );
-	valid = valid && checkLength( $('#gcore_create_size'), "Flavor", 1 );
-	valid = valid && checkLength( $('#gcore_create_project_name'), "Project", 1 );
-	valid = valid && checkLength( $('#gcore_create_ssh_name'), "SSH key pair name", 1 );
-	valid = valid && checkLength( $('#gcore_create_volume_size'), "Volume size ", 1 );
-	if (valid) {
-		clearTips();
-	    dialog_id.dialog('close');
-	    startCreatingServer('gcore');
-	}
-}
-function awsCreateServer(dialog_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#aws_create_server_name') ).add( $('#aws_create_size')).add( $('#aws_create_ssh_name'))
-        .add( $('#aws_create_volume_size'));
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#aws_create_server_name'), "Server name", 1 );
-	valid = valid && checkLength( $('#aws_create_size'), "Instance type", 1 );
-	valid = valid && checkLength( $('#aws_create_ssh_name'), "SSH key pair name", 1 );
-	valid = valid && checkLength( $('#aws_create_volume_size'), "Volume size", 1 );
-	if(valid) {
-	    clearTips();
-	    dialog_id.dialog('close');
-	    startCreatingServer('aws');
-    }
-}
-function awsEditServer(dialog_id, server_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#aws_edit_size')).add( $('#aws_edit_ssh_name')).add( $('#aws_edit_volume_size'));
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#aws_edit_size'), "Instance type", 1 );
-	valid = valid && checkLength( $('#aws_edit_ssh_name'), "SSH key pair name", 1 );
-	valid = valid && checkLength( $('#aws_edit_volume_size'), "Volume size", 1 );
-	if(valid) {
-	    clearTips();
-	    dialog_id.dialog('destroy');
-	    startEditingServer('aws', server_id);
-	    $('#editing-wait-mess').show();
-    }
-
-}
-function startCreatingServer(provider) {
-    $("#wait-mess").html(wait_mess);
-    creatingServer.dialog('open');
-    if (provider == 'aws') {
-        awsInitServer();
-    } else if (provider == 'do') {
-    	doInitServer();
-	} else if (provider == 'gcore') {
-    	gcoreInitServer();
-	}
-    $.getScript("/inc/fontawesome.min.js");
-}
-function startEditingServer(provider, server_id) {
-    $("#editing-wait-mess").html(wait_mess);
-    editingServer.dialog('open');
-    if (provider == 'aws') {
-        awsEditInitServer(server_id);
-    } else if (provider == 'do') {
-    	doEditInitServer(server_id);
-	} else if (provider == 'gcore') {
-    	gcoreEditInitServer(server_id);
-	}
-    $.getScript("/inc/fontawesome.min.js");
-}
-function awsInitServer() {
-    $('#creating-init').addClass('proccessing');
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awsinit: 1,
-		    token: $('#token').val()
-		},
-		type: "POST",
-        success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
-            } else {
-                showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress');
-                awsVarsServer();
-            }
-        }
-    } );
-}
-function awsVarsServer() {
-    var aws_create_floating_net = 'false';
-    var aws_create_firewall = 'false';
-    var aws_create_public_ip = 'false';
-    var aws_create_delete_on_termination = 'false';
-    if ($('#aws_create_firewall').is(':checked')) {
-		aws_create_firewall = 'true';
-	}
-    if ($('#aws_create_delete_on_termination').is(':checked')) {
-		aws_create_delete_on_termination = 'true';
-	}
-    if ($('#aws_create_public_ip option:selected').val() == 'public') {
-		aws_create_public_ip = 'true';
-	} else if ($('#aws_create_public_ip option:selected').val() == 'elastic') {
-    	aws_create_floating_net = 'true';
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awsvars: $('#aws_create_server_name').val(),
-	        aws_create_group: $('#aws_create_group').val(),
-	        aws_create_provider: $('#aws_create_provider').val(),
-	        aws_create_regions: $('#aws_create_regions').val(),
-	        aws_create_size: $('#aws_create_size').val(),
-	        aws_create_oss: $('#aws_create_oss').val(),
-	        aws_create_ssh_name: $('#aws_create_ssh_name').val(),
-	        aws_create_volume_size: $('#aws_create_volume_size').val(),
-	        aws_create_volume_type: $('#aws_create_volume_type').val(),
-	        delete_on_termination: aws_create_delete_on_termination,
-	        aws_create_floating_net: aws_create_floating_net,
-	        aws_create_firewall: aws_create_firewall,
-	        aws_create_public_ip: aws_create_public_ip,
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
-            } else {
-                showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress');
-                awsValidateServer();
-            }
-        }
-    } );
-}
-function awsValidateServer() {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awsvalidate: $('#aws_create_server_name').val(),
-            aws_create_group: $('#aws_create_group').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
-            } else {
-                showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress');
-                awsWorkspaceServer();
-            }
-        }
-    } );
-}
-function awsWorkspaceServer() {
-    var aws_create_floating_net = 0;
-    var aws_create_firewall = 0;
-    var aws_create_public_ip = 0;
-    var aws_create_delete_on_termination = 0;
-    if ($('#aws_create_firewall').is(':checked')) {
-		aws_create_firewall = 1;
-	}
-    if ($('#aws_create_delete_on_termination').is(':checked')) {
-		aws_create_delete_on_termination = 1;
-	}
-	if ($('#aws_create_public_ip option:selected').val() == 'public') {
-		aws_create_public_ip = 1;
-	} else if ($('#aws_create_public_ip option:selected').val() == 'elastic') {
-    	aws_create_floating_net = 1;
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awsworkspace: $('#aws_create_server_name').val(),
-            aws_create_group: $('#aws_create_group').val(),
-	        aws_create_provider: $('#aws_create_provider option:selected').val(),
-	        aws_create_regions: $('#aws_create_regions').val(),
-	        aws_create_size: $('#aws_create_size').val(),
-	        aws_create_oss: $('#aws_create_oss option:selected').val(),
-	        aws_create_ssh_name: $('#aws_create_ssh_name').val(),
-	        aws_create_volume_size: $('#aws_create_volume_size').val(),
-	        aws_create_volume_type: $('#aws_create_volume_type').val(),
-	        aws_create_delete_on_termination: aws_create_delete_on_termination,
-	        aws_create_floating_net: aws_create_floating_net,
-	        aws_create_firewall: aws_create_firewall,
-	        aws_create_public_ip: aws_create_public_ip,
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
-            } else {
-                showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress');
-                common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data);
-                awsProvisiningServer();
-            }
-        }
-    } );
-}
-function awsProvisiningServer() {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			awsprovisining: 1,
-			provisioning_workspace: $('#aws_create_server_name').val(),
-			provisioning_group: $('#aws_create_group').val(),
-			provider_id: $('#aws_create_provider').val(),
-			provisioning_action: 'created',
-			provisioning_cloud: 'aws',
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            var server_id = $('#ajax-provisioning-body tr td span:regex(id, server-ip-)').last().attr('id').split('-')[2]
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'aws');
-                $('#sever-status-'+server_id).text('Error');
-                $('#sever-status-'+server_id).attr('title', data);
-               	$('#sever-status-'+server_id).css('color', 'red');
-            } else {
-                showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress');
-                $('#wait-mess').hide();
-                $('#created-mess').html('Server has been created. Server IPs are:' + data);
-                $('#created-mess').show();
-                $('#sever-status-'+server_id).text('Created');
-                $('#server-ip-'+server_id).text(data);
-				$('#sever-status-'+server_id).css('color', 'var(--green-color)');
-                add_button_after_server_created();
-            }
-        }
-    } );
-}
-function awsEditInitServer(server_id) {
-    $('#editing-init').addClass('proccessing');
-    $('#server-'+server_id).css('background-color', '#fff3cd');
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awsinit: 1,
-		    token: $('#token').val()
-		},
-		type: "POST",
-        success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
-                $('#server-'+server_id).css('background-color', '#fff');
-                add_button_after_server_edited(server_id)
-            } else {
-                showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress');
-                awsEditingVarsServer(server_id);
-            }
-        }
-    } );
-}
-function awsEditingVarsServer(server_id) {
-    var aws_edit_floating_net = 'false';
-    var aws_editing_firewall = 'false';
-    var aws_edit_public_ip = 'false';
-    var aws_edit_delete_on_termination = 'false';
-    if ($('#aws_edit_firewall').is(':checked')) {
-		aws_editing_firewall = 'true';
-	}
-    if ($('#aws_edit_delete_on_termination').is(':checked')) {
-		aws_edit_delete_on_termination = 'true';
-	}
-    if ($('#aws_edit_public_ip option:selected').val() == 'public') {
-		aws_edit_public_ip = 'true';
-	} else if ($('#aws_edit_public_ip option:selected').val() == 'elastic') {
-    	aws_edit_floating_net = 'true';
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awseditvars: $('#aws_edit_server_name').text(),
-	        aws_editing_group: $('#aws_edit_group').val(),
-	        aws_editing_provider: $('#aws_edit_id_provider option:selected').val(),
-	        aws_editing_regions: $('#aws_edit_region').text(),
-	        aws_editing_size: $('#aws_edit_size').val(),
-	        aws_editing_oss: $('#aws_edit_oss option:selected').val(),
-	        aws_editing_ssh_name: $('#aws_edit_ssh_name').val(),
-	        aws_editing_volume_size: $('#aws_edit_volume_size').val(),
-	        aws_editing_volume_type: $('#aws_edit_volume_type').val(),
-	        aws_editing_delete_on_termination: aws_edit_delete_on_termination,
-	        aws_editing_floating_net: aws_edit_floating_net,
-	        aws_editing_firewall: aws_editing_firewall,
-	        aws_editing_public_ip: aws_edit_public_ip,
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
-                $('#server-'+server_id).css('background-color', '#fff');
-                add_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress');
-                awsEditValidateServer(server_id);
-            }
-        }
-    } );
-}
-function awsEditValidateServer(server_id) {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awseditvalidate: $('#aws_edit_server_name').text(),
-            aws_edit_group: $('#aws_edit_group').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
-                $('#server-'+server_id).css('background-color', '#fff');
-                add_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress');
-                awsEditWorkspaceServer(server_id);
-            }
-        }
-    } );
-}
-function awsEditWorkspaceServer(server_id) {
-    var aws_edit_floating_net = 0;
-    var aws_editing_firewall = 0;
-    var aws_edit_public_ip = 0;
-    var aws_edit_delete_on_termination = 0;
-    if ($('#aws_edit_firewall').is(':checked')) {
-		aws_editing_firewall = 1;
-	}
-    if ($('#aws_edit_delete_on_termination').is(':checked')) {
-		aws_edit_delete_on_termination = 1;
-	}
-    if ($('#aws_edit_public_ip option:selected').val() == 'public') {
-		aws_edit_public_ip = 1;
-	} else if ($('#aws_edit_public_ip option:selected').val() == 'elastic') {
-    	aws_edit_floating_net = 1;
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        awseditworkspace: $('#aws_edit_server_name').text(),
-	        aws_editing_group: $('#aws_edit_group').val(),
-	        aws_editing_provider: $('#aws_edit_id_provider option:selected').val(),
-	        aws_editing_regions: $('#aws_edit_region').text(),
-	        aws_editing_size: $('#aws_edit_size').val(),
-	        aws_editing_oss: $('#aws_edit_oss option:selected').val(),
-	        aws_editing_ssh_name: $('#aws_edit_ssh_name').val(),
-	        aws_editing_volume_size: $('#aws_edit_volume_size').val(),
-	        aws_editing_volume_type: $('#aws_edit_volume_type').val(),
-	        aws_editing_delete_on_termination: aws_edit_delete_on_termination,
-	        aws_editing_floating_net: aws_edit_floating_net,
-	        aws_editing_firewall: aws_editing_firewall,
-	        aws_editing_public_ip: aws_edit_public_ip,
-            server_id: server_id,
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
-                showEditProvisioningError(data, server_id);
-                add_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress');
-                $('#sever-status-'+server_id).text('Editing');
-                $('#sever-status-'+server_id).css('color', '#000');
-                awsEditProvisiningServer(server_id);
-            }
-        }
-    } );
-}
-function awsEditProvisiningServer(server_id, dialog_id) {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			awseditingprovisining: 1,
-			provisioning_workspace: $('#aws_edit_server_name').text(),
-			provisioning_group: $('#aws_edit_group').val(),
-			provisioning_provider_id: $('#aws_edit_id_provider option:selected').val(),
-			provisioning_action: 'modified',
-			provisioning_cloud: 'aws',
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws');
-                showEditProvisioningError(data, server_id);
-                add_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress');
-                $('#editing-wait-mess').hide();
-                $('#edited-mess').html('Server has been changed. IPs are: ' + data);
-                $('#edited-mess').show();
-                $('#sever-status-'+server_id).text('Created');
-	            $('#sever-size-'+server_id).text($('#aws_edit_size').val());
-	            $('#sever-os-'+server_id).text($('#aws_edit_oss').val());
-	            $('#server-'+server_id).css('background-color', '#fff');
-	            $('#sever-status-'+server_id).css('color', '#000');
-	            $('#server-ip-'+server_id).text(data);
-            }
-        }
-    } );
-}
-function confirmDeleteProvisionedServer(id) {
-	 $( "#dialog-confirm" ).dialog({
-      resizable: false,
-      height: "auto",
-      width: 400,
-      modal: true,
-	  title: "Are you sure you want to delete " +$('#server-name-'+id).text() + "?",
-      buttons: {
-        "Delete": function() {
-			$( this ).dialog( "close" );
-			deleteProvisionedServer(id);
-        },
-        Cancel: function() {
-			$( this ).dialog( "close" );
-        }
-      }
-    });
-}
-function deleteProvisionedServer(id) {
-	$("#server-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
-		data: {
-			provisiningdestroyserver: id,
-			servername: $('#server-name-'+id).text(),
-			type: $('#server-cloud-'+id).text(),
-			provider_id: $('#server-provider-'+id).text(),
-			group: $('#server-group-'+id).text(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data == "ok ") {
-				$("#server-"+id).remove();
-			} else if (data.indexOf('error: ') != '-1') {
-				toastr.error(data);
-			} else if (data.indexOf('warning: ') != '-1') {
-				toastr.clear();
-				toastr.warning(data);
-			}
-		}
-	} );
-}
-function editAwsServer(id) {
-    $.ajax( {
-		url: "options.py",
-		data: {
-			editServerId: id,
-			editProviderName: 'aws',
-            editGroup: $('#server-group-'+id).text(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if (data.indexOf('error: ') != '-1') {
-				toastr.error(data);
-			} else if (data.indexOf('warning: ') != '-1') {
-				toastr.clear();
-				toastr.warning(data);
-			} else {
-			    $('#ajax').html(data);
-			    var awsEdit = $( "#aws_edit" ).dialog({
-                    autoOpen: false,
-                    width: 576,
-                    modal: true,
-                    title: "Editing AWS server: " + $('#server-name-'+id).text(),
-					close: function( event, ui ) {$( this ).dialog( "destroy" );},
-                    buttons: {
-                        "Edit": function() {
-                            awsEditServer($(this), id);
-                        },
-                        Cancel: function() {
-                            $( this ).dialog( "destroy" );
-                            clearTips();
-                        }
-                    }
-                });
-			    $( "select" ).selectmenu();
-			    $( "input[type=checkbox]" ).checkboxradio();
-			    $.getScript("/inc/fontawesome.min.js");
-			    awsEdit.dialog('open');
-            }
-		}
-	} );
-}
-function editGcoreServer(id) {
-    $.ajax( {
-		url: "options.py",
-		data: {
-			editServerId: id,
-			editProviderName: 'gcore',
-			editGroup: $('#server-group-' + id).text(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if (data.indexOf('error: ') != '-1') {
-				toastr.error(data);
-			} else if (data.indexOf('warning: ') != '-1') {
-				toastr.clear();
-				toastr.warning(data);
-			} else {
-			    $('#ajax').html(data);
-			    var gcoreEdit = $( "#gcore_edit" ).dialog({
-                    autoOpen: false,
-                    width: 576,
-                    modal: true,
-                    title: "Editing G-Core Labs server: " + $('#server-name-'+id).text(),
-					close: function( event, ui ) {$( this ).dialog( "destroy" );},
-                    buttons: {
-                        "Edit": function() {
-                            gcoreEditServer($(this), id);
-                        },
-                        Cancel: function() {
-                            $( this ).dialog( "destroy" );
-                            clearTips();
-                        }
-                    }
-                });
-			    $( "select" ).selectmenu();
-			    $( "input[type=checkbox]" ).checkboxradio();
-			    $.getScript("/inc/fontawesome.min.js");
-			    gcoreEdit.dialog('open');
-            }
-		}
-	} );
-}
-function editDoServer(id) {
-    $.ajax( {
-		url: "options.py",
-		data: {
-			editServerId: id,
-			editProviderName: 'do',
-			editGroup: $('#server-group-' + id).text(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if (data.indexOf('error: ') != '-1') {
-				toastr.error(data);
-			} else if (data.indexOf('warning: ') != '-1') {
-				toastr.clear();
-				toastr.warning(data);
-			} else {
-			    $('#ajax').html(data);
-			    var doEdit = $( "#do_edit" ).dialog({
-                    autoOpen: false,
-                    width: 576,
-                    modal: true,
-                    title: "Editing Do server: " + $('#server-name-'+id).text(),
-					close: function( event, ui ) {$( this ).dialog( "destroy" );},
-                    buttons: {
-                        "Edit": function() {
-                            doEditServer($(this), id);
-                        },
-                        Cancel: function() {
-                            $( this ).dialog( "destroy" );
-                            clearTips();
-                        }
-                    }
-                });
-			    $( "select" ).selectmenu();
-			    $( "input[type=checkbox]" ).checkboxradio();
-			    $.getScript("/inc/fontawesome.min.js");
-			    doEdit.dialog('open');
-            }
-		}
-	} );
-}
-function add_button_after_server_created() {
-    var buttons = creatingServer.dialog("option", "buttons");
-    $.extend(buttons, { Back: function() {
-            $( this ).dialog( "close" );
-            awsCreate.dialog( "open" );
-            cleanProvisioningProccess('#server_creating ul li', '#created-mess');
-            $('#wait-mess').show();
-            $('#edited-mess').html('');
-            $('#edited-mess').hide();
-            hideProvisioningError('#creating-error');
-        } });
-    creatingServer.dialog("option", "buttons", buttons);
-}
-function add_do_button_after_server_created() {
-    var buttons = creatingServer.dialog("option", "buttons");
-    $.extend(buttons, { Back: function() {
-            $( this ).dialog( "close" );
-            doCreate.dialog( "open" );
-			cleanProvisioningProccess('#server_creating ul li', '#created-mess');
-            $('#wait-mess').show();
-            $('#edited-mess').html('');
-            $('#edited-mess').hide();
-            hideProvisioningError('#creating-error');
-        } });
-    creatingServer.dialog("option", "buttons", buttons);
-}
-function add_gcore_button_after_server_created() {
-    var buttons = creatingServer.dialog("option", "buttons");
-    $.extend(buttons, { Back: function() {
-            $( this ).dialog( "close" );
-            gcoreCreate.dialog( "open" );
-			cleanProvisioningProccess('#server_creating ul li', '#created-mess');
-            $('#wait-mess').show();
-            $('#edited-mess').html('');
-            $('#edited-mess').hide();
-            hideProvisioningError('#creating-error');
-        } });
-    creatingServer.dialog("option", "buttons", buttons);
-}
-function add_button_after_server_edited(server_id) {
-    var buttons = editingServer.dialog("option", "buttons");
-    $.extend(buttons, { Back: function() {
-            $( this ).dialog( "close" );
-            editAwsServer(server_id)
-            cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
-            $('#wait-mess').show();
-            $('#edited-mess').html('');
-            $('#edited-mess').hide();
-            hideProvisioningError('#editing-error');
-        } });
-    editingServer.dialog("option", "buttons", buttons);
-}
-function add_gcore_button_after_server_edited(server_id) {
-    var buttons = editingServer.dialog("option", "buttons");
-    $.extend(buttons, { Back: function() {
-			$(this).dialog("close");
-			editGcoreServer(server_id)
-			cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
-			$('#wait-mess').show();
-			$('#edited-mess').html('');
-			$('#edited-mess').hide();
-			hideProvisioningError('#editing-error');
-		} });
-    editingServer.dialog("option", "buttons", buttons);
-}
-function add_do_button_after_server_edited(server_id) {
-    var buttons = editingServer.dialog("option", "buttons");
-    $.extend(buttons, { Back: function() {
-            $( this ).dialog( "close" );
-            editDoServer(server_id);
-            cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
-            $('#wait-mess').show();
-            $('#edited-mess').html('');
-            $('#edited-mess').hide();
-            hideProvisioningError('#editing-error');
-        } });
-    editingServer.dialog("option", "buttons", buttons);
-}
-function add_gcore_button_after_server_edited(server_id) {
-    var buttons = editingServer.dialog("option", "buttons");
-    $.extend(buttons, { Back: function() {
-            $( this ).dialog( "close" );
-            editGcoreServer(server_id);
-            cleanProvisioningProccess('#server_editing ul li', '#edited-mess');
-            $('#wait-mess').show();
-            $('#edited-mess').html('');
-            $('#edited-mess').hide();
-            hideProvisioningError('#editing-error');
-        } });
-    editingServer.dialog("option", "buttons", buttons);
-}
-function remove_button_after_server_created() {
-    creatingServer.dialog("option",{buttons:{ Close: function() {
-            $( this ).dialog( "close" );
-            $('#creating-error').hide();
-            $('#wait-mess').show();
-            cleanProvisioningProccess('#server_creating ul li', 'created-mess');
-            clearTips();
-        }}}
-    );
-}
-function hideProvisioningError(error_id) {
-    $(error_id).html('');
-	$(error_id).hide();
-}
-function showProvisioningError(data, step_id, prev_step_id, wait_mess, error_id, progress_id, cloud, step, server_id) {
-    $(wait_mess).hide();
-    $(error_id).html(data);
-	$(error_id).show();
-	$(prev_step_id).removeClass('proccessing');
-	$(step_id).addClass('processing_error');
-	$(progress_id).css('width', '0%');
-	if(cloud == 'aws') {
-		add_button_after_server_created();
-	} else if (cloud == 'do') {
-		add_do_button_after_server_created();
-	} else if (cloud == 'gcore') {
-		add_gcore_button_after_server_created();
-	}
-	$.getScript("/inc/fontawesome.min.js");
-}
-function showEditProvisioningError(data, server_id){
-	$('#server-'+server_id).css('background-color', '#fff');
-	$('#sever-status-'+server_id).text('Error');
-	$('#sever-status-'+server_id).attr('title', data);
-	$('#sever-status-'+server_id).css('color', 'red');
-	$('#sever-status-'+server_id).css('cursor', 'help');
-}
-function showProvisioningProccess(prev_step_id, step_id, next_step_id, progress_value, progress_id) {
-    $(prev_step_id).removeClass('proccessing');
-    $(step_id).addClass('proccessing_done');
-    $(step_id).removeClass('proccessing');
-    $(next_step_id).addClass('proccessing');
-    $(progress_id).css('width', progress_value+'%');
-    $.getScript("/inc/fontawesome.min.js");
-}
-function cleanProvisioningProccess(div_id, success_div) {
-    $(success_div).hide();
-    $(div_id).each(function () {
-        $(this).removeClass('proccessing_done');
-        $(this).removeClass('processing_error');
-        $(this).removeClass('proccessing');
-    });
-    $.getScript("/inc/fontawesome.min.js");
-}
-function addDoProvider(dialog_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#do_new_name') ).add( $('#do_new_group')).add( $('#do_new_token') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#do_new_name'), "Provider name", 1 );
-	valid = valid && checkLength( $('#do_new_group'), "Group", 1 );
-	valid = valid && checkLength( $('#do_new_token'), "Token", 1 );
-	if (valid) {
-		$.ajax( {
-			url: "options.py",
-			data: {
-			    new_provider_name: $('#do_new_name').val(),
-			    new_provider_group: $('#do_new_group').val(),
-			    new_provider_token: $('#do_new_token').val(),
-				new_provider_cloud: 'do',
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else {
-					var getId = new RegExp('[0-9]+');
-					var id = data.match(getId);
-					$('select:regex(id, do_create_provider)').append('<option value=' + id + '>' +$('#do_new_name').val()+'</option>').selectmenu("refresh");
-					common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data);
-				}
-			}
-		} );
-	}
-}
-function addGcoreProvider(dialog_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#gcore_new_name') ).add( $('#gcore_new_name')).add( $('#gcore_new_pass') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#gcore_new_name'), "Provider name", 1 );
-	valid = valid && checkLength( $('#gcore_new_name'), "User name", 1 );
-	valid = valid && checkLength( $('#gcore_new_pass'), "Password", 1 );
-	if (valid) {
-		$.ajax( {
-			url: "options.py",
-			data: {
-			    new_provider_name: $('#gcore_new_name').val(),
-			    new_provider_group: $('#gcore_new_group').val(),
-			    new_provider_token: $('#gcore_new_user').val(),
-			    gcore_new_pass: $('#gcore_new_pass').val(),
-				new_provider_cloud: 'gcore',
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else {
-					var getId = new RegExp('[0-9]+');
-					var id = data.match(getId);
-					$('select:regex(id, gcore_create_provider)').append('<option value=' + id + '>' +$('#gcore_new_name').val()+'</option>').selectmenu("refresh");
-					common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data);
-				}
-			}
-		} );
-	}
-}
-function addAwsProvider(dialog_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#aws_new_name') ).add( $('#aws_new_key') ).add( $('#aws_new_secret') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#aws_new_name'), "Provider name", 1 );
-	valid = valid && checkLength( $('#aws_new_key'), "ACCESS_KEY", 1 );
-	valid = valid && checkLength( $('#aws_new_secret'), "SECRET_KEY", 1 );
-	if (valid) {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				new_provider_name: $('#aws_new_name').val(),
-				new_provider_group: $('#aws_new_group').val(),
-				new_provider_token: $('#aws_new_key').val(),
-				aws_new_secret: $('#aws_new_secret').val(),
-				new_provider_cloud: 'aws',
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else {
-					var getId = new RegExp('[0-9]+');
-					var id = data.match(getId);
-					$('select:regex(id, aws_create_provider)').append('<option value=' + id + '>' +$('#aws_new_name').val()+'</option>').selectmenu("refresh");
-					common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data);
-				}
-			}
-		} );
-	}
-}
-function confirmDeleteProvider(id) {
-	 $( "#dialog-confirm" ).dialog({
-      width: 400,
-      modal: true,
-	  title: "Are you sure you want to delete " +$('#provider-name-'+id).val() + "?",
-      buttons: {
-        "Delete": function() {
-			$( this ).dialog( "close" );
-			removeProvider(id);
-        },
-        Cancel: function() {
-			$( this ).dialog( "close" );
-        }
-      }
-    });
-}
-function removeProvider(id) {
-	$("#provider-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
-		data: {
-			providerdel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
-				$("#provider-"+id).remove();
-			} else if (data.indexOf('error:') != '-1') {
-				toastr.error(data);
-			}
-		}
-	} );
-}
-var doEditProvider = $( "#do_edit_provider" ).dialog({
-    autoOpen: false,
-    width: 574,
-    modal: true,
-    title: "Editing DigitalOcean provider",
-    buttons: {
-        "Edit": function() {
-            doEditProviderSave();
-        },
-        Cancel: function() {
-            $( this ).dialog( "close" );
-            clearTips();
-        }
-    }
-});
-function editDoProvider(id) {
-    $('#do_edit_provider_id').val(id);
-    name = $('#provider-name-'+id).text();
-    $('#do_edit_provider_name').val(name);
-    doEditProvider.dialog('open');
-}
-function doEditProviderSave() {
-    var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#do_edit_provider_name')).add( $('#do_edit_provider_token') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#do_edit_provider_name'), "Provider name", 1 );
-	valid = valid && checkLength( $('#do_edit_provider_token'), "Token", 1 );
-	if(valid) {
-	    doEditProvider.dialog( "close" );
-        id = $('#do_edit_provider_id').val();
-        token = $('#do_edit_provider_token').val();
-        new_name = $('#do_edit_provider_name').val();
-        $.ajax({
-            url: "options.py",
-            data: {
-				edit_provider_id: id,
-				provider_name: 'do',
-				edit_do_provider_name: new_name,
-				edit_do_provider_token: token,
-				token: $('#token').val()
-			},
-            type: "POST",
-            success: function (data) {
-                data = data.replace(/\s+/g, ' ');
-                if (data == "ok ") {
-                    $("#provider-name-" + id).text(new_name);
-                    $("#provider-" + id).addClass("update", 1000);
-                    setTimeout(function () {
-                        $("#provider-" + id).removeClass("update");
-                    }, 2500);
-                    $('#provider-edited-date-' + id).text(returnFormatedDate())
-                } else if (data.indexOf('error:') != '-1') {
-                    toastr.error(data);
-                }
-            }
-        });
-    }
-}
-var gcoreEditProvider = $( "#gcore_edit_provider" ).dialog({
-    autoOpen: false,
-    width: 574,
-    modal: true,
-    title: "Editing G-Core Labs provider",
-    buttons: {
-        "Edit": function() {
-            gcoreEditProviderSave();
-        },
-        Cancel: function() {
-            $( this ).dialog( "close" );
-            clearTips();
-        }
-    }
-});
-function editGcoreProvider(id) {
-    $('#gcore_edit_provider_id').val(id);
-    name = $('#provider-name-'+id).text();
-    $('#gcore_edit_provider_name').val(name);
-    gcoreEditProvider.dialog('open');
-}
-function gcoreEditProviderSave() {
-    var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#gcore_edit_provider_name')).add( $('#gcore_edit_provider_user') ).add( $('#gcore_edit_provider_password'));
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#gcore_edit_provider_name'), "User name", 1 );
-	valid = valid && checkLength( $('#gcore_edit_provider_user'), "Provider name", 1 );
-	valid = valid && checkLength( $('#gcore_edit_provider_password'), "Password", 1 );
-	if(valid) {
-	    gcoreEditProvider.dialog('close');
-	    clearTips();
-        id = $('#gcore_edit_provider_id').val();
-        username = $('#gcore_edit_provider_user').val();
-        pass = $('#gcore_edit_provider_password').val();
-        new_name = $('#gcore_edit_provider_name').val();
-        $.ajax({
-            url: "options.py",
-            data: {
-				edit_provider_id: id,
-				provider_name: 'gcore',
-				edit_gcore_provider_name: new_name,
-				edit_gcore_provider_user: username,
-				edit_gcore_provider_pass: pass,
-				token: $('#token').val()
-			},
-            type: "POST",
-            success: function (data) {
-                data = data.replace(/\s+/g, ' ');
-                if (data == "ok ") {
-                    $("#provider-name-" + id).text(new_name);
-                    $("#provider-" + id).addClass("update", 1000);
-                    setTimeout(function () {
-                        $("#provider-" + id).removeClass("update");
-                    }, 2500);
-                    $('#provider-edited-date-' + id).text(returnFormatedDate())
-                } else if (data.indexOf('error:') != '-1') {
-                    toastr.error(data);
-                }
-            }
-        });
-    }
-}
-var awsEditProvider = $("#aws_edit_provider").dialog({
-    autoOpen: false,
-    width: 574,
-    modal: true,
-    title: "Editing AWS provider",
-    buttons: {
-        "Edit": function () {
-            awsEditProviderSave($(this));
-        },
-        Cancel: function () {
-            $(this).dialog("close");
-            clearTips();
-        }
-    }
-});
-function editAwsProvider(id) {
-    $('#aws_edit_provider_id').val(id);
-    name = $('#provider-name-' + id).text();
-    $('#aws_edit_provider_name').val(name);
-    awsEditProvider.dialog('open');
-}
-function awsEditProviderSave() {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#aws_edit_provider_name')).add( $('#aws_edit_provider_key') ).add($('#aws_edit_provider_secret'));
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#aws_edit_provider_name'), "Provider name", 1 );
-	valid = valid && checkLength( $('#aws_edit_provider_key'), "ACCESS_KEY", 1 );
-	valid = valid && checkLength( $('#aws_edit_provider_secret'), "ACCESS_SECRET", 1 );
-	if(valid) {
-        awsEditProvider.dialog("close");
-        id = $('#aws_edit_provider_id').val();
-        new_name = $('#aws_edit_provider_name').val();
-        key = $('#aws_edit_provider_key').val();
-        secret = $('#aws_edit_provider_secret').val();
-        $.ajax({
-            url: "options.py",
-            data: {
-				edit_provider_id: id,
-				provider_name: 'aws',
-				edit_aws_provider_name: new_name,
-				edit_aws_provider_key: key,
-				edit_aws_provider_secret: secret,
-				token: $('#token').val()
-			},
-            type: "POST",
-            success: function (data) {
-                data = data.replace(/\s+/g, ' ');
-                if (data == "ok ") {
-                    $("#provider-name-" + id).text(new_name);
-                    $("#provider-" + id).addClass("update", 1000);
-                    $('#provider-edited-date-' + id).text(returnFormatedDate())
-                    setTimeout(function () {
-                        $("#provider-" + id).removeClass("update");
-                    }, 2500);
-                } else if (data.indexOf('error:') != '-1') {
-                    toastr.error(data);
-                }
-            }
-        });
-    }
-}
-function doEditServer(dialog_id, server_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#do_edit_size'));
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#do_edit_size'), "Droplet size", 1 );
-	if (valid) {
-		clearTips();
-	    dialog_id.dialog('destroy');
-	    startEditingServer('do', server_id);
-	    $('#editing-wait-mess').show();
-	}
-}
-function doInitServer() {
-    $('#creating-init').addClass('proccessing');
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        doinit: 1,
-		    token: $('#token').val()
-		},
-		type: "POST",
-        success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'do');
-            } else {
-                showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress');
-                doVarsServer();
-            }
-        }
-    } );
-}
-
-function doEditInitServer(server_id) {
-    $('#editing-init').addClass('proccessing');
-    $('#server-'+server_id).css('background-color', '#fff3cd');
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        doinit: 1,
-		    token: $('#token').val()
-		},
-		type: "POST",
-        success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
-                $('#server-'+server_id).css('background-color', '#fff');
-                add_do_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress');
-                doEditVarsServer(server_id);
-            }
-        }
-    } );
-}
-function doEditVarsServer(server_id) {
-	var do_edit_private_net = 'false';
-	var do_edit_floating_net = 'false';
-	var do_edit_monitoring = 'false';
-	var do_edit_backup = 'false';
-	var do_edit_firewall = 'false';
-	if ($('#do_edit_private_networking').is(':checked')) {
-		do_edit_private_net = 'true';
-	}
-	if ($('#do_edit_floating_ip').is(':checked')) {
-		do_edit_floating_net = 'true';
-	}
-	if ($('#do_edit_monitoring').is(':checked')) {
-		do_edit_monitoring = 'true';
-	}
-	if ($('#do_edit_backup').is(':checked')) {
-		do_edit_backup = 'true';
-	}
-	if ($('#do_edit_firewall').is(':checked')) {
-		do_edit_firewall = 'true';
-	}
-	$.ajax({
-		url: "options.py",
-		data: {
-			doeditvars: $('#do_edit_server_name').text(),
-			do_edit_group: $('#do_edit_group').val(),
-			do_edit_provider: $('#do_edit_id_provider').val(),
-			do_edit_regions: $('#do_edit_regions').text(),
-			do_edit_size: $('#do_edit_size').val(),
-			do_edit_oss: $('#do_edit_oss').val(),
-			do_edit_ssh_name: $('#do_edit_ssh_name').val(),
-			do_edit_ssh_ids: $('#do_edit_ssh_ids').val(),
-			do_edit_backup: do_edit_backup,
-			do_edit_private_net: do_edit_private_net,
-			do_edit_floating_net: do_edit_floating_net,
-			do_edit_monitoring: do_edit_monitoring,
-			do_edit_firewall: do_edit_firewall,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function (data) {
-			data = data.replace(/\s+/g, ' ');
-			if (data.indexOf('error:') != '-1') {
-				showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
-				$('#server-'+server_id).css('background-color', '#fff');
-				add_do_button_after_server_edited(server_id);
-			} else {
-				showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress');
-				doEditValidateServer(server_id)
-			}
-		}
-	});
-}
-function doEditValidateServer(server_id) {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			doeditvalidate: $('#do_edit_server_name').text(),
-			do_edit_group: $('#do_edit_group').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
-            	$('#server-'+server_id).css('background-color', '#fff');
-            	add_do_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress');
-                doEditWorkspaceServer(server_id);
-            }
-        }
-    } );
-}
-function doEditWorkspaceServer(server_id) {
-    var do_edit_private_net = 0;
-	var do_edit_floating_net = 0;
-	var do_edit_monitoring = 0;
-	var do_edit_backup = 0;
-	var do_edit_firewall = 0;
-	if ($('#do_edit_private_networking').is(':checked')) {
-		do_edit_private_net = 1;
-	}
-	if ($('#do_edit_floating_ip').is(':checked')) {
-		do_edit_floating_net = 1;
-	}
-	if ($('#do_edit_monitoring').is(':checked')) {
-		do_edit_monitoring = 1;
-	}
-	if ($('#do_edit_backup').is(':checked')) {
-		do_edit_backup = 1;
-	}
-	if ($('#do_edit_firewall').is(':checked')) {
-		do_edit_firewall = 1;
-	}
-	$.ajax({
-		url: "options.py",
-		data: {
-			doeditworkspace: $('#do_edit_server_name').text(),
-			do_edit_group: $('#do_edit_group').val(),
-			do_edit_provider: $('#do_edit_id_provider').val(),
-			do_edit_regions: $('#do_edit_regions').text(),
-			do_edit_size: $('#do_edit_size').val(),
-			do_edit_oss: $('#do_edit_oss').val(),
-			do_edit_ssh_name: $('#do_edit_ssh_name').val(),
-			do_edit_ssh_ids: $('#do_edit_ssh_ids').val(),
-			do_edit_private_net: do_edit_private_net,
-			do_edit_floating_net: do_edit_floating_net,
-			do_edit_monitoring: do_edit_monitoring,
-			do_edit_backup: do_edit_backup,
-			do_edit_firewall: do_edit_firewall,
-			server_id: server_id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
-				showEditProvisioningError(data, server_id);
-				add_do_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress');
-                $('#sever-status-'+server_id).text('Editing');
-                $('#sever-status-'+server_id).css('color', '#000');
-                doEditProvisiningServer(server_id);
-            }
-        }
-    } );
-}
-function doEditProvisiningServer(server_id) {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			doeditprovisining: 1,
-			provisioning_workspace: $('#do_edit_server_name').text(),
-			provisioning_group: $('#do_edit_group').val(),
-			provisioning_provider_id: $('#do_edit_id_provider').val(),
-			provisioning_action: 'modified',
-			provisioning_cloud: 'do',
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do');
-                showEditProvisioningError(data, server_id);
-				add_do_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress');
-                $('#editing-wait-mess').hide();
-                $('#edited-mess').html('Server has been changed. IPs are: ' + data);
-                $('#edited-mess').show();
-                $('#sever-status-'+server_id).text('Created');
-	            $('#sever-size-'+server_id).text($('#do_edit_size').val());
-	            $('#sever-os-'+server_id).text($('#do_edit_oss').val());
-	            $('#server-'+server_id).css('background-color', '#fff');
-				$('#sever-status-'+server_id).css('color', 'var(--green-color)');
-	            $('#server-ip-'+server_id).text(data);
-            }
-        }
-    } );
-}
-function doVarsServer() {
-	var do_create_private_net = 'false';
-	var do_create_floating_net = 'false';
-	var do_create_monitoring = 'false';
-	var do_create_backup = 'false';
-	var do_create_firewall = 'false';
-	if ($('#do_create_private_net').is(':checked')) {
-		do_create_private_net = 'true';
-	}
-	if ($('#do_create_floating_net').is(':checked')) {
-		do_create_floating_net = 'true';
-	}
-	if ($('#do_create_monitoring').is(':checked')) {
-		do_create_monitoring = 'true';
-	}
-	if ($('#do_create_backup').is(':checked')) {
-		do_create_backup = 'true';
-	}
-	if ($('#do_create_backup').is(':checked')) {
-		do_create_firewall = 'true';
-	}
-	$.ajax({
-		url: "options.py",
-		data: {
-			dovars: $('#do_create_server_name').val(),
-			do_create_group: $('#do_create_group').val(),
-			do_create_provider: $('#do_create_provider').val(),
-			do_create_regions: $('#do_create_regions').val(),
-			do_create_size: $('#do_create_size').val(),
-			do_create_oss: $('#do_create_oss').val(),
-			do_create_ssh_name: $('#do_create_ssh_name').val(),
-			do_create_ssh_ids: $('#do_create_ssh_ids').val(),
-			do_create_backup: do_create_backup,
-			do_create_private_net: do_create_private_net,
-			do_create_floating_net: do_create_floating_net,
-			do_create_monitoring: do_create_monitoring,
-			do_create_firewall: do_create_firewall,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function (data) {
-			data = data.replace(/\s+/g, ' ');
-			if (data.indexOf('error:') != '-1') {
-				showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'do');
-			} else {
-				showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress');
-				doValidateServer();
-			}
-		}
-	});
-}
-function doValidateServer() {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        dovalidate: $('#do_create_server_name').val(),
-            do_create_group: $('#do_create_group').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'do');
-            } else {
-                showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress');
-                doWorkspaceServer();
-            }
-        }
-    } );
-}
-function doWorkspaceServer() {
-    var do_create_private_net = 0;
-	var do_create_floating_net = 0;
-	var do_create_monitoring = 0;
-	var do_create_backup = 0;
-	var do_create_firewall = 0;
-	if ($('#do_create_private_net').is(':checked')) {
-		do_create_private_net = 1;
-	}
-	if ($('#do_create_floating_net').is(':checked')) {
-		do_create_floating_net = 1;
-	}
-	if ($('#do_create_monitoring').is(':checked')) {
-		do_create_monitoring = 1;
-	}
-	if ($('#do_create_backup').is(':checked')) {
-		do_create_backup = 1;
-	}
-	if ($('#do_create_backup').is(':checked')) {
-		do_create_firewall = 1;
-	}
-	$.ajax({
-		url: "options.py",
-		data: {
-			doworkspace: $('#do_create_server_name').val(),
-			do_create_group: $('#do_create_group').val(),
-			do_create_provider: $('#do_create_provider').val(),
-			do_create_regions: $('#do_create_regions').val(),
-			do_create_size: $('#do_create_size').val(),
-			do_create_oss: $('#do_create_oss').val(),
-			do_create_ssh_name: $('#do_create_ssh_name').val(),
-			do_create_ssh_ids: $('#do_create_ssh_ids').val(),
-			do_create_backup: do_create_backup,
-			do_create_private_net: do_create_private_net,
-			do_create_floating_net: do_create_floating_net,
-			do_create_monitoring: do_create_monitoring,
-			do_create_firewall: do_create_firewall,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'do');
-            } else {
-                showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress');
-                common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data);
-                doProvisiningServer();
-            }
-        }
-    } );
-}
-function doProvisiningServer() {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			doprovisining: 1,
-			provisioning_workspace: $('#do_create_server_name').val(),
-			provisioning_group: $('#do_create_group').val(),
-			provisioning_provider_id: $('#do_create_provider').val(),
-			provisioning_action: 'created',
-			provisioning_cloud: 'do',
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            var server_id = $('#ajax-provisioning-body tr td span:regex(id, server-ip-)').last().attr('id').split('-')[2]
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'do');
-                $('#sever-status-'+server_id).text('Error');
-                $('#sever-status-'+server_id).attr('title', data);
-               	$('#sever-status-'+server_id).css('color', 'red');
-            } else {
-                showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress');
-                $('#wait-mess').hide();
-                $('#created-mess').html('Server has been created. Server IPs are: ' + data);
-                $('#created-mess').show();
-                $('#sever-status-'+server_id).text('Created');
-                $('#server-ip-'+server_id).text(data);
-				$('#sever-status-'+server_id).css('color', 'var(--green-color)');
-                add_do_button_after_server_created();
-            }
-        }
-    } );
-}
-function gcoreInitServer() {
-    $('#creating-init').addClass('proccessing');
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        gcoreinitserver: 1,
-		    token: $('#token').val()
-		},
-		type: "POST",
-        success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'gcore');
-            } else {
-                showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress');
-                gcoreVarsServer();
-            }
-        }
-    } );
-}
-function gcoreVarsServer() {
-    var gcore_create_firewall = 'false';
-    var gcore_create_delete_on_termination = 'false';
-    if ($('#gcore_create_firewall').is(':checked')) {
-		gcore_create_firewall = 'true';
-	}
-    if ($('#gcore_create_delete_on_termination').is(':checked')) {
-		gcore_create_delete_on_termination = 'true';
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        gcorevars: $('#gcore_create_server_name').val(),
-	        gcore_create_group: $('#gcore_create_group').val(),
-	        gcore_create_provider: $('#gcore_create_provider').val(),
-	        gcore_create_regions: $('#gcore_create_regions').val(),
-	        gcore_create_project: $('#gcore_create_project_name').val(),
-	        gcore_create_size: $('#gcore_create_size').val(),
-	        gcore_create_oss: $('#gcore_create_oss').val(),
-	        gcore_create_ssh_name: $('#gcore_create_ssh_name').val(),
-	        gcore_create_volume_size: $('#gcore_create_volume_size').val(),
-	        gcore_create_volume_type: $('#gcore_create_volume_type').val(),
-	        gcore_create_delete_on_termination: gcore_create_delete_on_termination,
-	        gcore_create_network_name: $('#gcore_create_network_name').val(),
-	        gcore_create_firewall: gcore_create_firewall,
-	        gcore_create_network_type: $('#gcore_create_network_type').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'gcore');
-            } else {
-                showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress');
-                gcoreValidateServer();
-            }
-        }
-    } );
-}
-function gcoreValidateServer() {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        gcorevalidate: $('#gcore_create_server_name').val(),
-            gcore_create_group: $('#gcore_create_group').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'gcore');
-            } else {
-                showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress');
-                gcoreWorkspaceServer();
-            }
-        }
-    } );
-}
-function gcoreWorkspaceServer() {
-    var gcore_create_firewall = 0;
-    var gcore_create_delete_on_termination = 0;
-    if ($('#gcore_create_firewall').is(':checked')) {
-		gcore_create_firewall = 1;
-	}
-    if ($('#gcore_create_delete_on_termination').is(':checked')) {
-		gcore_create_delete_on_termination = 1;
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        gcoreworkspace: $('#gcore_create_server_name').val(),
-	        gcore_create_group: $('#gcore_create_group').val(),
-	        gcore_create_provider: $('#gcore_create_provider').val(),
-	        gcore_create_regions: $('#gcore_create_regions').val(),
-	        gcore_create_project: $('#gcore_create_project_name').val(),
-	        gcore_create_size: $('#gcore_create_size').val(),
-	        gcore_create_oss: $('#gcore_create_oss').val(),
-	        gcore_create_ssh_name: $('#gcore_create_ssh_name').val(),
-	        gcore_create_volume_size: $('#gcore_create_volume_size').val(),
-	        gcore_create_volume_type: $('#gcore_create_volume_type').val(),
-	        gcore_create_delete_on_termination: gcore_create_delete_on_termination,
-	        gcore_create_network_name: $('#gcore_create_network_name').val(),
-	        gcore_create_firewall: gcore_create_firewall,
-	        gcore_create_network_type: $('#gcore_create_network_type').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'gcore');
-            } else {
-                showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress');
-                common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data);
-                gcoreProvisiningServer();
-            }
-        }
-    } );
-}
-function gcoreProvisiningServer() {
-	var gcoreprovisining = $('#gcore_create_server_name').val()
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			gcoreprovisining: 1,
-			provisioning_workspace: gcoreprovisining,
-			provisioning_group: $('#gcore_create_group').val(),
-			provisioning_provider_id: $('#gcore_create_provider').val(),
-			provisioning_action: 'created',
-			provisioning_cloud: 'gcore',
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            var server_id = $('#ajax-provisioning-body tr td span:regex(id, server-ip-)').last().attr('id').split('-')[2]
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'gcore');
-                $('#sever-status-'+server_id).text('Error');
-                $('#sever-status-'+server_id).attr('title', data);
-               	$('#sever-status-'+server_id).css('color', 'red');
-            } else {
-            	data = data.split(':');
-            	data[1] = data[1].replace(/\s+/g, ' ');
-                showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress');
-                $('#wait-mess').hide();
-                $('#created-mess').html('Server has been created. Server IPs are:' + data[0]);
-                $('#created-mess').show();
-                $('#sever-status-'+server_id).text('Created');
-                $('#sever-status-'+server_id).css('color', 'var(--green-color)');
-                $('#server-ip-'+server_id).text(data[0]);
-                add_gcore_button_after_server_created();
-            }
-        }
-    } );
-}
-function gcoreEditServer(dialog_id, server_id) {
-	var valid = true;
-	toastr.clear();
-	allFields = $( [] ).add( $('#gcore_edit_size')).add( $('#gcore_edit_ssh_name')).add( $('#gcore_edit_volume_size'));
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#gcore_edit_size'), "Instance type", 1 );
-	valid = valid && checkLength( $('#gcore_edit_ssh_name'), "SSH key pair name", 1 );
-	valid = valid && checkLength( $('#gcore_edit_volume_size'), "Volume size", 1 );
-	if(valid) {
-	    clearTips();
-	    dialog_id.dialog('destroy');
-	    startEditingServer('gcore', server_id);
-	    $('#editing-wait-mess').show();
-    }
-}
-function gcoreEditInitServer(server_id) {
-    $('#editing-init').addClass('proccessing');
-    $('#server-'+server_id).css('background-color', '#fff3cd');
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        gcoreinitserver: 1,
-		    token: $('#token').val()
-		},
-		type: "POST",
-        success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore');
-                $('#server-'+server_id).css('background-color', '#fff');
-                add_gcore_button_after_server_edited(server_id)
-            } else {
-                showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress');
-                gcoreEditingVarsServer(server_id);
-            }
-        }
-    } );
-}
-
-function gcoreEditingVarsServer(server_id, dialog_id) {
-    var gcore_edit_firewall = 'false';
-    var gcore_edit_delete_on_termination = 'false';
-    if ($('#gcore_edit_firewall').is(':checked')) {
-		gcore_edit_firewall = 'true';
-	}
-    if ($('#gcore_edit_delete_on_termination').is(':checked')) {
-		gcore_edit_delete_on_termination = 'true';
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        gcoreeditvars: $('#gcore_edit_server_name').text(),
-	        gcore_edit_group: $('#gcore_edit_group').val(),
-	        gcore_edit_provider: $('#gcore_edit_id_provider').val(),
-	        gcore_edit_regions: $('#gcore_edit_region').text(),
-	        gcore_edit_project: $('#gcore_edit_project_name').text(),
-	        gcore_edit_size: $('#gcore_edit_size').val(),
-	        gcore_edit_oss: $('#gcore_edit_oss').text(),
-	        gcore_edit_ssh_name: $('#gcore_edit_ssh_name').val(),
-	        gcore_edit_volume_size: $('#gcore_edit_volume_size').val(),
-	        gcore_edit_volume_type: $('#gcore_edit_volume_type').val(),
-	        gcore_edit_delete_on_termination: gcore_edit_delete_on_termination,
-	        gcore_edit_network_name: $('#gcore_edit_network_name').val(),
-	        gcore_edit_firewall: gcore_edit_firewall,
-	        gcore_edit_network_type: $('#gcore_edit_network_type').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore');
-                $('#server-'+server_id).css('background-color', '#fff');
-                add_gcore_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress');
-                gcoreEditValidateServer(server_id);
-            }
-        }
-    } );
-}
-function gcoreEditValidateServer(server_id) {
-    $.ajax( {
-	    url: "options.py",
-        data: {
-	        gcoreeditvalidate: $('#gcore_edit_server_name').text(),
-            gcore_edit_group: $('#gcore_edit_group').val(),
-		    token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1') {
-                showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore');
-                $('#server-'+server_id).css('background-color', '#fff');
-                add_gcore_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress');
-                gcoreEditWorkspaceServer(server_id);
-            }
-        }
-    } );
-}
-function gcoreEditWorkspaceServer(server_id) {
-    var gcore_edit_firewall = 0;
-    var gcore_edit_delete_on_termination = 0;
-    if ($('#gcore_edit_firewall').is(':checked')) {
-		gcore_edit_firewall = 1;
-	}
-    if ($('#gcore_edit_delete_on_termination').is(':checked')) {
-		gcore_edit_delete_on_termination = 1;
-	}
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			gcoreeditworkspace: $('#gcore_edit_server_name').text(),
-			gcore_edit_group: $('#gcore_edit_group').val(),
-			gcore_edit_provider: $('#gcore_edit_id_provider').val(),
-			gcore_edit_regions: $('#gcore_edit_region').text(),
-			gcore_edit_project: $('#gcore_edit_project_name').text(),
-			gcore_edit_size: $('#gcore_edit_size').val(),
-			gcore_edit_oss: $('#gcore_edit_oss').text(),
-			gcore_edit_ssh_name: $('#gcore_edit_ssh_name').val(),
-			gcore_edit_volume_size: $('#gcore_edit_volume_size').val(),
-			gcore_edit_volume_type: $('#gcore_edit_volume_type').val(),
-			gcore_edit_delete_on_termination: gcore_edit_delete_on_termination,
-			gcore_edit_network_name: $('#gcore_edit_network_name').val(),
-			gcore_edit_firewall: gcore_edit_firewall,
-			gcore_edit_network_type: $('#gcore_edit_network_type').val(),
-			server_id: server_id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore');
-                showEditProvisioningError(data, server_id);
-                add_gcore_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress');
-                $('#sever-status-'+server_id).text('Editing');
-                $('#sever-status-'+server_id).css('color', '#000');
-                gcoreEditProvisiningServer(server_id);
-            }
-        }
-    } );
-}
-function gcoreEditProvisiningServer(server_id, dialog_id) {
-	var gcoreeditgprovisining = $('#gcore_edit_server_name').text();
-    $.ajax( {
-	    url: "options.py",
-        data: {
-			gcoreeditgprovisining: 1,
-			provisioning_workspace: gcoreeditgprovisining,
-			provisioning_group: $('#gcore_edit_group').val(),
-			provisioning_provider_id: $('#gcore_edit_id_provider option:selected').val(),
-			provisioning_action: 'modified',
-			provisioning_cloud: 'gcore',
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-            data = data.replace(/\s+/g, ' ');
-            if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') {
-                showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore');
-                showEditProvisioningError(data, server_id);
-                add_gcore_button_after_server_edited(server_id);
-            } else {
-                showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress');
-                data = data.split(':');
-                data[1] = data[1].replace(/\s+/g, ' ');
-                $('#editing-wait-mess').hide();
-                $('#edited-mess').html('Server has been changed. IPs are: ' + data[0]);
-                $('#edited-mess').show();
-                $('#sever-status-'+server_id).text('Created');
-	            $('#sever-size-'+server_id).text($('#gcore_edit_size').val());
-	            $('#sever-os-'+server_id).text($('#gcore_edit_oss').text());
-	            $('#server-'+server_id).css('background-color', '#fff');
-	            $('#sever-status-'+server_id).css('color', 'var(--green-color)');
-	            $('#server-ip-'+server_id).text(data[0]);
-	            // $('#server-name-'+server_id).text(gcoreeditgprovisining+'('+data[1]+')');
-            }
-        }
-    } );
-}
-function returnFormatedDate() {
-    let date = new Date();
-    current_date = date.toISOString().slice(0,10)+' '+date.toTimeString().split(' ')[0]
-    return current_date
-}
diff --git a/inc/runtimeapi.js b/inc/runtimeapi.js
index 4023cc84..f3dc738a 100644
--- a/inc/runtimeapi.js
+++ b/inc/runtimeapi.js
@@ -5,10 +5,9 @@ function showRuntime() {
 		saveCheck = "";
 	}
 	$.ajax({
-		url: "options.py",
+		url: "/app/runtimeapi/action/" + $("#serv").val(),
 		data: {
 			servaction: $('#servaction').val(),
-			serv: $("#serv").val(),
 			servbackend: $("#servbackend").val(),
 			save: saveCheck,
 			token: $('#token').val()
@@ -20,20 +19,15 @@ function showRuntime() {
 	} );
 }
 $( function() {
-	$('#runtimeapiform').submit(function() {
+	$('#runtimeapiform').submit(function () {
 		showRuntime();
 		return false;
 	});
-	$( "#maxconn_select" ).on('selectmenuchange',function()  {
+	$("#maxconn_select").on('selectmenuchange', function () {
 		let server_ip = $('#maxconn_select').val();
-		$.ajax( {
-			url: "options.py",
-			data: {
-				maxconn_select: $('#maxconn_select').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
+		$.ajax({
+			url: "/app/runtimeapi/maxconn/" + $('#maxconn_select').val(),
+			success: function (data) {
 				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error: ') != '-1') {
 					toastr.error(data);
@@ -41,27 +35,26 @@ $( function() {
 					generate_select(data, '#maxconnfront');
 				}
 			}
-		} );
+		});
 	});
-	$('#maxconnbackend').on('selectmenuchange', function (){
+	$('#maxconnbackend').on('selectmenuchange', function () {
 		let server_ip = $('#maxconn_backend_select').val();
 		let backend = $('#maxconnbackend').val();
 		get_backend_servers(server_ip, backend, '#maxconn_backend_server', 0);
 	});
-	$( "#maxconn_backend_select" ).on('selectmenuchange',function()  {
+	$("#maxconn_backend_select").on('selectmenuchange', function () {
 		let server_ip = $('#maxconn_backend_select').val();
 		get_backends(server_ip, '#maxconnbackend', 0);
 	});
-	$('#maxconnglobalform').submit(function() {
-		$.ajax( {
-			url: "options.py",
+	$('#maxconnglobalform').submit(function () {
+		$.ajax({
+			url: "/app/runtimeapi/maxconn/global/" + $('#maxconn_global_select').val(),
 			data: {
-				serv: $('#maxconn_global_select').val(),
-				maxconn_global: $('#maxconnintglobal').val(),
+				maxconn: $('#maxconnintglobal').val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error: ') != '-1') {
 					toastr.error(data);
@@ -69,20 +62,19 @@ $( function() {
 					toastr.success(data);
 				}
 			}
-		} );
+		});
 		return false;
 	});
-	$('#maxconnform').submit(function() {
-		$.ajax( {
-			url: "options.py",
+	$('#maxconnform').submit(function () {
+		$.ajax({
+			url: "/app/runtimeapi/maxconn/frontend/" + $('#maxconn_select').val(),
 			data: {
-				serv: $('#maxconn_select').val(),
 				maxconn_frontend: $('#maxconnfront').val(),
-				maxconn_int: $('#maxconnint').val(),
+				maxconn: $('#maxconnint').val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error: ') != '-1') {
 					toastr.error(data);
@@ -90,21 +82,20 @@ $( function() {
 					toastr.success(data);
 				}
 			}
-		} );
+		});
 		return false;
 	});
-	$('#maxconnbackform').submit(function() {
-		$.ajax( {
-			url: "options.py",
+	$('#maxconnbackform').submit(function () {
+		$.ajax({
+			url: "/app/runtimeapi/maxconn/backend/" + $('#maxconn_backend_select').val(),
 			data: {
-				serv: $('#maxconn_backend_select').val(),
 				maxconn_backend: $('#maxconnbackend').val(),
 				maxconn_backend_server: $('#maxconn_backend_server').val(),
-				maxconn_int: $('#maxconn_backend_int').val(),
+				maxconn: $('#maxconn_backend_int').val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error: ') != '-1') {
 					toastr.error(data);
@@ -112,48 +103,41 @@ $( function() {
 					toastr.success(data);
 				}
 			}
-		} );
+		});
 		return false;
 	});
-	$( "#ip_select" ).on('selectmenuchange',function()  {
+	$("#ip_select").on('selectmenuchange', function () {
 		let server_ip = $('#ip_select').val();
 		get_backends(server_ip, '#ipbackend', 1);
 	});
-	$( "#ipbackend" ).on('selectmenuchange',function() {
+	$("#ipbackend").on('selectmenuchange', function () {
 		let server_ip = $('#ip_select').val();
 		let backend = $('#ipbackend').val();
 		get_backend_servers(server_ip, backend, '#backend_server', 1);
 	});
-	$( "#backend_server" ).on('selectmenuchange',function() {
+	$("#backend_server").on('selectmenuchange', function () {
 		$('#backend_ip').val();
 		$('#backend_port').val();
-		$.ajax( {
-			url: "options.py",
-			data: {
-				serv: $('#ip_select').val(),
-				ipbackend: $('#ipbackend').val(),
-				backend_server: $('#backend_server').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+		$.ajax({
+			url: "/app/runtimeapi/backend/server/" + $('#ip_select').val() + "/" + $('#ipbackend').val() + "/" + $('#backend_server').val(),
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error: ') != '-1') {
 					toastr.error(data);
 				} else {
 					var server = data.split(':')[0]
 					var port = data.split(':')[1]
-					port = port.replace(/\s+/g,'');
-					server = server.replace(/\s+/g,'');
+					port = port.replace(/\s+/g, '');
+					server = server.replace(/\s+/g, '');
 					$('#backend_port').val(port);
-					$('#backend_ip').val(server);			
-				}	
+					$('#backend_ip').val(server);
+				}
 			}
-		} );	
+		});
 	});
-	$('#runtimeapiip').submit(function() {
+	$('#runtimeapiip').submit(function () {
 		$.ajax({
-			url: "options.py",
+			url: "/app/runtimeapi/change/ip",
 			data: {
 				serv: $('#ip_select').val(),
 				backend_backend: $('#ipbackend').val(),
@@ -171,49 +155,41 @@ $( function() {
 					toastr.success(data);
 				}
 			}
-		} );
+		});
 		return false;
 	});
-	$( "#table_serv_select" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				serv: $('#table_serv_select').val(),
-				table_serv_select: $('#table_serv_select').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,'');
+	$("#table_serv_select").on('selectmenuchange', function () {
+		$.ajax({
+			url: "/app/runtimeapi/tables/" + $('#table_serv_select').val(),
+			success: function (data) {
+				data = data.replace(/\s+/g, '');
 				if (data.indexOf('error: ') != '-1') {
 					toastr.error(data);
 				} else {
 					generate_select(data, '#table_select', 'All', ',');
 				}
 			}
-		} );
+		});
 	});
-	$('#runtimeapitable').submit(function() {
+	$('#runtimeapitable').submit(function () {
 		getTable();
 		return false;
 	});
-	$('#runtimeapilist').submit(function() {
+	$('#runtimeapilist').submit(function () {
 		getList();
 		return false;
 	});
-	$('#runtimeapisessions').submit(function() {
+	$('#runtimeapisessions').submit(function () {
 		getSessions();
 		return false;
 	});
-	$( "#list_serv_select" ).on('selectmenuchange',function() {
+	$("#list_serv_select").on('selectmenuchange', function () {
 		$.ajax({
-			url: "options.py",
-			data: {
-				serv: $('#list_serv_select').val(),
-				list_serv_select: $('#list_serv_select').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
+			url: "/app/runtimeapi/list/" + $('#list_serv_select').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
 			success: function (data) {
 				data = data.replace(/, /g, ',');
 				if (data.indexOf('error: ') != '-1') {
@@ -224,15 +200,19 @@ $( function() {
 
 					for (let i = 0; i < data.split(',').length; i++) {
 						if (value[i] != '') {
-							value[i] = value[i].replace(/\'/g, '');
-							value[i] = value[i].replace('(', '');
-							value[i] = value[i].replace(')', '');
-							value[i] = value[i].replace('[', '');
-							value[i] = value[i].replace(']', '');
-							id = value[i].split(' ')[0];
-							full_text_option = value[i].split(' ')[1]
-							text_option = full_text_option.split('/').slice(-2)[0];
-							text_option = text_option + '/' + full_text_option.split('/').slice(-1)[0];
+							try {
+								value[i] = value[i].replace(/\'/g, '');
+								value[i] = value[i].replace('(', '');
+								value[i] = value[i].replace(')', '');
+								value[i] = value[i].replace('[', '');
+								value[i] = value[i].replace(']', '');
+								id = value[i].split(' ')[0];
+								full_text_option = value[i].split(' ')[1]
+								text_option = full_text_option.split('/').slice(-2)[0];
+								text_option = text_option + '/' + full_text_option.split('/').slice(-1)[0];
+							} catch (err) {
+								text_option = value[i];
+							}
 							$('#list_select').append($("<option title=\"Show list " + text_option + "\"></option>")
 								.attr("value", id)
 								.text(text_option));
@@ -241,20 +221,13 @@ $( function() {
 					$('#list_select').selectmenu("refresh");
 				}
 			}
-		} );
+		});
 	});
 });
 function deleteTableEntry(id, table, ip) {
 	$(id).parent().parent().css("background-color", "#f2dede");
 	$.ajax( {
-    	url: "options.py",
-    	data: {
-    	    serv: $('#table_serv_select').val(),
-    		table_for_delete: table,
-    		ip_for_delete: ip,
-    		token: $('#token').val()
-    	},
-    	type: "POST",
+    	url: "/app/runtimeapi/table/" + $('#table_serv_select').val() + "/" + table + "/" + ip ,
     	success: function( data ) {
     	    if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
@@ -266,13 +239,7 @@ function deleteTableEntry(id, table, ip) {
 }
 function clearTable(table) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $('#table_serv_select').val(),
-			table_for_clear: table,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/runtimeapi/table/clear/" + $('#table_serv_select').val() + "/" + table,
 		success: function( data ) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
@@ -284,20 +251,14 @@ function clearTable(table) {
 }
 function getTable() {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $('#table_serv_select').val(),
-			table_select: $('#table_select').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/runtimeapi/table/" + $('#table_serv_select').val() + "/" + $('#table_select').val(),
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
 			} else {
 				$("#ajaxtable").html(data);
 				$( "input[type=submit], button" ).button();
-				$.getScript("/inc/script-6.3.9.js");
+				$.getScript("/inc/script.js");
 				$.getScript("/inc/fontawesome.min.js");
 				FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };
 			}
@@ -306,21 +267,18 @@ function getTable() {
 }
 function getList() {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $('#list_serv_select').val(),
-			list_select_id: $('#list_select').val(),
-			list_select_name: $('#list_select  option:selected').text(),
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/runtimeapi/list/" + $('#list_serv_select').val() + "/" + $('#list_select').val() + "/" + $('#list_select  option:selected').text(),
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function( data ) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
 			} else {
 				$("#ajaxlist").html(data);
 				$( "input[type=submit], button" ).button();
-				$.getScript("/inc/script-6.3.9.js");
+				$.getScript("/inc/script.js");
 				$.getScript("/inc/fontawesome.min.js");
 				FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };
 			}
@@ -331,7 +289,7 @@ function deleteListIp(id, list_id, ip_id, ip) {
 	toastr.clear();
 	$(id).parent().parent().css("background-color", "#f2dede !important");
 	$.ajax( {
-		url: "options.py",
+		url: "/app/runtimeapi/list/delete",
 		data: {
 			serv: $('#list_serv_select').val(),
 			list_id_for_delete: list_id,
@@ -361,7 +319,7 @@ function addNewIp() {
 	var ip = $('#list_add_ip_new_ip').val();
 	if(valid) {
 		$.ajax({
-			url: "options.py",
+			url: "/app/runtimeapi/add/",
 			data: {
 				serv: $('#list_serv_select').val(),
 				list_ip_for_add: ip,
@@ -384,70 +342,65 @@ function addNewIp() {
 	}
 }
 function getSessions() {
-	$.ajax( {
-		url: "options.py",
-		data: {
-			sessions_select: $('#sessions_serv_select').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	$.ajax({
+		url: "/app/runtimeapi/session/" + $('#sessions_serv_select').val(),
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
 			} else {
 				$("#ajaxsessions").html(data);
-				$( "input[type=submit], button" ).button();
-				$.getScript("/inc/script-6.3.9.js");
+				$("input[type=submit], button").button();
+				$.getScript("/inc/script.js");
 				$.getScript("/inc/fontawesome.min.js");
-				FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };
+				FontAwesomeConfig = {searchPseudoElements: true, observeMutations: false};
 			}
 		}
-	} );
+	});
 }
 function getSessionInfo(sess_id) {
-	$.ajax( {
-		url: "options.py",
-		data: {
-			sessions_select_show: $('#sessions_serv_select').val(),
-			sessions_select_id: sess_id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	$.ajax({
+		url: "/app/runtimeapi/session/" + $('#sessions_serv_select').val() + "/" + sess_id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
 			if (data.indexOf('danger') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
 				$("#get-session-info-body").html(data);
-				$( "#get-session-info" ).dialog({
+				$("#get-session-info").dialog({
 					resizable: false,
 					height: "auto",
 					width: 790,
 					modal: true,
 					title: "View session",
 					buttons: {
-						Close: function() {
-							$( this ).dialog( "close" );
+						Close: function () {
+							$(this).dialog("close");
 							$("#get-session-info-body").html('');
 						}
 					}
 				});
 			}
 		}
-	} );
+	});
 }
 function deleteSession(id, sess_id) {
 	toastr.clear();
 	$(id).parent().parent().css("background-color", "#f2dede !important");
-	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $('#sessions_serv_select').val(),
-			session_delete_id: sess_id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	$.ajax({
+		url: "/app/runtimeapi/session/delete/" +$('#sessions_serv_select').val() + "/" + sess_id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
 			} else {
@@ -456,17 +409,11 @@ function deleteSession(id, sess_id) {
 				getSessions();
 			}
 		}
-	} );
+	});
 }
 function get_backends(server_ip, backends_select_tag, ip_and_port=0) {
 	$.ajax({
-		url: "options.py",
-		data: {
-			ip_select: 1,
-			serv: server_ip,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/runtimeapi/backends/" + server_ip,
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error: ') != '-1') {
@@ -485,13 +432,7 @@ function get_backends(server_ip, backends_select_tag, ip_and_port=0) {
 }
 function get_backend_servers(server_ip, backend, servers_select_tag, ip_and_port=0) {
 	$.ajax({
-		url: "options.py",
-		data: {
-			serv: server_ip,
-			ipbackend: backend,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/runtimeapi/backend/servers/" + server_ip + "/" + backend,
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error: ') != '-1') {
diff --git a/inc/script-6.3.9.js b/inc/script.js
similarity index 68%
rename from inc/script-6.3.9.js
rename to inc/script.js
index 79db20b3..9b79f5f0 100644
--- a/inc/script-6.3.9.js
+++ b/inc/script.js
@@ -1,6 +1,6 @@
-var url = "/inc/script-6.3.9.js";
-var cur_url = window.location.href.split('/').pop();
-cur_url = cur_url.split('?');
+var url = "/inc/script.js";
+var cur_url = window.location.href.split('/app/').pop();
+cur_url = cur_url.split('/');
 var intervalId;
 function validateEmail(email) {
 	const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
@@ -27,77 +27,101 @@ function show_current_page(id) {
 }
 $( function() {		
    $('.menu li ul li').each(function () {
-       var link = $(this).find('a').attr('href');
+	   var link = $(this).find('a').attr('href');
 	   var link2 = link.split('/')[2];
+	   var link3 = link.split('/')[3];
+	   var link4 = link.split('/')[4];
 	   if (cur_url[1] == null) {
 		   cur_url[1] = 'haproxy';
 	   }
-       if (cur_url[0] == link2 && cur_url[1].split('&')[0] != 'service=keepalived' && cur_url[1].split('&')[0] != 'service=nginx' && cur_url[1].split('&')[0] != 'service=apache') {
-			show_current_page($(this))
-		} else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'config.py?service=keepalived'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'config.py?service=haproxy'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'config.py?service=nginx'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'config.py?service=apache'){
-			show_current_page($(this))
-	   	} else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'versions.py?service=nginx'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'versions.py?service=haproxy'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'versions.py?service=keepalived'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'versions.py?service=apache'){
-			show_current_page($(this))
-	   	} else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'logs.py?service=haproxy'){
-			show_current_page($(this))
-	   	} else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'logs.py?service=nginx'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'logs.py?service=apache'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'logs.py?service=keepalived'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'hapservers.py?service=haproxy'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'hapservers.py?service=nginx'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'hapservers.py?service=keepalived'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'hapservers.py?service=apache'){
-			show_current_page($(this))
-	   	} else if(cur_url[0] == 'statsview.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'statsview.py?service=haproxy'){
-			show_current_page($(this))
-	   	} else if(cur_url[0] == 'statsview.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'statsview.py?service=nginx'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'statsview.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'statsview.py?service=apache'){
-			show_current_page($(this))
-		} else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=view' && link2 == 'smon.py?action=view'){
+	   var full_uri = cur_url[0] + '/' + cur_url[1]
+	   var full_uri1 = link2 + '/' + link3
+	   var full_uri2 = cur_url[0] + '/' + cur_url[1] + '/' + cur_url[2]
+	   var full_uri3 = link2 + '/' + link3 + '/' + link4
+	   if (cur_url[0] == link2 && link3 == null) {
 		   show_current_page($(this))
-	   	} else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=add' && link2 == 'smon.py?action=add'){
+	   } else if (full_uri == 'config/haproxy' && full_uri1 == 'config/haproxy') {
 		   show_current_page($(this))
-       } else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=history' && link2 == 'smon.py?action=history'){
+	   } else if (full_uri == 'config/nginx' && full_uri1 == 'config/nginx') {
 		   show_current_page($(this))
-       } else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=checker_history' && link2 == 'smon.py?action=checker_history'){
+	   } else if (full_uri == 'config/apache' && full_uri1 == 'config/apache') {
 		   show_current_page($(this))
-	   }  else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=dashboard' && link2.indexOf('smon.py?action=view') != '-1'){
+	   } else if (full_uri == 'config/keepalived' && full_uri1 == 'config/keepalived') {
 		   show_current_page($(this))
-	   } else if(cur_url[0] == 'add.py' && cur_url[1].split('&')[0] == 'service=nginx#ssl' && link2 == 'add.py?service=nginx#ssl'){
+	   } else if (full_uri2 == 'config/versions/haproxy' && full_uri3 == 'config/versions/haproxy') {
 		   show_current_page($(this))
-	   } else if(cur_url[0] == 'viewlogs.py' && cur_url[1].split('&')[0] == 'type=2' && link2 == 'viewlogs.py?type=2') {
+	   } else if (full_uri2 == 'config/versions/nginx' && full_uri3 == 'config/versions/nginx') {
+		   show_current_page($(this))
+	   } else if (full_uri2 == 'config/versions/keepalived' && full_uri3 == 'config/versions/keepalived') {
+		   show_current_page($(this))
+	   } else if (full_uri2 == 'config/versions/apache' && full_uri3 == 'config/versions/apache') {
+		   show_current_page($(this))
+	   } else if (full_uri2 == 'config/map/haproxy' && full_uri1 == 'config/haproxy') {
+		   show_current_page($(this))
+	   } else if (full_uri2 == 'config/compare/haproxy' && full_uri1 == 'config/haproxy') {
+		   show_current_page($(this))
+	   } else if (full_uri2 == 'config/compare/nginx' && full_uri1 == 'config/nginx') {
+		   show_current_page($(this))
+	   } else if (full_uri2 == 'config/compare/keepalived' && full_uri3 == 'config/keepalived') {
+		   show_current_page($(this))
+	   } else if (full_uri2 == 'config/compare/apache' && full_uri3 == 'config/apache') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'logs/haproxy' && full_uri1 == 'logs/haproxy') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'logs/nginx' && full_uri1 == 'logs/nginx') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'logs/keepalived' && full_uri1 == 'logs/keepalived') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'logs/apache' && full_uri1 == 'logs/apache') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'service/haproxy' && full_uri1 == 'service/haproxy') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'service/nginx' && full_uri1 == 'service/nginx') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'service/keepalived' && full_uri1 == 'service/keepalived') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'service/apache' && full_uri1 == 'service/apache') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'stats/haproxy' && full_uri1 == 'stats/haproxy') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'stats/nginx' && full_uri1 == 'stats/nginx') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'stats/apache' && full_uri1 == 'stats/apache') {
+		   show_current_page($(this))
+	   } else if (full_uri.indexOf('add/haproxy#') != '-1' && full_uri1.indexOf('add/haproxy#proxy') != '-1') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'add/haproxy#ssl' && full_uri1 == 'add/haproxy#ssl') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'add/nginx#proxy' && full_uri1 == 'add/nginx#proxy') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'smon/dashboard' && full_uri1 == 'smon/dashboard') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'smon/admin' && full_uri1 == 'smon/admin') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'smon/history' && full_uri1 == 'smon/history') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'checker/settings' && full_uri1 == 'checker/settings') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'checker/history' && full_uri1 == 'checker/history') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'add/haproxy?service=nginx#ssl' && cur_url[1].split('?')[1] == 'service=nginx#ssl' && full_uri1 == 'add/haproxy?service=nginx#ssl') {
+		   show_current_page($(this))
+	   } else if (cur_url[0] == 'app/logs' && cur_url[1].split('&')[0] == 'type=2' && link2 == 'viewlogs.py?type=2') {
 		   show_current_page($(this));
 		   return false;
-	   } else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'metrics.py?service=haproxy'){
+	   } else if (full_uri == 'metrics/haproxy' && full_uri1 == 'metrics/haproxy') {
 		   show_current_page($(this))
-	   } else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'metrics.py?service=nginx'){
+	   } else if (full_uri == 'metrics/nginx' && full_uri1 == 'metrics/nginx') {
 		   show_current_page($(this))
-	   } else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'metrics.py?service=apache'){
+	   } else if (full_uri == 'metrics/apache' && full_uri1 == 'metrics/apache') {
 		   show_current_page($(this))
-	   } else if(cur_url[0] == 'add.py' && cur_url[1].split('&')[0] == 'service=apache#ssl' && link2 == 'add.py?service=apache#ssl'){
+	   } else if (full_uri == 'add/haproxy?service=apache#ssl' && cur_url[1].split('?')[1] == 'service=apache#ssl' && full_uri1 == 'add/haproxy?service=apache#ssl') {
 		   show_current_page($(this))
-	   } else if(cur_url[0] == 'waf.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'waf.py?service=haproxy'){
+	   } else if (full_uri == 'waf/haproxy' && full_uri1 == 'waf/haproxy') {
 		   show_current_page($(this))
-	   } else if(cur_url[0] == 'waf.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'waf.py?service=nginx'){
+	   } else if (full_uri == 'waf/nginx' && full_uri1 == 'waf/nginx') {
+		   show_current_page($(this))
+	   } else if (full_uri == 'install/ha' && full_uri1 == 'install/ha') {
 		   show_current_page($(this))
 	   }
    });
@@ -118,17 +142,17 @@ jQuery.expr[':'].regex = function(elem, index, match) {
 window.onblur= function() {
 	window.onfocus= function () {
 		if(sessionStorage.getItem('auto-refresh-pause') == "0" && sessionStorage.getItem('auto-refresh') > 5000) {
-			if (cur_url[0] == "logs.py") {
+			if (cur_url[0] == "logs") {
 				showLog();
-			} else if (cur_url[0] == "statsview.py") {
+			} else if (cur_url[0] == "stats") {
 				showStats()
-			} else if (cur_url[0] == "overview.py") {
+			} else if (cur_url[0] == "/") {
 				showOverview(); 
-			} else if (cur_url[0] == "viewlogs.py") {
+			} else if (cur_url[0] == "internal") {
 				viewLogs();
-			} else if (cur_url[0] == "metrics.py") {
+			} else if (cur_url[0] == "metrics") {
 				showMetrics();
-			} else if (cur_url[0] == "smon.py" && cur_url[1].split('&')[0] == "action=view") {
+			} else if (cur_url[0] == "smon" && cur_url[1] == "dasboards") {
 				showSmon('refresh')
 			}
 		}
@@ -136,59 +160,57 @@ window.onblur= function() {
 };
 if(localStorage.getItem('restart')) {
 	var ip_for_restart = localStorage.getItem('restart');
-	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "checkrestart",
-			serv: ip_for_restart,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			if(data.indexOf('ok') != '-1') {
+	$.ajax({
+		url: "/app/service/check-restart/" + ip_for_restart,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			if (data.indexOf('ok') != '-1') {
 				var apply_div = $.find("#apply_div");
 				apply_div = apply_div[0].id;
 				$("#apply").css('display', 'block');
-				$('#'+apply_div).css('width', '850px');
+				$('#' + apply_div).css('width', '850px');
 				ip_for_restart = escapeHtml(ip_for_restart);
-				if (cur_url[0] == "hapservers.py") {
-					$('#'+apply_div).css('width', '650px');
-					$('#'+apply_div).addClass("alert-one-row");
-					$('#'+apply_div).html("You have made changes to the server: "+ip_for_restart+". Changes will take effect only after<a id='"+ip_for_restart+"' class='restart' title='Restart HAproxy service' onclick=\"confirmAjaxAction('restart', 'hap', '"+ip_for_restart+"')\">restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>");
+				if (cur_url[0] == "service") {
+					$('#' + apply_div).css('width', '650px');
+					$('#' + apply_div).addClass("alert-one-row");
+					$('#' + apply_div).html("You have made changes to the server: " + ip_for_restart + ". Changes will take effect only after<a id='" + ip_for_restart + "' class='restart' title='Restart HAproxy service' onclick=\"confirmAjaxAction('restart', 'hap', '" + ip_for_restart + "')\">restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>");
 				} else {
-					$('#'+apply_div).html("You have made changes to the server: "+ip_for_restart+". Changes will take effect only after restart. <a href='hapservers.py' title='Overview'>Go to the HAProxy Overview page and restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>");
+					$('#' + apply_div).html("You have made changes to the server: " + ip_for_restart + ". Changes will take effect only after restart. <a href='service' title='Overview'>Go to the HAProxy Overview page and restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>");
 				}
-				$.getScript('/inc/overview-6.3.9.js');
+				$.getScript('/inc/overview.js');
 			}
-		}					
-	} );
+		}
+	});
 }
 function autoRefreshStyle(autoRefresh) {
 	var margin;
-	if (cur_url[0] == "overview.py" || cur_url[0] == "waf.py" || cur_url[0] == "metrics.py") {
-		if(autoRefresh < 60000) {
+	if (cur_url[0] == "/" || cur_url[0] == "waf" || cur_url[0] == "metrics") {
+		if (autoRefresh < 60000) {
 			autoRefresh = 60000;
 		}
 	}
 	autoRefresh = autoRefresh / 1000;
-	if ( autoRefresh == 60) {
+	if (autoRefresh == 60) {
 		timeRange = " minute"
 		autoRefresh = autoRefresh / 60;
-	} else if ( autoRefresh > 60 && autoRefresh < 3600 ) {
+	} else if (autoRefresh > 60 && autoRefresh < 3600) {
 		timeRange = " minutes"
 		autoRefresh = autoRefresh / 60;
-	} else if ( autoRefresh >= 3600 && autoRefresh < 86401 ) {
+	} else if (autoRefresh >= 3600 && autoRefresh < 86401) {
 		timeRange = " hours"
-		autoRefresh = autoRefresh / 3600;			
+		autoRefresh = autoRefresh / 3600;
 	} else {
 		timeRange = " seconds";
 	}
 	$('#1').text(autoRefresh + timeRange);
 	$('#0').text(autoRefresh + timeRange);
-	$('.auto-refresh-pause').css('display', 'inline');		
-	$('.auto-refresh-resume').css('display', 'none');		
-	$('.auto-refresh-pause').css('margin-left', "-25px");	
-	$('.auto-refresh-resume').css('margin-left', "-25px");		
+	$('.auto-refresh-pause').css('display', 'inline');
+	$('.auto-refresh-resume').css('display', 'none');
+	$('.auto-refresh-pause').css('margin-left', "-25px");
+	$('.auto-refresh-resume').css('margin-left', "-25px");
 	$('#browse_histroy').css("border-bottom", "none");
 	$('.auto-refresh img').remove();
 }
@@ -219,44 +241,44 @@ function setRefreshInterval(interval) {
 }
 function startSetInterval(interval) {
 	if(sessionStorage.getItem('auto-refresh-pause') == "0") {
-		if (cur_url[0] == "logs.py") {
+		if (cur_url[0] == "logs") {
 			intervalId = setInterval('showLog()', interval);
 			showLog();
-		} else if (cur_url[0] == "statsview.py") {
+		} else if (cur_url[0] == "stats") {
 			intervalId = setInterval('showStats()', interval);
 			showStats()
-		} else if (cur_url[0] == "overview.py") {
+		} else if (cur_url[0] == "/") {
 			if(interval < 60000) {
 				interval = 60000;
 			}
 			intervalId = setInterval('showOverview(ip, hostnamea)', interval);
-			showOverview(ip, hostnamea); 
-		} else if (cur_url[0] == "viewlogs.py") {
+			showOverview(ip, hostnamea);
+		} else if (cur_url[1] == "internal") {
 			intervalId = setInterval('viewLogs()', interval);
 			viewLogs();
-		} else if (cur_url[0] == "metrics.py") {
+		} else if (cur_url[0] == "metrics") {
 			if(interval < 60000) {
 				interval = 60000;
 			}
 			intervalId = setInterval('showMetrics()', interval);
 			showMetrics();
-		} else if (cur_url[0] == "waf.py") {
+		} else if (cur_url[0] == "waf") {
 			if(interval < 60000) {
 				interval = 60000;
 			}
 			intervalId = setInterval('showOverviewWaf(ip, hostnamea)', interval);
 			showOverviewWaf(ip, hostnamea);
 			showWafMetrics();
-		} else if (cur_url[0] == "hapservers.py") {
+		} else if (cur_url[0] == "service") {
 			if(interval < 60000) {
 				interval = 60000;
 			}
 			intervalId = setInterval('showMetrics()', interval);
 			showMetrics();
-		} else if (cur_url[0] == "smon.py" && cur_url[1].split('&')[0] == "action=view") {
+		} else if (cur_url[0] == "smon" && cur_url[1] == "dashboards") {
 			intervalId = setInterval("showSmon('refresh')", interval);
 			showSmon('refresh');
-		} else if (cur_url[0] == "smon.py" && cur_url[1].split('&')[0] == "action=dashboard") {
+		} else if (cur_url[0] == "smon" && cur_url[1] == "history") {
 			if(interval < 60000) {
 				interval = 60000;
 			}
@@ -278,7 +300,6 @@ function pauseAutoResume(){
 	setRefreshInterval(autoRefresh);
 	sessionStorage.setItem('auto-refresh-pause', '0');
 }
-
 function hideAutoRefreshDiv() {
 	$(function() {
 		$('.auto-refresh-div').hide("blind", "fast");
@@ -293,45 +314,49 @@ $( document ).ajaxComplete(function( event, request, settings ) {
 	NProgress.done();
 });
 function showStats() {
-	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "stats",
-			serv: $("#serv").val(),
-			service: $("#service").val(),
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	$.ajax({
+		url: "/app/stats/view/" + $("#service").val() + "/" + $("#serv").val(),
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
 			if (data.indexOf('error:') != '-1' && data.indexOf('Internal error:') == '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
 				$("#ajax").html(data);
-				window.history.pushState("Stats", "Stats", cur_url[0] + "?service=" + $("#service").val() + "&serv=" + $("#serv").val());
+				window.history.pushState("Stats", "Stats", "/app/stats/" + $("#service").val() + "/" + $("#serv").val());
 				wait();
 			}
-		}					
-	} );
+		}
+	});
 }
 function openStats() {
 	var serv = $("#serv").val();
-	var service_url = cur_url[1].split('&')[0];
-	var url = "statsview.py?"+service_url+"&serv="+serv+"&open=open"
+	var service_url = cur_url[1];
+	var url = "/app/stats/"+service_url+"/"+serv
 	var win = window.open(url, '_blank');
 	win.focus();
 }
 function openVersions() {
 	var serv = $("#serv").val();
-	var service_url = cur_url[1].split('&')[0];
-	var url = "versions.py?"+service_url+"&serv="+serv+"&open=open"
+	var service_url = cur_url[1];
+	var url = "/app/config/versions/"+service_url+"/"+serv
+	var win = window.open(url,"_self");
+	win.focus();
+}
+function openSection() {
+	var serv = $("#serv").val();
+	var section = $("#section").val();
+	var url = "/app/config/section/haproxy/"+serv+"/"+section;
 	var win = window.open(url,"_self");
 	win.focus();
 }
 function showLog() {
-	var waf = findGetParameter('waf');
+	var waf = cur_url[2];
 	var file = $('#log_files').val();
-	if ((file === undefined || file === null) && waf != '1') {
+	if ((file === undefined || file === null) && waf == '') {
 		var file_from_get = findGetParameter('file');
 		if (file_from_get === undefined || file_from_get === null) {
 			toastr.warning('Select a log file first')
@@ -344,26 +369,30 @@ function showLog() {
 	var grep = $('#grep').val()
 	var exgrep = $('#exgrep').val()
 	var hour = $('#time_range_out_hour').val()
-	var minut = $('#time_range_out_minut').val()
+	var minute = $('#time_range_out_minut').val()
 	var hour1 = $('#time_range_out_hour1').val()
-	var minut1 = $('#time_range_out_minut1').val()
+	var minute1 = $('#time_range_out_minut1').val()
 	var service = $('#service').val()
 	if (service == 'None') {
 		service = 'haproxy';
 	}
+	if (waf) {
+		var url = "/app/logs/" + service + "/waf/" + $("#serv").val() + "/" + rows;
+		waf = 1;
+	} else {
+		var url = "/app/logs/" + service + "/" + $("#serv").val() + "/" + rows;
+	}
 	$.ajax( {
-		url: "options.py",
+		url: url,
 		data: {
 			show_log: rows,
-			serv: $("#serv").val(),
 			waf: waf,
 			grep: grep,
 			exgrep: exgrep,
 			hour: hour,
-			minut: minut,
+			minute: minute,
 			hour1: hour1,
-			minut1: minut1,
-			service: service,
+			minute1: minute1,
 			file: file,
 			token: $('#token').val()
 		},
@@ -371,17 +400,6 @@ function showLog() {
 		success: function( data ) {
 			toastr.clear();
 			$("#ajax").html(data);
-			window.history.pushState("Logs", "Logs", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() +
-				'&rows=' + rows +
-				'&exgrep=' + exgrep +
-				'&grep=' + grep +
-				'&hour=' + hour +
-				'&minut=' + minut +
-				'&hour1=' + hour1 +
-				'&minut1=' + minut1 +
-				'&file=' + file +
-				'&waf=' + waf);
-
 		}
 	} );
 }
@@ -395,19 +413,17 @@ function showRemoteLogFiles() {
 	var grep = $('#grep').val()
 	var exgrep = $('#exgrep').val()
 	var hour = $('#time_range_out_hour').val()
-	var minut = $('#time_range_out_minut').val()
+	var minute = $('#time_range_out_minut').val()
 	var hour1 = $('#time_range_out_hour1').val()
-	var minut1 = $('#time_range_out_minut1').val()
+	var minute1 = $('#time_range_out_minut1').val()
 	var service = $('#service').val()
 	if (service == 'None') {
 		service = 'haproxy';
 	}
 	$.ajax( {
-		url: "options.py",
+		url: "/app/logs/" + service + "/" + serv ,
 		data: {
 			serv: $("#serv").val(),
-			act: "showRemoteLogFiles",
-			service: service,
 			token: $('#token').val()
 		},
 		type: "POST",
@@ -418,15 +434,6 @@ function showRemoteLogFiles() {
 				toastr.clear();
 				$("#remote_log_files").html(data);
 				$.getScript('/inc/configshow.js');
-				window.history.pushState("Logs", "Logs", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() +
-					'&rows=' + rows +
-					'&exgrep=' + exgrep +
-					'&grep=' + grep +
-					'&hour=' + hour +
-					'&minut=' + minut +
-					'&hour1=' + hour1 +
-					'&minut1=' + minut1 +
-					'&waf=0');
 			}
 		}
 	} );
@@ -448,34 +455,25 @@ function clearAllAjaxFields() {
 function showMap() {
 	clearAllAjaxFields();
 	$('#ajax-config_file_name').empty();
-	var unique = $.now();
 	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $("#serv").val(),
-			act: "showMap",
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/config/map/haproxy/" + $("#serv").val() + '/show',
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
 				$("#ajax").html(data);
-				window.history.pushState("Show map", "Show map", cur_url[0] + '?service=haproxy&serv=' + $("#serv").val() + '&showMap');
+				window.history.pushState("Show Map", "Show Map", '/app/config/map/' + $("#service").val() + '/' + $("#serv").val());
 			}
 		}
 	} );
 }
 function showCompare() {
 	$.ajax( {
-		url: "options.py",
+		url: "/app/config/compare/" + $("#service").val() + "/" + $("#serv").val() + "/show",
 		data: {
-			serv: $("#serv").val(),
 			left: $('#left').val(),
 			right: $("#right").val(),
-			service: $("#service").val(),
 			token: $('#token').val()
 		},
 		type: "POST",
@@ -493,15 +491,8 @@ function showCompareConfigs() {
 	clearAllAjaxFields();
 	$('#ajax-config_file_name').empty();
 	$.ajax( {
-		url: "options.py",
-		data: {
-			serv: $("#serv").val(),
-			act: "showCompareConfigs",
-			open: "open",
-			service: $("#service").val(),
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/config/compare/" + $("#service").val() + "/" + $("#serv").val() + "/files",
+		type: "GET",
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -510,7 +501,7 @@ function showCompareConfigs() {
 				$("#ajax-compare").html(data);
 				$("input[type=submit], button").button();
 				$("select").selectmenu();
-				window.history.pushState("Show compare config", "Show compare config", cur_url[0] + '?service=' + $("#service").val() + '&serv=' + $("#serv").val() + '&showCompare');
+				window.history.pushState("Show compare config", "Show compare config", '/app/config/compare/' + $("#service").val() + '/' + $("#serv").val());
 			}
 		}
 	} );
@@ -520,19 +511,22 @@ function showConfig() {
 	var config_file_name = encodeURI($('#config_file_name').val());
 	if (service == 'nginx' || service == 'apache') {
 		if ($('#config_file_name').val() === undefined || $('#config_file_name').val() === null) {
-			toastr.warning('Select a config file firts');
-			return false;
+			config_file_name = cur_url[4]
+			if (config_file_name == '') {
+				toastr.warning('Select a config file firts');
+				return false;
+			} else {
+				showConfigFiles(true);
+			}
 		}
 	}
 	clearAllAjaxFields();
 	$.ajax( {
-		url: "options.py",
+		url: "/app/config/" + service + "/show",
 		data: {
 			serv: $("#serv").val(),
-			act: "configShow",
 			service: service,
-			config_file_name: config_file_name,
-			token: $('#token').val()
+			config_file_name: config_file_name
 		},
 		type: "POST",
 		success: function( data ) {
@@ -542,21 +536,20 @@ function showConfig() {
 				toastr.clear();
 				$("#ajax").html(data);
 				$.getScript('/inc/configshow.js');
-				window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + "&showConfig");
+				window.history.pushState("Show config", "Show config", "/app/config/" + service + "/" + $("#serv").val() + "/show/" + config_file_name);
 			}
 		}
 	} );
 }
-function showConfigFiles() {
+function showConfigFiles(not_redirect=false) {
 	var service = $('#service').val();
+	var server_ip = $("#serv").val();
 	clearAllAjaxFields();
 	$.ajax( {
-		url: "options.py",
+		url: "/app/config/" + service + "/show-files",
 		data: {
-			serv: $("#serv").val(),
-			act: "configShowFiles",
-			service: service,
-			token: $('#token').val()
+			serv: server_ip,
+			service: service
 		},
 		type: "POST",
 		success: function( data ) {
@@ -566,7 +559,9 @@ function showConfigFiles() {
 				toastr.clear();
 				$("#ajax-config_file_name").html(data);
 				if (findGetParameter('findInConfig') === null) {
-					window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + "&showConfigFiles");
+					if (not_redirect) {
+						window.history.pushState("Show config", "Show config", "/app/config/" + service + "/" + server_ip + "/show-files");
+					}
 				}
 			}
 		}
@@ -574,18 +569,11 @@ function showConfigFiles() {
 }
 function showConfigFilesForEditing() {
 	var service = $('#service').val();
+	var server_ip = $("#serv").val();
 	var config_file_name = findGetParameter('config_file_name')
-	var service = findGetParameter('service')
 	if (service == 'nginx' || service == 'apache') {
 		$.ajax({
-			url: "options.py",
-			data: {
-				serv: $("#serv").val(),
-				act: "configShowFiles",
-				service: service,
-				config_file_name: config_file_name,
-				token: $('#token').val()
-			},
+			url: "/app/config/" + service + "/" + server_ip + "/edit/" + config_file_name,
 			type: "POST",
 			success: function (data) {
 				if (data.indexOf('error:') != '-1') {
@@ -603,13 +591,10 @@ function showUploadConfig() {
 	var configver = $('#configver').val();
 	var serv = $("#serv").val()
 	$.ajax( {
-		url: "options.py",
+		url: "/app/config/" + service + "/show",
 		data: {
 			serv: serv,
-			act: "configShow",
-			configver: configver,
-			service: service,
-			token: $('#token').val(),
+			configver: configver
 		},
 		type: "POST",
 		success: function( data ) {
@@ -618,26 +603,25 @@ function showUploadConfig() {
 			} else {
 				toastr.clear();
 				$("#ajax").html(data);
-				window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + serv + "&open=open&configver=" + configver);
+				window.history.pushState("Show config", "Show config", "/app/config/versions/" + service + "/" + serv + "/" + configver);
 				$.getScript('/inc/configshow.js');
 			}
 		}
 	} );
 }
 function showListOfVersion(for_delver) {
+	var cur_url = window.location.href.split('/app/').pop();
+	cur_url = cur_url.split('/');
 	var service = $('#service').val();
 	var serv = $("#serv").val();
-	var configver = findGetParameter('configver');
+	var configver = cur_url[4];
 	clearAllAjaxFields();
 	$.ajax( {
-		url: "options.py",
+		url: "/app/config/version/" + service + "/list",
 		data: {
 			serv: serv,
-			act: "showListOfVersion",
-			service: service,
 			configver: configver,
-			for_delver: for_delver,
-			token: $('#token').val(),
+			for_delver: for_delver
 		},
 		type: "POST",
 		success: function( data ) {
@@ -647,6 +631,7 @@ function showListOfVersion(for_delver) {
 				toastr.clear();
 				$("#config_version_div").html(data);
 				$( "input[type=checkbox]" ).checkboxradio();
+				window.history.pushState("Show config", "Show config", "/app/config/versions/" + service + "/" + serv);
 			}
 		}
 	} );
@@ -677,10 +662,12 @@ function viewLogs() {
 		if (viewlogs == null){
 			viewlogs = findGetParameter('viewlogs')
 		}
-		$.ajax( {
-			url: "options.py",
+		var url = "/app/logs/internal/" + viewlogs + "/" + rows;
+		$.ajax({
+			url: url,
 			data: {
 				viewlogs: viewlogs,
+				serv: viewlogs,
 				rows: rows,
 				grep: grep,
 				exgrep: exgrep,
@@ -691,17 +678,8 @@ function viewLogs() {
 				token: $('#token').val(),
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				$("#ajax").html(data);
-				window.history.pushState("View logs", "View logs", cur_url[0] + "?type=" + type +
-						"&viewlogs=" + viewlogs +
-						'&rows=' + rows +
-						'&grep=' + grep +
-						'&exgrep=' + exgrep +
-						'&hour=' + hour +
-						'&minut=' + minut +
-						'&hour1=' + hour1 +
-						'&minut1=' + minut1);
 			}
 		} );
 	}
@@ -711,7 +689,7 @@ $( function() {
 		try {
 			var cur_path = window.location.pathname;
 			var attr = $(this).attr('href');
-			if (cur_path == '/app/add.py' || cur_path == '/app/add_nginx.py' || cur_path == '/app/servers.py' || cur_path == '/app/users.py') {
+			if (cur_path == '/app/add/haproxy' || cur_path == '/app/add/nginx' || cur_path == '/app/servers' || cur_path == '/app/admin' || cur_path == '/app/install') {
 				if (typeof attr !== typeof undefined && attr !== false) {
 					$('title').text($(this).attr('title'));
 					history.pushState({}, '', $(this).attr('href'));
@@ -885,42 +863,37 @@ $( function() {
 		$('#0').css("display", "inline");
 	});
 	$('#auth').submit(function() {
-		let searchParams = new URLSearchParams(window.location.search)
-		if(searchParams.has('ref')) {
-			var ref = /.*ref=([^&]*).*/.exec(document.location.href)[1];
-		} else {
-			var ref = "overview.py";
-		}
 		$.ajax( {
-			url: "login.py",
+			url: "/app/login",
 			data: {
 				login: $('#login').val(),
 				pass: $('#pass').val()
 			},
 			type: "POST",
 			success: function( data ) {
-				if (data.indexOf('ok') != '-1') {
-					window.location.replace(ref);
-				} else if (data.indexOf('disabled') != '-1') {
+				if (data.indexOf('disabled') != '-1') {
 					$('.alert').show();
 					$('.alert').html(data);
 				} else if (data.indexOf('ban') != '-1') {
 					ban();
 				} else if (data.indexOf('error') != '-1') {
 					toastr.error(data);
+				} else {
+					window.location.replace(data);
 				}
 			}
 		} );
 		return false;
 	});
 	$('#show_log_form').submit(function() {
-		if(cur_url[0] == '/app/logs.py') {
-			showLog();
-		} else {
-			viewLogs();
-		}
+		showLog();
 		return false;
 	});
+	$('#show_internal_log_form').submit(function() {
+		viewLogs();
+		return false;
+	});
+
 	var user_settings_tabel_title = $( "#show-user-settings-table" ).attr('title');
 	var cancel_word = $('#translate').attr('data-cancel');
 	var save_word = $('#translate').attr('data-save');
@@ -928,29 +901,29 @@ $( function() {
 	var password_word = $('#translate').attr('data-password');
 	var change_pass_word = change_word + ' ' + password_word
 	var showUserSettings = $( "#show-user-settings" ).dialog({
-			autoOpen: false,
-			width: 600,
-			modal: true,
-			title: user_settings_tabel_title,
-			buttons: [{
-				text: save_word,
-				click: function () {
-					saveUserSettings();
-					$(this).dialog("close");
-				}
-			}, {
-				text: change_pass_word,
-				click: function () {
-					changePassword();
-					$(this).dialog("close");
-				}
-			}, {
-				text: cancel_word,
-				click: function () {
-					$(this).dialog("close");
-				}
-			}]
-		});
+		autoOpen: false,
+		width: 600,
+		modal: true,
+		title: user_settings_tabel_title,
+		buttons: [{
+			text: save_word,
+			click: function () {
+				saveUserSettings();
+				$(this).dialog("close");
+			}
+		}, {
+			text: change_pass_word,
+			click: function () {
+				changePassword();
+				$(this).dialog("close");
+			}
+		}, {
+			text: cancel_word,
+			click: function () {
+				$(this).dialog("close");
+			}
+		}]
+	});
 
 	$('#show-user-settings-button').click(function() {
 		if (localStorage.getItem('disabled_alert') == '1') {
@@ -958,170 +931,208 @@ $( function() {
 		} else {
 			$('#disable_alerting').prop('checked', true).checkboxradio('refresh');
 		}
-		$.ajax( {
-			url: "options.py",
-			data: {
-				getcurrentusergroup: 1,
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
+		$.ajax({
+			url: "/app/user/group/current",
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
 				if (data.indexOf('danger') != '-1') {
 					$("#ajax").html(data);
 				} else {
 					$('#show-user-settings-group').html(data);
-					$( "select" ).selectmenu();
+					$("select").selectmenu();
 				}
 			}
-		} );
+		});
 		showUserSettings.dialog('open');
 	});
-	var location = window.location.href;
-    var cur_url = '/app/' + location.split('/').pop();
-	cur_url = cur_url.split('?');
-	cur_url = cur_url[0].split('#');
-	if (cur_url[0] == "/app/users.py" || cur_url[0] == "/app/servers.py") {
-		$( ".users" ).on( "click", function() {
+	var cur_url = window.location.href.split('/app/').pop();
+	cur_url = cur_url.split('/');
+	if (cur_url[0].indexOf('install') != '-1') {
+		$(".installproxy").on("click", function () {
 			$('.menu li ul li').each(function () {
 				$(this).find('a').css('padding-left', '20px')
 				$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+				$(this).find('a').css('background-color', '#48505A');
+				$(this).children(".installproxy").css('padding-left', '30px');
+				$(this).children(".installproxy").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+				$(this).children(".installproxy").css('background-color', 'var(--right-menu-blue-rolor)');
+			});
+			$("#tabs").tabs("option", "active", 0);
+		});
+		$(".installmon").on("click", function () {
+			$('.menu li ul li').each(function () {
+				$(this).find('a').css('padding-left', '20px')
+				$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+				$(this).find('a').css('background-color', '#48505A');
+				$(this).children(".installmon").css('padding-left', '30px');
+				$(this).children(".installmon").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+				$(this).children(".installmon").css('background-color', 'var(--right-menu-blue-rolor)');
+			});
+			$("#tabs").tabs("option", "active", 1);
+		});
+		$(".installgeo").on("click", function () {
+			$('.menu li ul li').each(function () {
+				$(this).find('a').css('padding-left', '20px')
+				$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+				$(this).find('a').css('background-color', '#48505A');
+				$(this).children(".installgeo").css('padding-left', '30px');
+				$(this).children(".installgeo").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+				$(this).children(".installgeo").css('background-color', 'var(--right-menu-blue-rolor)');
+			});
+			$("#tabs").tabs("option", "active", 2);
+		});
+	}
+	if (cur_url[0].indexOf('admin') != '-1' || cur_url[0].indexOf('servers') != '-1') {
+		$(".users").on("click", function () {
+			$('.menu li ul li').each(function () {
+				$(this).find('a').css('padding-left', '20px')
+				$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+				$(this).find('a').css('background-color', '#48505A');
 				$(this).children(".users").css('padding-left', '30px');
 				$(this).children(".users").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+				$(this).children(".users").css('background-color', 'var(--right-menu-blue-rolor)');
 			});
-			$( "#tabs" ).tabs( "option", "active", 0 );
-		} );
-		if (cur_url[0] == "/app/users.py") {
-			$( ".group" ).on( "click", function() {
+			$("#tabs").tabs("option", "active", 0);
+		});
+		if (cur_url[0].indexOf('admin') != '-1') {
+			$(".group").on("click", function () {
 				$('.menu li ul li').each(function () {
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".group").css('padding-left', '30px');
 					$(this).children(".group").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".group").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 1 );
-			} );
-			$( ".runtime" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 1);
+			});
+			$(".runtime").on("click", function () {
 				$('.menu li ul li').each(function () {
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".runtime").css('padding-left', '30px');
 					$(this).children(".runtime").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".runtime").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 2 );
-			} );
-			$( ".admin" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 2);
+			});
+			$(".admin").on("click", function () {
 				$('.menu li ul li').each(function () {
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".admin").css('padding-left', '30px');
 					$(this).children(".admin").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".admin").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 3 );
-			} );
-			$( ".checker" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 3);
+			});
+			$(".settings").on("click", function () {
 				$('.menu li ul li').each(function () {
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
-					$(this).children(".checker").css('padding-left', '30px');
-					$(this).children(".checker").css('border-left', '4px solid var(--right-menu-blue-rolor)');
-				});
-				loadchecker();
-				$( "#tabs" ).tabs( "option", "active", 4 );
-			} );
-			$( ".settings" ).on( "click", function() {
-				$('.menu li ul li').each(function () {
-					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".settings").css('padding-left', '30px');
 					$(this).children(".settings").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".settings").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 6 );
-			} );
-			$( ".services" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 5);
+			});
+			$(".services").on("click", function () {
 				$('.menu li ul li').each(function () {
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".services").css('padding-left', '30px');
 					$(this).children(".services").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".services").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
+				$("#tabs").tabs("option", "active", 6);
 				loadServices();
-				$( "#tabs" ).tabs( "option", "active", 7 );
-			} );
-			$( ".updatehapwi" ).on( "click", function() {
+			});
+			$(".updatehapwi").on("click", function () {
 				$('.menu li ul li').each(function () {
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".updatehapwi").css('padding-left', '30px');
 					$(this).children(".updatehapwi").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".updatehapwi").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 8 );
+				$("#tabs").tabs("option", "active", 7);
 				loadupdatehapwi();
-			} );
+			});
 		} else {
-			$( ".runtime" ).on( "click", function() {
+			$(".runtime").on("click", function () {
 				$('.menu li ul li').each(function () {
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".runtime").css('padding-left', '30px');
 					$(this).children(".runtime").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".runtime").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 1 );
-			} );
-			$( ".admin" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 1);
+			});
+			$(".admin").on("click", function () {
 				$('.menu li ul li').each(function () {
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".admin").css('padding-left', '30px');
 					$(this).children(".admin").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".admin").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 2 );
-			} );
-			$( ".checker" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 2);
+			});
+			$(".settings").on("click", function () {
 				$('.menu li ul li').each(function () {
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
-					$(this).children(".checker").css('padding-left', '30px');
-					$(this).children(".checker").css('border-left', '4px solid var(--right-menu-blue-rolor)');
-				});
-				loadchecker();
-				$( "#tabs" ).tabs( "option", "active", 3 );
-			} );
-			$( ".settings" ).on( "click", function() {
-				$('.menu li ul li').each(function () {
-					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".settings").css('padding-left', '30px');
 					$(this).children(".settings").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".settings").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 4 );
-			} );
-			$( ".installproxy" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 4);
+			});
+			$(".installproxy").on("click", function () {
 				$('.menu li ul li').each(function () {
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".installproxy").css('padding-left', '30px');
 					$(this).children(".installproxy").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".installproxy").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 5 );
-			} );
-			$( ".installmon" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 5);
+			});
+			$(".installmon").on("click", function () {
 				$('.menu li ul li').each(function () {
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".installmon").css('padding-left', '30px');
 					$(this).children(".installmon").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".installmon").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 6 );
-			} );
-			$( ".backup" ).on( "click", function() {
+				$("#tabs").tabs("option", "active", 6);
+			});
+			$(".backup").on("click", function () {
 				$('.menu li ul li').each(function () {
-					$(this).find('a').css('padding-left', '20px')
+					$(this).find('a').css('padding-left', '20px');
 					$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
+					$(this).find('a').css('background-color', '#48505A');
 					$(this).children(".backup").css('padding-left', '30px');
 					$(this).children(".backup").css('border-left', '4px solid var(--right-menu-blue-rolor)');
+					$(this).children(".backup").css('background-color', 'var(--right-menu-blue-rolor)');
 				});
-				$( "#tabs" ).tabs( "option", "active", 7 );
-			} );
+				$("#tabs").tabs("option", "active", 7);
+			});
 		}
 	}
 	$('.copyToClipboard').hover(function (){
@@ -1147,7 +1158,7 @@ function saveUserSettings(){
 		localStorage.setItem('disabled_alert', '1');
 	}
 	changeCurrentGroupF();
-	Cookies.set('lang', $('#lang_select').val(), { expires: 365, path: '/app', samesite: 'strict', secure: 'true' });
+	Cookies.set('lang', $('#lang_select').val(), { expires: 365, path: '/', samesite: 'strict', secure: 'true' });
 }
 function sleep(ms) {
 	return new Promise(resolve => setTimeout(resolve, ms));
@@ -1156,7 +1167,7 @@ async function ban() {
 	$( '#login').attr('disabled', 'disabled');
 	$( '#pass').attr('disabled', 'disabled');
 	$( "input[type=submit], button" ).button('disable');
-	$('.alert').show();
+	$('#wrong-login').show();
 	$('#ban_10').show();
 	$( '#ban_timer').text(10);
 
@@ -1183,7 +1194,7 @@ function replace_text(id_textarea, text_var) {
 }
 function createHistroy() {
 	if(localStorage.getItem('history') === null) {
-		var get_history_array = ['login.py', 'login.py','login.py'];
+		var get_history_array = ['login', 'login','login'];
 		localStorage.setItem('history', JSON.stringify(get_history_array));
 	}
 }
@@ -1201,7 +1212,7 @@ function listHistroy() {
 		}
 		if (i == 2) {
 			if(cur_url[1] !== undefined) {
-				browse_history[2] = cur_url[0] + '?' + cur_url[1]
+				browse_history[2] = cur_url[0] + '/' + cur_url[1]
 			} else {
 				browse_history[2] = cur_url[0]
 			}
@@ -1209,8 +1220,7 @@ function listHistroy() {
 		$( function() {
 			$('.menu li ul li').each(function () {
 				var link1 = $(this).find('a').attr('href');
-				var link2 = link1.split('/')[2]
-				if (browse_history[i] == link2) {
+				if (browse_history[i] == link1) {
 					title[i] = $(this).find('a').attr('title');
 					link_text[i] = $(this).find('a').text();
 					history_link = '<li><a href="'+browse_history[i]+'" title="'+title[i]+'">'+link_text[i]+'</a></li>'
@@ -1224,18 +1234,18 @@ function listHistroy() {
 createHistroy()
 listHistroy()
 
-function changeCurrentGroupF(){
+function changeCurrentGroupF() {
 	Cookies.remove('group');
-	Cookies.set('group', $('#newCurrentGroup').val(), { expires: 365, path: '/app', samesite: 'strict', secure: 'true' });
-	$.ajax( {
-		url: "options.py",
+	Cookies.set('group', $('#newCurrentGroup').val(), {expires: 365, path: '/', samesite: 'strict', secure: 'true'});
+	$.ajax({
+		url: "/app/user/group/change",
 		data: {
 			changeUserCurrentGroupId: $('#newCurrentGroup').val(),
 			changeUserGroupsUser: Cookies.get('uuid'),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
+		success: function (data) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.error(data);
 			} else {
@@ -1243,8 +1253,7 @@ function changeCurrentGroupF(){
 				location.reload();
 			}
 		}
-	} );
-
+	});
 }
 function updateTips( t ) {
 	var tips = $( ".validateTips" );
@@ -1367,71 +1376,68 @@ function changePassword() {
 function changeUserPasswordItOwn(d) {
 	var pass = $('#change-password').val();
 	var pass2 = $('#change2-password').val();
-	if(pass != pass2) {
+	if (pass != pass2) {
 		$('#missmatchpass').show();
 	} else {
 		$('#missmatchpass').hide();
 		toastr.clear();
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/user/password",
 			data: {
 				updatepassowrd: pass,
 				uuid: Cookies.get('uuid'),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					toastr.clear();
-					d.dialog( "close" );
+					d.dialog("close");
 				}
 			}
-		} );
+		});
 	}
 }
 function findInConfig(words) {
 	clearAllAjaxFields();
-		$.ajax( {
-			url: "options.py",
-			data: {
-				serv: $("#serv").val(),
-				act: "findInConfigs",
-				service: $("#service").val(),
-				words: words,
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				if (data.indexOf('error:') != '-1') {
-					toastr.error(data);
-				} else {
-					toastr.clear();
-					$("#ajax").html(data);
-				}
+	$.ajax({
+		url: "/app/config/" + $("#service").val() + "/find-in-config",
+		data: {
+			serv: $("#serv").val(),
+			words: words
+		},
+		type: "POST",
+		success: function (data) {
+			if (data.indexOf('error:') != '-1') {
+				toastr.error(data);
+			} else {
+				toastr.clear();
+				$("#ajax").html(data);
 			}
-		} );
+		}
+	});
 }
 function waitForElm(selector) {
-    return new Promise(resolve => {
-        if (document.querySelector(selector)) {
-            return resolve(document.querySelector(selector));
-        }
+	return new Promise(resolve => {
+		if (document.querySelector(selector)) {
+			return resolve(document.querySelector(selector));
+		}
 
-        const observer = new MutationObserver(mutations => {
-            if (document.querySelector(selector)) {
-                resolve(document.querySelector(selector));
-                observer.disconnect();
-            }
-        });
+		const observer = new MutationObserver(mutations => {
+			if (document.querySelector(selector)) {
+				resolve(document.querySelector(selector));
+				observer.disconnect();
+			}
+		});
 
-        observer.observe(document.body, {
-            childList: true,
-            subtree: true
-        });
-    });
+		observer.observe(document.body, {
+			childList: true,
+			subtree: true
+		});
+	});
 }
 function randomIntFromInterval(min, max) {
   return Math.floor(Math.random() * (max - min + 1) + min)
@@ -1469,7 +1475,7 @@ function returnNiceCheckingConfig(data) {
 		console.log(err);
 	}
 	alerts.forEach((element) => {
-		if (element.indexOf('error: ') != '-1' || element.indexOf('Fatal') != '-1' || element.indexOf('Error') != '-1' || element.indexOf('failed ') != '-1' || element.indexOf('emerg] ') != '-1' || element.indexOf('Syntax error ') != '-1' || element.indexOf('Parsing') != '-1' || element.indexOf('parsing') != '-1') {
+		if (element.indexOf('error: ') != '-1' || element.indexOf('Fatal') != '-1' || element.indexOf('Error') != '-1' || element.indexOf('failed ') != '-1' || element.indexOf('emerg] ') != '-1' || element.indexOf('Syntax error ') != '-1' || element.indexOf('Parsing') != '-1') {
 			alert_error = alert_error + element;
 			return
 		}
@@ -1512,12 +1518,7 @@ function returnNiceCheckingConfig(data) {
 function show_version() {
 	NProgress.configure({showSpinner: false});
 	$.ajax( {
-		url: "options.py",
-		data: {
-			show_versions: 1,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/internal/show_version",
 		success: function( data ) {
 			$('#version').html(data);
 			var showUpdates = $( "#show-updates" ).dialog({
diff --git a/inc/smon-6.3.16.js b/inc/smon.js
similarity index 93%
rename from inc/smon-6.3.16.js
rename to inc/smon.js
index 108be196..800dbec3 100644
--- a/inc/smon-6.3.16.js
+++ b/inc/smon.js
@@ -13,8 +13,7 @@ function showSmon(action) {
 	var sort = '';
 	var location = window.location.href;
 	var cur_url = '/app/' + location.split('/').pop();
-	cur_url = cur_url.split('?');
-	cur_url[1] = cur_url[1].split('#')[0];
+	console.log(cur_url)
 	if (action == 'refresh') {
 		try {
 			sort = cur_url[1].split('&')[1];
@@ -23,28 +22,27 @@ function showSmon(action) {
 			sort = '';
 		}
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/smon/refresh",
 		data: {
-			showsmon: 1,
 			sort: sort,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
+		success: function (data) {
 			if (data.indexOf('SMON error:') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
 				$("#smon_dashboard").html(data);
-				if (action == 'not_sort') {
-					window.history.pushState("SMON Dashboard", document.title, "smon.py?action=view");
-				} else {
-					window.history.pushState("SMON Dashboard", document.title, cur_url[0] + "?" + cur_url[1]);
-				}
+				// if (action == 'not_sort') {
+				// 	window.history.pushState("SMON Dashboard", document.title, "/app/smon");
+				// } else {
+				// 	window.history.pushState("SMON Dashboard", document.title, cur_url[0] + "?" + cur_url[1]);
+				// }
 			}
 		}
-	} );
+	});
 }
 function addNewSmonServer(dialog_id) {
 	var valid = true;
@@ -83,7 +81,7 @@ function addNewSmonServer(dialog_id) {
 	}
 	if (valid) {
 		$.ajax( {
-			url: "options.py",
+			url: "/app/smon/add",
 			data: {
 				newsmonname: $('#new-smon-name').val(),
 				newsmon: $('#new-smon-ip').val(),
@@ -155,15 +153,15 @@ function confirmDeleteSmon(id, check_type) {
 function removeSmon(id, check_type) {
 	$("#smon-"+id).css("background-color", "#f2dede");
 	$.ajax( {
-		url: "options.py",
-		data: {
-			smondel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/smon/delete/" + id,
+		// data: {
+		// 	smondel: id,
+		// 	token: $('#token').val()
+		// },
+		type: "GET",
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
+			if(data == "Ok") {
 				$("#smon-"+check_type+"-"+id).remove();
 			} else {
 				toastr.error(data);
@@ -179,7 +177,7 @@ function updateSmon(id, check_type) {
 		enable = '1';
 	}
 	$.ajax( {
-		url: "options.py",
+		url: "/app/smon/update/"+id,
 		data: {
 			updateSmonName: $('#smon-name-'+id).val(),
 			updateSmonIp: $('#smon-ip-'+id).val(),
@@ -197,7 +195,6 @@ function updateSmon(id, check_type) {
 			updateSmonPacket_size: $('#smon-packet_size-'+id).val(),
 			updateSmon_http_method: $('#smon-http_method-'+id).val(),
 			check_type: check_type,
-			id: id,
 			token: $('#token').val()
 		},
 		type: "POST",
@@ -374,14 +371,7 @@ function clear_check_vals() {
 }
 function show_statuses(dashboard_id, check_id) {
 	$.ajax({
-		url: "options.py",
-		data: {
-			smon_history_statuses: 1,
-			dashboard_id: dashboard_id,
-			check_id: check_id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/smon/history/statuses/" + dashboard_id + "/" + check_id,
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
@@ -399,14 +389,7 @@ function show_statuses(dashboard_id, check_id) {
 		}
 	});
 	$.ajax({
-		url: "options.py",
-		data: {
-			smon_cur_status: 1,
-			dashboard_id: dashboard_id,
-			check_id: check_id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/smon/history/cur_status/" + dashboard_id + "/" + check_id,
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
diff --git a/inc/users.js b/inc/users.js
index e2280949..4e9c6b68 100644
--- a/inc/users.js
+++ b/inc/users.js
@@ -1,4 +1,6 @@
 var awesome = "/inc/fontawesome.min.js"
+var cur_url = window.location.href.split('/app/').pop();
+cur_url = cur_url.split('/');
 $( function() {
 	var add_word = $('#translate').attr('data-add');
 	var delete_word = $('#translate').attr('data-delete');
@@ -20,27 +22,26 @@ $( function() {
 			return false
 		}
 		$("#ajax").html(wait_mess);
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/install/haproxy/" + $('#haproxyaddserv').val(),
 			data: {
-				haproxyaddserv: $('#haproxyaddserv').val(),
 				syn_flood: syn_flood,
-				hapver: $('#hapver option:selected' ).val(),
+				hapver: $('#hapver option:selected').val(),
 				docker: docker,
 				token: $('#token').val()
-				},
+			},
 			type: "POST",
-			success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				$("#ajax").html('')
 				if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if (data.indexOf('success') != '-1' ){
+				} else if (data.indexOf('success') != '-1') {
 					toastr.remove();
 					toastr.success(data);
-					$( "#haproxyaddserv" ).trigger( "selectmenuchange" );
-				} else if (data.indexOf('Info') != '-1' ){
+					$("#haproxyaddserv").trigger("selectmenuchange");
+				} else if (data.indexOf('Info') != '-1') {
 					toastr.remove();
 					toastr.info(data);
 				} else {
@@ -48,7 +49,7 @@ $( function() {
 					toastr.info(data);
 				}
 			}
-		} );
+		});
 	});
 	$('#nginx_install').click(function() {
 		installService('nginx');
@@ -59,24 +60,23 @@ $( function() {
 	$('#grafna_install').click(function() {
 		$("#ajaxmon").html('');
 		$("#ajaxmon").html(wait_mess);
-		$.ajax( {
-			url: "options.py",
-			data: {
-				install_grafana: '1',
-				token: $('#token').val()
-				},
-			type: "POST",
-			success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		$.ajax({
+			url: "/app/install/grafana",
+			// data: {
+			// 	token: $('#token').val()
+			// 	},
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				$("#ajaxmon").html('');
 				if (data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1' || data.indexOf('ERROR') != '-1') {
 					toastr.clear();
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if (data.indexOf('success') != '-1' ){
+				} else if (data.indexOf('success') != '-1') {
 					toastr.clear();
 					toastr.success(data);
-				} else if (data.indexOf('Info') != '-1' ){
+				} else if (data.indexOf('Info') != '-1') {
 					toastr.clear();
 					toastr.info(data);
 				} else {
@@ -84,7 +84,7 @@ $( function() {
 					toastr.info(data);
 				}
 			}
-		} );
+		});
 	});
 	$('#haproxy_exp_install').click(function() {
 		$("#ajaxmon").html('')
@@ -93,28 +93,28 @@ $( function() {
 		if ($('#haproxy_ext_prom').is(':checked')) {
 			ext_prom = '1';
 		}
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/install/exporter/haproxy",
 			data: {
-				haproxy_exp_install: $('#haproxy_exp_addserv').val(),
+				server_ip: $('#haproxy_exp_addserv').val(),
 				exporter_v: $('#hapexpver').val(),
 				ext_prom: ext_prom,
 				token: $('#token').val()
-				},
+			},
 			type: "POST",
-			success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				$("#ajaxmon").html('');
 				if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 					toastr.clear();
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if (data.indexOf('success') != '-1' ){
+				} else if (data.indexOf('success') != '-1') {
 					toastr.clear();
 					toastr.success(data);
 					$('#cur_haproxy_exp_ver').text('HAProxy exporter is installed');
-					$("#haproxy_exp_addserv").trigger( "selectmenuchange" );
-				} else if (data.indexOf('Info') != '-1' ){
+					$("#haproxy_exp_addserv").trigger("selectmenuchange");
+				} else if (data.indexOf('Info') != '-1') {
 					toastr.clear();
 					toastr.info(data);
 				} else {
@@ -122,7 +122,7 @@ $( function() {
 					toastr.info(data);
 				}
 			}
-		} );
+		});
 	});
 	$('#nginx_exp_install').click(function() {
 		$("#ajaxmon").html('')
@@ -131,28 +131,27 @@ $( function() {
 		if ($('#nginx_ext_prom').is(':checked')) {
 			ext_prom = '1';
 		}
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/install/exporter/nginx",
 			data: {
-				nginx_exp_install: 1,
-				serv: $('#nginx_exp_addserv').val(),
+				server_ip: $('#nginx_exp_addserv').val(),
 				exporter_v: $('#nginxexpver').val(),
 				ext_prom: ext_prom,
 				token: $('#token').val()
-				},
+			},
 			type: "POST",
-			success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				$("#ajaxmon").html('');
 				if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if (data.indexOf('success') != '-1' ){
+				} else if (data.indexOf('success') != '-1') {
 					toastr.clear();
 					toastr.success(data);
 					$('#cur_nginx_exp_ver').text('NGINX exporter is installed');
-					$("#nginx_exp_addserv").trigger( "selectmenuchange" );
-				} else if (data.indexOf('Info') != '-1' ){
+					$("#nginx_exp_addserv").trigger("selectmenuchange");
+				} else if (data.indexOf('Info') != '-1') {
 					toastr.clear();
 					toastr.info(data);
 				} else {
@@ -160,7 +159,7 @@ $( function() {
 					toastr.info(data);
 				}
 			}
-		} );
+		});
 	});
 	$('#apache_exp_install').click(function() {
 		$("#ajaxmon").html('')
@@ -169,28 +168,27 @@ $( function() {
 		if ($('#apache_ext_prom').is(':checked')) {
 			ext_prom = '1';
 		}
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/install/exporter/apache",
 			data: {
-				apache_exp_install: 1,
-				serv: $('#apache_exp_addserv').val(),
+				server_ip: $('#apache_exp_addserv').val(),
 				exporter_v: $('#apacheexpver').val(),
 				ext_prom: ext_prom,
 				token: $('#token').val()
-				},
+			},
 			type: "POST",
-			success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				$("#ajaxmon").html('');
 				if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if (data.indexOf('success') != '-1' ){
+				} else if (data.indexOf('success') != '-1') {
 					toastr.clear();
 					toastr.success(data);
 					$('#cur_apache_exp_ver').text('Apache exporter is installed');
-					$("#apache_exp_addserv").trigger( "selectmenuchange" );
-				} else if (data.indexOf('Info') != '-1' ){
+					$("#apache_exp_addserv").trigger("selectmenuchange");
+				} else if (data.indexOf('Info') != '-1') {
 					toastr.clear();
 					toastr.info(data);
 				} else {
@@ -198,7 +196,7 @@ $( function() {
 					toastr.info(data);
 				}
 			}
-		} );
+		});
 	});
 	$('#keepalived_exp_install').click(function() {
 		$("#ajaxmon").html('')
@@ -208,9 +206,9 @@ $( function() {
 			ext_prom = '1';
 		}
 		$.ajax( {
-			url: "options.py",
+			url: "/app/install/exporter/keepalived",
 			data: {
-				keepalived_exp_install: $('#keepalived_exp_addserv').val(),
+				server_ip: $('#keepalived_exp_addserv').val(),
 				exporter_v: $('#keepalivedexpver').val(),
 				ext_prom: ext_prom,
 				token: $('#token').val()
@@ -244,27 +242,27 @@ $( function() {
 		if ($('#node_ext_prom').is(':checked')) {
 			ext_prom = '1';
 		}
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/install/exporter/node",
 			data: {
-				node_exp_install: $('#node_exp_addserv').val(),
+				server_ip: $('#node_exp_addserv').val(),
 				exporter_v: $('#nodeexpver').val(),
 				ext_prom: ext_prom,
 				token: $('#token').val()
-				},
+			},
 			type: "POST",
-			success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				$("#ajaxmon").html('');
 				if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if (data.indexOf('success') != '-1' ){
+				} else if (data.indexOf('success') != '-1') {
 					toastr.clear();
 					toastr.success(data);
 					$('#cur_node_exp_ver').text('Node exporter is installed');
-					$("#node_exp_addserv").trigger( "selectmenuchange" );
-				} else if (data.indexOf('Info') != '-1' ){
+					$("#node_exp_addserv").trigger("selectmenuchange");
+				} else if (data.indexOf('Info') != '-1') {
 					toastr.clear();
 					toastr.info(data);
 				} else {
@@ -272,7 +270,7 @@ $( function() {
 					toastr.info(data);
 				}
 			}
-		} );
+		});
 	});
 	$( "#haproxyaddserv" ).on('selectmenuchange',function() {
 		showServiceVersion('haproxy');
@@ -285,13 +283,11 @@ $( function() {
 	});
 	$( "#haproxy_exp_addserv" ).on('selectmenuchange',function() {
 		$.ajax( {
-			url: "options.py",
-			data: {
-				get_exporter_v: 'haproxy_exporter',
-				serv: $('#haproxy_exp_addserv option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
+			url: "/app/install/exporter/haproxy/version/" + $('#haproxy_exp_addserv option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
 			success: function( data ) {
 				data = data.replace(/^\s+|\s+$/g,'');
 				if (data.indexOf('error:') != '-1') {
@@ -306,94 +302,86 @@ $( function() {
 		} );
 	});
 	$( "#nginx_exp_addserv" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_exporter_v: 'nginx_exporter',
-				serv: $('#nginx_exp_addserv option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/exporter/nginx/version/" + $('#nginx_exp_addserv option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					toastr.clear();
 					toastr.error(data);
-				} else if(data == 'no' || data == '' || data.indexOf('No') != '-1') {
+				} else if (data == 'no' || data == '' || data.indexOf('No') != '-1') {
 					$('#cur_nginx_exp_ver').text('NGINX exporter has not been installed');
 				} else {
 					$('#cur_nginx_exp_ver').text(data);
 				}
 			}
-		} );
+		});
 	});
 	$( "#apache_exp_addserv" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_exporter_v: 'apache_exporter',
-				serv: $('#apache_exp_addserv option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/exporter/apache/version/" + $('#apache_exp_addserv option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					toastr.clear();
 					toastr.error(data);
-				} else if(data == 'no' || data == '' || data.indexOf('No') != '-1') {
+				} else if (data == 'no' || data == '' || data.indexOf('No') != '-1') {
 					$('#cur_apache_exp_ver').text('Apache exporter has not been installed');
 				} else {
 					$('#cur_apache_exp_ver').text(data);
 				}
 			}
-		} );
+		});
 	});
 	$( "#keepalived_exp_addserv" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_exporter_v: 'keepalived_exporter',
-				serv: $('#keepalived_exp_addserv option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/exporter/keepalived/version/" + $('#keepalived_exp_addserv option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					toastr.clear();
 					toastr.error(data);
 				} else if (data.indexOf('keepalived_exporter.service') != '-1') {
 					$('#cur_keepalived_exp_ver').text('Keepalived exporter has been installed');
-				} else if(data == 'no' || data == '' || data.indexOf('No') != '-1') {
+				} else if (data == 'no' || data == '' || data.indexOf('No') != '-1') {
 					$('#cur_keepalived_exp_ver').text('Keepalived exporter has not been installed');
 				} else {
 					$('#cur_keepalived_exp_ver').text(data);
 				}
 			}
-		} );
+		});
 	});
 	$( "#node_exp_addserv" ).on('selectmenuchange',function() {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				get_exporter_v: 'node_exporter',
-				serv: $('#node_exp_addserv option:selected').val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+		$.ajax({
+			url: "/app/install/exporter/node/version/" + $('#node_exp_addserv option:selected').val(),
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('error:') != '-1') {
 					toastr.clear();
 					toastr.error(data);
-				} else if(data == 'no' || data.indexOf('command') != '-1' || data == '') {
+				} else if (data == 'no' || data.indexOf('command') != '-1' || data == '') {
 					$('#cur_node_exp_ver').text('Node exporter has not been installed');
 				} else {
 					$('#cur_node_exp_ver').text(data);
 				}
 			}
-		} );
+		});
 	});
 	$('#add-group-button').click(function() {
 		addGroupDialog.dialog('open');
@@ -846,20 +834,19 @@ $( function() {
 	$('#search_ldap_user').click(function() {
 		var valid = true;
 		toastr.clear();
-		allFields = $( [] ).add( $('#new-username') );
-		allFields.removeClass( "ui-state-error" );
-		valid = valid && checkLength( $('#new-username'), "user name", 1 );
+		allFields = $([]).add($('#new-username'));
+		allFields.removeClass("ui-state-error");
+		valid = valid && checkLength($('#new-username'), "user name", 1);
 		user = $('#new-username').val()
 		if (valid) {
-			$.ajax( {
-				url: "options.py",
-				data: {
-					get_ldap_email: $('#new-username').val(),
-					token: $('#token').val()
-				},
-				type: "POST",
-				success: function( data ) {
-					data = data.replace(/\s+/g,' ');
+			$.ajax({
+				url: "/app/user/ldap/" + $('#new-username').val(),
+				// data: {
+				// 	token: $('#token').val()
+				// },
+				// type: "POST",
+				success: function (data) {
+					data = data.replace(/\s+/g, ' ');
 					if (data.indexOf('error:') != '-1') {
 						toastr.error(data);
 						$('#new-email').val('');
@@ -876,7 +863,7 @@ $( function() {
 						$('#new-password').attr('readonly', true);
 					}
 				}
-			} );
+			});
 			clearTips();
 		}
 	});
@@ -897,27 +884,27 @@ $( function() {
 			updating_geoip = '1';
 		}
 		$("#ajax-geoip").html(wait_mess);
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/install/geoip",
 			data: {
-				geoip_install: $('#geoipserv option:selected').val(),
-				geoip_service: $('#geoip_service option:selected').val(),
-				geoip_update: updating_geoip,
+				server_ip: $('#geoipserv option:selected').val(),
+				service: $('#geoip_service option:selected').val(),
+				update: updating_geoip,
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/^\s+|\s+$/g,'');
+			success: function (data) {
+				data = data.replace(/^\s+|\s+$/g, '');
 				$("#ajax-geoip").html('')
 				if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1') {
 					toastr.clear();
 					var p_err = show_pretty_ansible_error(data);
 					toastr.error(p_err);
-				} else if (data.indexOf('success:') != '-1' ){
+				} else if (data.indexOf('success:') != '-1') {
 					toastr.clear();
 					toastr.success(data);
-					$( "#geoip_service" ).trigger( "selectmenuchange" );
-				} else if (data.indexOf('Info') != '-1' ){
+					$("#geoip_service").trigger("selectmenuchange");
+				} else if (data.indexOf('Info') != '-1') {
 					toastr.clear();
 					toastr.info(data);
 				} else {
@@ -925,35 +912,29 @@ $( function() {
 					toastr.info(data);
 				}
 			}
-		} );
+		});
 	});
 	$("#tabs ul li").click(function() {
 		var activeTab = $(this).find("a").attr("href");
 		var activeTabClass = activeTab.replace('#', '');
+		console.log(activeTab)
+		console.log(activeTabClass)
 		$('.menu li ul li').each(function () {
 			$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
 			$(this).find('a').css('padding-left', '20px')
+			$(this).find('a').css('background-color', '#48505A');
 			$(this).children("."+activeTabClass).css('padding-left', '30px');
 			$(this).children("."+activeTabClass).css('border-left', '4px solid var(--right-menu-blue-rolor)');
+			$(this).children("."+activeTabClass).css('background-color', 'var(--right-menu-blue-rolor)');
 		});
-		if (activeTab == '#services') {
+		if (activeTab == '#tools') {
 			loadServices();
 		} else if (activeTab == '#updatehapwi') {
 			loadupdatehapwi();
-		} else if (activeTab == '#checker'){
-			loadchecker();
 		} else if (activeTab == '#openvpn'){
 			loadopenvpn();
 		}
 	});
-	$("#checker_tabs ul li").click(function() {
-		$('.menu li ul li').each(function () {
-			$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
-			$(this).find('a').css('padding-left', '20px')
-			$(this).children(".checker").css('padding-left', '30px');
-			$(this).children(".checker").css('border-left', '4px solid var(--right-menu-blue-rolor)');
-		});
-	});
 	$("#backup_tabs ul li").click(function() {
 		$('.menu li ul li').each(function () {
 			$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
@@ -966,20 +947,14 @@ $( function() {
 window.onload = function() {
 	$('#tabs').tabs();
 	var activeTabIdx = $('#tabs').tabs('option','active')
-	if (cur_url[0].split('#')[0] == 'users.py') {
-		if (activeTabIdx == 7) {
+	if (cur_url[0].split('#')[0] == 'admin') {
+		if (activeTabIdx == 6) {
 			loadServices();
-		} else if (activeTabIdx == 8) {
+		} else if (activeTabIdx == 7) {
 			loadupdatehapwi();
 		} else if (activeTabIdx == 4) {
-			loadchecker();
-		} else if (activeTabIdx == 5) {
 			loadopenvpn();
 		}
-	} else if (cur_url[0].split('#')[0] == 'servers.py') {
-		if (activeTabIdx == 3) {
-			loadchecker();
-		}
 	}
 }
 function common_ajax_action_after_success(dialog_id, new_group, ajax_append_id, data) {
@@ -996,20 +971,19 @@ function common_ajax_action_after_success(dialog_id, new_group, ajax_append_id,
 function addUser(dialog_id) {
 	var valid = true;
 	toastr.clear();
-	allFields = $( [] ).add( $('#new-username') ).add( $('#new-password') ).add( $('#new-email') )
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#new-username'), "user name", 1 );
-	valid = valid && checkLength( $('#new-password'), "password", 1 );
-	valid = valid && checkLength( $('#new-email'), "Email", 1 );
+	allFields = $([]).add($('#new-username')).add($('#new-password')).add($('#new-email'))
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#new-username'), "user name", 1);
+	valid = valid && checkLength($('#new-password'), "password", 1);
+	valid = valid && checkLength($('#new-email'), "Email", 1);
 	var activeuser = 0;
 	if ($('#activeuser').is(':checked')) {
 		activeuser = '1';
 	}
 	if (valid) {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/user/create",
 			data: {
-				newuser: "1",
 				newusername: $('#new-username').val(),
 				newpassword: $('#new-password').val(),
 				newemail: $('#new-email').val(),
@@ -1020,46 +994,45 @@ function addUser(dialog_id) {
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					var getId = new RegExp('[0-9]+');
 					var id = data.match(getId);
-					common_ajax_action_after_success(dialog_id, 'user-'+id, 'ajax-users', data);
+					common_ajax_action_after_success(dialog_id, 'user-' + id, 'ajax-users', data);
 				}
 			}
-		} );
+		});
 	}
 }
 function addGroup(dialog_id) {
 	toastr.clear();
 	var valid = true;
-	allFields = $( [] ).add( $('#new-group-add') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#new-group-add'), "new group name", 1 );
-	if(valid) {
-		$.ajax( {
-			url: "options.py",
+	allFields = $([]).add($('#new-group-add'));
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#new-group-add'), "new group name", 1);
+	if (valid) {
+		$.ajax({
+			url: "/app/server/group/create",
 			data: {
-				newgroup: "1",
 				groupname: $('#new-group-add').val(),
 				newdesc: $('#new-desc').val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					var getId = new RegExp('[0-9]+');
 					var id = data.match(getId);
-					$('select:regex(id, group)').append('<option value='+id+'>'+$('#new-group-add').val()+'</option>').selectmenu("refresh");
+					$('select:regex(id, group)').append('<option value=' + id + '>' + $('#new-group-add').val() + '</option>').selectmenu("refresh");
 					common_ajax_action_after_success(dialog_id, 'newgroup', 'ajax-group', data);
 				}
 			}
-		} );
+		});
 	}
 }
 function addServer(dialog_id) {
@@ -1101,11 +1074,11 @@ function addServer(dialog_id) {
 	if ($('#add_to_smon').is(':checked')) {
 		add_to_smon = '1';
 	}
-	allFields = $( [] ).add( $('#new-server-add') ).add( $('#new-ip') ).add( $('#new-port') )
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#new-server-add'), "Hostname", 1 );
-	valid = valid && checkLength( $('#new-ip'), "IP", 1 );
-	valid = valid && checkLength( $('#new-port'), "Port", 1 );
+	allFields = $([]).add($('#new-server-add')).add($('#new-ip')).add($('#new-port'))
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#new-server-add'), "Hostname", 1);
+	valid = valid && checkLength($('#new-ip'), "IP", 1);
+	valid = valid && checkLength($('#new-port'), "Port", 1);
 	if (cred == null) {
 		toastr.error('First select credentials');
 		return false;
@@ -1115,10 +1088,9 @@ function addServer(dialog_id) {
 		return false;
 	}
 	if (valid) {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/server/create",
 			data: {
-				newserver: "1",
 				servername: servername,
 				newip: newip,
 				newport: $('#new-port').val(),
@@ -1130,45 +1102,45 @@ function addServer(dialog_id) {
 				firewall: firewall,
 				add_to_smon: add_to_smon,
 				enable: enable,
-				slave: $('#slavefor' ).val(),
+				slave: $('#slavefor').val(),
 				cred: cred,
 				page: cur_url[0].split('#')[0],
 				desc: $('#desc').val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					common_ajax_action_after_success(dialog_id, 'newserver', 'ajax-servers', data);
-					$( "input[type=submit], button" ).button();
-					$( "input[type=checkbox]" ).checkboxradio();
-					$( ".controlgroup" ).controlgroup();
-					$( "select" ).selectmenu();
+					$("input[type=submit], button").button();
+					$("input[type=checkbox]").checkboxradio();
+					$(".controlgroup").controlgroup();
+					$("select").selectmenu();
 					var getId = new RegExp('server-[0-9]+');
 					var id = data.match(getId) + '';
 					id = id.split('-').pop();
-					$('select:regex(id, git-server)').append('<option value=' + id + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
-					$('select:regex(id, backup-server)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
-					$('select:regex(id, haproxy_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
-					$('select:regex(id, nginx_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
-					$('select:regex(id, apache_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
-					$('select:regex(id, node_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
-					$('select:regex(id, geoipserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh");
+					$('select:regex(id, git-server)').append('<option value=' + id + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh");
+					$('select:regex(id, backup-server)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh");
+					$('select:regex(id, haproxy_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh");
+					$('select:regex(id, nginx_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh");
+					$('select:regex(id, apache_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh");
+					$('select:regex(id, node_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh");
+					$('select:regex(id, geoipserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh");
 					$('select:regex(id, haproxyaddserv)').append('<option value=' + newip + '>' + servername + '</option>').selectmenu("refresh");
 					$('select:regex(id, nginxaddserv)').append('<option value=' + newip + '>' + servername + '</option>').selectmenu("refresh");
 					$('select:regex(id, apacheaddserv)').append('<option value=' + newip + '>' + servername + '</option>').selectmenu("refresh");
 					after_server_creating(servername, newip, scan_server);
 				}
 			}
-		} );
+		});
 	}
 }
 function after_server_creating(servername, newip, scan_server) {
 	$.ajax({
-		url: "options.py",
+		url: "/app/server/create/after",
 		data: {
 			act: 'after_adding',
 			servername: servername,
@@ -1185,7 +1157,7 @@ function after_server_creating(servername, newip, scan_server) {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function addCreds(dialog_id) {
 	toastr.clear();
@@ -1194,13 +1166,13 @@ function addCreds(dialog_id) {
 		ssh_enable = '1';
 	}
 	var valid = true;
-	allFields = $( [] ).add( $('#new-ssh-add') ).add( $('#ssh_user') )
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#new-ssh-add'), "Name", 1 );
-	valid = valid && checkLength( $('#ssh_user'), "Credentials", 1 );
-	if(valid) {
+	allFields = $([]).add($('#new-ssh-add')).add($('#ssh_user'))
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#new-ssh-add'), "Name", 1);
+	valid = valid && checkLength($('#ssh_user'), "Credentials", 1);
+	if (valid) {
 		$.ajax({
-			url: "options.py",
+			url: "/app/server/ssh/create",
 			data: {
 				new_ssh: $('#new-ssh-add').val(),
 				new_group: $('#new-sshgroup').val(),
@@ -1219,9 +1191,9 @@ function addCreds(dialog_id) {
 					var getId = new RegExp('ssh-table-[0-9]+');
 					var id = data.match(getId) + '';
 					id = id.split('-').pop();
-					common_ajax_action_after_success(dialog_id, 'ssh-table-'+id, 'ssh_enable_table', data);
+					common_ajax_action_after_success(dialog_id, 'ssh-table-' + id, 'ssh_enable_table', data);
 					$('select:regex(id, credentials)').append('<option value=' + id + '>' + $('#new-ssh-add').val() + '</option>').selectmenu("refresh");
-					$('select:regex(id, ssh-key-name)').append('<option value=' + $('#new-ssh-add').val() + '_'+group_name+'>' + $('#new-ssh-add').val() + '_'+group_name+'</option>').selectmenu("refresh");
+					$('select:regex(id, ssh-key-name)').append('<option value=' + $('#new-ssh-add').val() + '_' + group_name + '>' + $('#new-ssh-add').val() + '_' + group_name + '</option>').selectmenu("refresh");
 					$("input[type=submit], button").button();
 					$("input[type=checkbox]").checkboxradio();
 					$("select").selectmenu();
@@ -1233,13 +1205,12 @@ function addCreds(dialog_id) {
 function getGroupNameById(group_id) {
 	var group_name = ''
 	$.ajax({
-		url: "options.py",
+		url: "/app/user/group/name/" + group_id,
 		async: false,
-		data: {
-			get_group_name_by_id: group_id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data);
@@ -1253,55 +1224,53 @@ function getGroupNameById(group_id) {
 function addRecevier(dialog_id, receiver_name) {
 	var valid = true;
 	toastr.clear();
-	allFields = $( [] ).add( $('#'+receiver_name+'-token-add') ).add( $('#'+receiver_name+'-chanel-add') );
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#'+receiver_name+'-token-add'), "token", 1 );
-	valid = valid && checkLength( $('#'+receiver_name+'-chanel-add'), "channel name", 1 );
-	if(valid) {
+	allFields = $([]).add($('#' + receiver_name + '-token-add')).add($('#' + receiver_name + '-chanel-add'));
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#' + receiver_name + '-token-add'), "token", 1);
+	valid = valid && checkLength($('#' + receiver_name + '-chanel-add'), "channel name", 1);
+	if (valid) {
 		toastr.clear();
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/checker/receiver/" + receiver_name,
 			data: {
-				new_receiver: $('#'+receiver_name+'-token-add').val(),
-				receiver_name: receiver_name,
-				chanel: $('#'+receiver_name+'-chanel-add').val(),
-				group_receiver: $('#new-'+receiver_name+'-group-add').val(),
+				receiver: $('#' + receiver_name + '-token-add').val(),
+				channel: $('#' + receiver_name + '-chanel-add').val(),
+				group: $('#new-' + receiver_name + '-group-add').val(),
 				page: cur_url[0].split('#')[0],
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
+			success: function (data) {
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
-					var getId = new RegExp(receiver_name+'-table-[0-9]+');
+					var getId = new RegExp(receiver_name + '-table-[0-9]+');
 					var id = data.match(getId) + '';
 					id = id.split('-').pop();
-					$('select:regex(id, '+receiver_name+'_channel)').append('<option value=' + id + '>' + $('#'+receiver_name+'-chanel-add').val() + '</option>').selectmenu("refresh");
-					common_ajax_action_after_success(dialog_id, 'newgroup', 'checker_'+receiver_name+'_table', data);
-					$( "input[type=submit], button" ).button();
-					$( "input[type=checkbox]" ).checkboxradio();
-					$( "select" ).selectmenu();
+					$('select:regex(id, ' + receiver_name + '_channel)').append('<option value=' + id + '>' + $('#' + receiver_name + '-chanel-add').val() + '</option>').selectmenu("refresh");
+					common_ajax_action_after_success(dialog_id, 'newgroup', 'checker_' + receiver_name + '_table', data);
+					$("input[type=submit], button").button();
+					$("input[type=checkbox]").checkboxradio();
+					$("select").selectmenu();
 				}
 			}
-		} );
+		});
 	}
 }
 function addBackup(dialog_id) {
 	var valid = true;
 	toastr.clear();
-	allFields = $( [] ).add( $('#backup-server') ).add( $('#rserver') ).add( $('#rpath') ).add( $('#backup-time') ).add( $('#backup-credentials') )
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#backup-server'), "backup server ", 1 );
-	valid = valid && checkLength( $('#rserver'), "remote server", 1 );
-	valid = valid && checkLength( $('#rpath'), "remote path", 1 );
-	valid = valid && checkLength( $('#backup-time'), "backup time", 1 );
-	valid = valid && checkLength( $('#backup-credentials'), "backup credentials", 1 );
+	allFields = $([]).add($('#backup-server')).add($('#rserver')).add($('#rpath')).add($('#backup-time')).add($('#backup-credentials'))
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#backup-server'), "backup server ", 1);
+	valid = valid && checkLength($('#rserver'), "remote server", 1);
+	valid = valid && checkLength($('#rpath'), "remote path", 1);
+	valid = valid && checkLength($('#backup-time'), "backup time", 1);
+	valid = valid && checkLength($('#backup-credentials'), "backup credentials", 1);
 	if (valid) {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/server/backup/create",
 			data: {
-				backup: '1',
 				server: $('#backup-server').val(),
 				rserver: $('#rserver').val(),
 				rpath: $('#rpath').val(),
@@ -1312,37 +1281,37 @@ function addBackup(dialog_id) {
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
-				} else if (data.indexOf('success: ') != '-1') {
-					common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-table', data);
-					$( "select" ).selectmenu();
 				} else if (data.indexOf('info: ') != '-1') {
 					toastr.clear();
 					toastr.info(data);
 				} else if (data.indexOf('warning: ') != '-1') {
 					toastr.clear();
 					toastr.warning(data);
+				} else {
+					common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-table', data);
+					$("select").selectmenu();
 				}
 			}
-		} );
+		});
 	}
 }
 function addS3Backup(dialog_id) {
 	var valid = true;
 	toastr.clear();
-	allFields = $( [] ).add( $('#s3-backup-server') ).add( $('#s3_server') ).add( $('#s3_bucket') ).add( $('#s3_secret_key') ).add( $('#s3_access_key') )
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#s3-backup-server'), "backup server ", 1 );
-	valid = valid && checkLength( $('#s3_server'), "S3 server", 1 );
-	valid = valid && checkLength( $('#s3_bucket'), "S3 bucket", 1 );
-	valid = valid && checkLength( $('#s3_secret_key'), "S3 secret key", 1 );
-	valid = valid && checkLength( $('#s3_access_key'), "S3 access key", 1 );
+	allFields = $([]).add($('#s3-backup-server')).add($('#s3_server')).add($('#s3_bucket')).add($('#s3_secret_key')).add($('#s3_access_key'))
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#s3-backup-server'), "backup server ", 1);
+	valid = valid && checkLength($('#s3_server'), "S3 server", 1);
+	valid = valid && checkLength($('#s3_bucket'), "S3 bucket", 1);
+	valid = valid && checkLength($('#s3_secret_key'), "S3 secret key", 1);
+	valid = valid && checkLength($('#s3_access_key'), "S3 access key", 1);
 	if (valid) {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/server/s3backup/create",
 			data: {
 				s3_backup_server: $('#s3-backup-server').val(),
 				s3_server: $('#s3_server').val(),
@@ -1354,13 +1323,10 @@ function addS3Backup(dialog_id) {
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
-				} else if (data.indexOf('success: ') != '-1') {
-					common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-s3-table', data);
-					$( "select" ).selectmenu();
 				} else if (data.indexOf('info: ') != '-1') {
 					toastr.clear();
 					toastr.info(data);
@@ -1370,29 +1336,31 @@ function addS3Backup(dialog_id) {
 				} else if (data.indexOf('error: ') != '-1') {
 					toastr.clear();
 					toastr.error(data);
+				} else {
+					common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-s3-table', data);
+					$("select").selectmenu();
 				}
 			}
-		} );
+		});
 	}
 }
 function addGit(dialog_id) {
 	var valid = true;
 	toastr.clear();
-	allFields = $( [] ).add( $('#git-server') ).add( $('#git-service') ).add( $('#git-time')).add( $('#git-credentials') ).add( $('#git-branch') )
-	allFields.removeClass( "ui-state-error" );
-	valid = valid && checkLength( $('#git-server'), "Server ", 1 );
-	valid = valid && checkLength( $('#git-service'), "Service", 1 );
-	valid = valid && checkLength( $('#git-credentials'), "Credentials", 1 );
-	valid = valid && checkLength( $('#git-branch'), "Branch name", 1 );
+	allFields = $([]).add($('#git-server')).add($('#git-service')).add($('#git-time')).add($('#git-credentials')).add($('#git-branch'))
+	allFields.removeClass("ui-state-error");
+	valid = valid && checkLength($('#git-server'), "Server ", 1);
+	valid = valid && checkLength($('#git-service'), "Service", 1);
+	valid = valid && checkLength($('#git-credentials'), "Credentials", 1);
+	valid = valid && checkLength($('#git-branch'), "Branch name", 1);
 	var git_init = 0;
 	if ($('#git-init').is(':checked')) {
-			git_init = '1';
-		}
+		git_init = '1';
+	}
 	if (valid) {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/server/git/create",
 			data: {
-				git_backup: '1',
 				server: $('#git-server').val(),
 				git_service: $('#git-service').val(),
 				git_init: git_init,
@@ -1405,13 +1373,13 @@ function addGit(dialog_id) {
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else if (data.indexOf('success: ') != '-1') {
 					common_ajax_action_after_success(dialog_id, 'newgit', 'ajax-git-table', data);
-					$( "select" ).selectmenu();
+					$("select").selectmenu();
 				} else if (data.indexOf('info: ') != '-1') {
 					toastr.clear();
 					toastr.info(data);
@@ -1420,16 +1388,14 @@ function addGit(dialog_id) {
 					toastr.warning(data);
 				}
 			}
-		} );
+		});
 	}
 }
 function updateSettings(param, val) {
 	toastr.clear();
 	$.ajax( {
-		url: "options.py",
+		url: "/app/app/admin/setting/" + param + "/" + val,
 		data: {
-			updatesettings: param,
-			val: val,
 			token: $('#token').val()
 		},
 		type: "POST",
@@ -1557,7 +1523,7 @@ function confirmDeleteSsh(id) {
 function confirmDeleteReceiver(id, reciever_name) {
 	var delete_word = $('#translate').attr('data-delete');
 	var cancel_word = $('#translate').attr('data-cancel');
-	 $( "#dialog-confirm" ).dialog({
+	 $( "#dialog-confirm-services" ).dialog({
 		 resizable: false,
 		 height: "auto",
 		 width: 400,
@@ -1703,37 +1669,35 @@ function cloneBackup(id) {
 	$('#backup-credentials').selectmenu("refresh");
 }
 function removeUser(id) {
-	$("#user-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
-		data: {
-			userdel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
-				$("#user-"+id).remove();
+	$("#user-" + id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/user/delete/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data == "ok") {
+				$("#user-" + id).remove();
 			} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function removeServer(id) {
-	$("#server-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
-		data: {
-			serverdel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
-				$("#server-"+id).remove();
+	$("#server-" + id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/server/delete/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data == "Ok") {
+				$("#server-" + id).remove();
 			} else if (data.indexOf('error: ') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else if (data.indexOf('warning: ') != '-1') {
@@ -1741,41 +1705,39 @@ function removeServer(id) {
 				toastr.warning(data);
 			}
 		}
-	} );
+	});
 }
 function removeGroup(id) {
-	$("#group-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
-		data: {
-			groupdel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
-				$("#group-"+id).remove();
-				$('select:regex(id, group) option[value='+id+']').remove();
+	$("#group-" + id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/server/group/delete/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data == "ok") {
+				$("#group-" + id).remove();
+				$('select:regex(id, group) option[value=' + id + ']').remove();
 				$('select:regex(id, group)').selectmenu("refresh");
 			} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function removeSsh(id) {
 	$("#ssh-table-"+id).css("background-color", "#f2dede");
 	$.ajax( {
-		url: "options.py",
-		data: {
-			sshdel: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/server/ssh/delete/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function( data ) {
 			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
+			if(data == "ok") {
 				$("#ssh-table-"+id).remove();
 				$('select:regex(id, credentials) option[value='+id+']').remove();
 				$('select:regex(id, credentials)').selectmenu("refresh");
@@ -1786,73 +1748,71 @@ function removeSsh(id) {
 	} );
 }
 function removeReciver(receiver_name, receiver_id) {
-	$("#"+receiver_name+"-table-"+receiver_id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
+	$("#" + receiver_name + "-table-" + receiver_id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/checker/receiver/" + receiver_name,
 		data: {
-			receiver_del: receiver_id,
-			receiver_name: receiver_name,
+			channel_id: receiver_id,
 			token: $('#token').val()
 		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
-				$("#"+receiver_name+"-table-"+receiver_id).remove();
+		type: "DELETE",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data == "ok") {
+				$("#" + receiver_name + "-table-" + receiver_id).remove();
 			} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function removeBackup(id) {
-	$("#backup-table-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
+	$("#backup-table-" + id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/server/backup/delete",
 		data: {
 			deljob: id,
-			cred: $('#backup-credentials-'+id).val(),
-			server: $('#backup-server-'+id).text(),
-			rserver: $('#backup-rserver-'+id).val(),
+			cred: $('#backup-credentials-' + id).val(),
+			server: $('#backup-server-' + id).text(),
+			rserver: $('#backup-rserver-' + id).val(),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data.indexOf('Ok') != '-1') {
-				$("#backup-table-"+id).remove();
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data.indexOf('ok') != '-1') {
+				$("#backup-table-" + id).remove();
 			} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function removeS3Backup(id) {
-	$("#backup-table-s3-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
+	$("#backup-table-s3-" + id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/server/s3backup/delete",
 		data: {
 			dels3job: id,
-			s3_backet: $('#backup-s3-backet-'+id).val(),
-			s3_backup_server: $('#backup-s3-server-'+id).text(),
-			s3_bucket: $('#s3-bucket-'+id).val(),
+			s3_bucket: $('#bucket-' + id).text(),
+			s3_backup_server: $('#backup-s3-server-' + id).text(),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data.indexOf('Ok') != '-1') {
-				$("#s3-backup-table-"+id).remove();
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data.indexOf('ok') != '-1') {
+				$("#s3-backup-table-" + id).remove();
 			} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function removeGit(id) {
-	$("#git-table-"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
+	$("#git-table-" + id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/server/git/delete",
 		data: {
 			git_backup: id,
 			git_deljob: 1,
@@ -1860,41 +1820,41 @@ function removeGit(id) {
 			repo: 0,
 			branch: 0,
 			time: 0,
-			cred: $('#git-credentials-id-'+id).text(),
-			server: $('#git-server-id-'+id).text(),
-			git_service: $('#git-service-id-'+id).text(),
+			cred: $('#git-credentials-id-' + id).text(),
+			server: $('#git-server-id-' + id).text(),
+			git_service: $('#git-service-id-' + id).text(),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data.indexOf('Ok') != '-1') {
-				$("#git-table-"+id).remove();
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data.indexOf('ok') != '-1') {
+				$("#git-table-" + id).remove();
 			} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function updateUser(id) {
 	toastr.remove();
 	cur_url[0] = cur_url[0].split('#')[0]
 	var usergroup = Cookies.get('group');
-	var role = $('#role-'+id).val();
+	var role = $('#role-' + id).val();
 	var activeuser = 0;
-	if ($('#activeuser-'+id).is(':checked')) {
+	if ($('#activeuser-' + id).is(':checked')) {
 		activeuser = '1';
 	}
-	if (role == null && role !== undefined){
+	if (role == null && role !== undefined) {
 		toastr.warning('Please edit this user only on the Admin area');
 		return false;
 	}
 	toastr.remove();
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/user/update",
 		data: {
-			updateuser: $('#login-'+id).val(),
-			email: $('#email-'+id).val(),
+			updateuser: $('#login-' + id).val(),
+			email: $('#email-' + id).val(),
 			role: role,
 			usergroup: usergroup,
 			activeuser: activeuser,
@@ -1902,46 +1862,46 @@ function updateUser(id) {
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.remove();
-				$("#user-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#user-"+id ).removeClass( "update" );
-				}, 2500 );
+				$("#user-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#user-" + id).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function updateGroup(id) {
 	toastr.clear();
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/server/group/update",
 		data: {
-			updategroup: $('#name-'+id).val(),
-			descript: $('#descript-'+id).val(),
+			updategroup: $('#name-' + id).val(),
+			descript: $('#descript-' + id).val(),
 			id: id,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
-				$("#group-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#group-"+id ).removeClass( "update" );
-				}, 2500 );
-				$('select:regex(id, group) option[value='+id+']').remove();
-				$('select:regex(id, group)').append('<option value='+id+'>'+$('#name-'+id).val()+'</option>').selectmenu("refresh");
+				$("#group-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#group-" + id).removeClass("update");
+				}, 2500);
+				$('select:regex(id, group) option[value=' + id + ']').remove();
+				$('select:regex(id, group)').append('<option value=' + id + '>' + $('#name-' + id).val() + '</option>').selectmenu("refresh");
 			}
 		}
-	} );
+	});
 }
 function updateServer(id) {
 	toastr.clear();
@@ -1949,263 +1909,220 @@ function updateServer(id) {
 	let enable = 0;
 	let firewall = 0;
 	let protected_serv = 0;
-	if ($('#typeip-'+id).is(':checked')) {
+	if ($('#typeip-' + id).is(':checked')) {
 		typeip = '1';
 	}
-	if ($('#enable-'+id).is(':checked')) {
+	if ($('#enable-' + id).is(':checked')) {
 		enable = '1';
 	}
-	if ($('#firewall-'+id).is(':checked')) {
+	if ($('#firewall-' + id).is(':checked')) {
 		firewall = '1';
 	}
-	if ($('#protected-'+id).is(':checked')) {
+	if ($('#protected-' + id).is(':checked')) {
 		protected_serv = '1';
 	}
-	var servergroup = $('#servergroup-'+id+' option:selected' ).val();
+	var servergroup = $('#servergroup-' + id + ' option:selected').val();
 	if (cur_url[0].split('#')[0] == "servers.py") {
-		 servergroup = $('#new-server-group-add').val();
+		servergroup = $('#new-server-group-add').val();
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/admin/update",
 		data: {
-			updateserver: $('#hostname-'+id).val(),
-			port: $('#port-'+id).val(),
+			updateserver: $('#hostname-' + id).val(),
+			port: $('#port-' + id).val(),
 			servergroup: servergroup,
 			typeip: typeip,
 			firewall: firewall,
 			enable: enable,
-			slave: $('#slavefor-'+id+' option:selected' ).val(),
-			cred: $('#credentials-'+id+' option:selected').val(),
+			slave: $('#slavefor-' + id + ' option:selected').val(),
+			cred: $('#credentials-' + id + ' option:selected').val(),
 			id: id,
-			desc: $('#desc-'+id).val(),
+			desc: $('#desc-' + id).val(),
 			protected: protected_serv,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
-				$("#server-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#server-"+id ).removeClass( "update" );
-				}, 2500 );
+				$("#server-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#server-" + id).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function uploadSsh() {
 	toastr.clear();
-	if ($( "#ssh-key-name option:selected" ).val() == "------" || $('#ssh_cert').val() == '') {
+	if ($("#ssh-key-name option:selected").val() == "------" || $('#ssh_cert').val() == '') {
 		toastr.error('All fields must be completed');
 	} else {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/server/ssh/upload",
 			data: {
 				ssh_cert: $('#ssh_cert').val(),
 				name: $('#ssh-key-name').val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1')  {
-						toastr.error(data);
-					} else if (data.indexOf('success') != '-1') {
-						toastr.clear();
-						toastr.success(data)
-					} else {
-						toastr.error('Something wrong, check and try again');
-					}
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
+				if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') {
+					toastr.error(data);
+				} else if (data.indexOf('success') != '-1') {
+					toastr.clear();
+					toastr.success(data)
+				} else {
+					toastr.error('Something wrong, check and try again');
+				}
 			}
-		} );
+		});
 	}
 }
 function updateSSH(id) {
 	toastr.clear();
 	var ssh_enable = 0;
-	if ($('#ssh_enable-'+id).is(':checked')) {
+	if ($('#ssh_enable-' + id).is(':checked')) {
 		ssh_enable = '1';
 	}
-	var group = $('#sshgroup-'+id).val();
+	var group = $('#sshgroup-' + id).val();
 	if (cur_url[0].split('#')[0] == "servers.py") {
-		 group = $('#new-server-group-add').val();
+		group = $('#new-server-group-add').val();
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/server/ssh/update",
 		data: {
-			updatessh: 1,
-			name: $('#ssh_name-'+id).val(),
+			name: $('#ssh_name-' + id).val(),
 			group: group,
 			ssh_enable: ssh_enable,
-			ssh_user: $('#ssh_user-'+id).val(),
-			ssh_pass: $('#ssh_pass-'+id).val(),
+			ssh_user: $('#ssh_user-' + id).val(),
+			ssh_pass: $('#ssh_pass-' + id).val(),
 			id: id,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
-				$("#ssh-table-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#ssh-table-"+id ).removeClass( "update" );
-				}, 2500 );
-				$('select:regex(id, credentials) option[value='+id+']').remove();
-				$('select:regex(id, ssh-key-name) option[value='+$('#ssh_name-'+id).val()+']').remove();
-				$('select:regex(id, credentials)').append('<option value='+id+'>'+$('#ssh_name-'+id).val()+'</option>').selectmenu("refresh");
-				$('select:regex(id, ssh-key-name)').append('<option value='+$('#ssh_name-'+id).val()+'>'+$('#ssh_name-'+id).val()+'</option>').selectmenu("refresh");
+				$("#ssh-table-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#ssh-table-" + id).removeClass("update");
+				}, 2500);
+				$('select:regex(id, credentials) option[value=' + id + ']').remove();
+				$('select:regex(id, ssh-key-name) option[value=' + $('#ssh_name-' + id).val() + ']').remove();
+				$('select:regex(id, credentials)').append('<option value=' + id + '>' + $('#ssh_name-' + id).val() + '</option>').selectmenu("refresh");
+				$('select:regex(id, ssh-key-name)').append('<option value=' + $('#ssh_name-' + id).val() + '>' + $('#ssh_name-' + id).val() + '</option>').selectmenu("refresh");
 			}
 		}
-	} );
+	});
 }
 function updateReceiver(id, receiver_name) {
 	if (cur_url[0].split('#')[0] == 'servers.py') {
 		var group = $('#new-group').val();
 	} else {
-		var group = $('#'+receiver_name+'group-'+id).val();
+		var group = $('#' + receiver_name + 'group-' + id).val();
 	}
 	toastr.clear();
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/checker/receiver/" + receiver_name,
 		data: {
-			receiver_name: receiver_name,
-			update_receiver_token: $('#'+receiver_name+'-token-'+id).val(),
-			update_receiver_channel: $('#'+receiver_name+'-chanel-'+id).val(),
-			update_receiver_group: group,
+			receiver_token: $('#' + receiver_name + '-token-' + id).val(),
+			channel: $('#' + receiver_name + '-chanel-' + id).val(),
+			group: group,
 			id: id,
 			token: $('#token').val()
 		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		type: "PUT",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
-				$("#"+receiver_name+"-table-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#"+receiver_name+"-table-"+id ).removeClass( "update" );
-				}, 2500 );
+				$("#" + receiver_name + "-table-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#" + receiver_name + "-table-" + id).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function updateBackup(id) {
 	toastr.clear();
-	if ($( "#backup-type-"+id+" option:selected" ).val() == "-------" || $('#backup-rserver-'+id).val() == '' || $('#backup-rpath-'+id).val() == '') {
+	if ($("#backup-type-" + id + " option:selected").val() == "-------" || $('#backup-rserver-' + id).val() == '' || $('#backup-rpath-' + id).val() == '') {
 		toastr.error('All fields must be completed');
 	} else {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/server/backup/update",
 			data: {
 				backupupdate: id,
-				server: $('#backup-server-'+id).text(),
-				rserver: $('#backup-rserver-'+id).val(),
-				rpath: $('#backup-rpath-'+id).val(),
-				type: $('#backup-type-'+id).val(),
-				time: $('#backup-time-'+id).val(),
-				cred: $('#backup-credentials-'+id).val(),
-				description: $('#backup-description-'+id).val(),
+				server: $('#backup-server-' + id).text(),
+				rserver: $('#backup-rserver-' + id).val(),
+				rpath: $('#backup-rpath-' + id).val(),
+				type: $('#backup-type-' + id).val(),
+				time: $('#backup-time-' + id).val(),
+				cred: $('#backup-credentials-' + id).val(),
+				description: $('#backup-description-' + id).val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 					toastr.error(data);
 				} else {
 					toastr.clear();
-					$("#backup-table-"+id).addClass( "update", 1000 );
-					setTimeout(function() {
-						$( "#backup-table-"+id ).removeClass( "update" );
-					}, 2500 );
+					$("#backup-table-" + id).addClass("update", 1000);
+					setTimeout(function () {
+						$("#backup-table-" + id).removeClass("update");
+					}, 2500);
 				}
 			}
-		} );
-	}
-}
-function updateS3Backup(id) {
-	toastr.clear();
-	if ($( "#backup-type-"+id+" option:selected" ).val() == "-------" || $('#backup-rserver-'+id).val() == '' || $('#backup-rpath-'+id).val() == '') {
-		toastr.error('All fields must be completed');
-	} else {
-		$.ajax( {
-			url: "options.py",
-			data: {
-				s3_backupupdate: id,
-				server: $('#backup-server-'+id).text(),
-				rserver: $('#backup-rserver-'+id).val(),
-				rpath: $('#backup-rpath-'+id).val(),
-				type: $('#backup-type-'+id).val(),
-				time: $('#backup-time-'+id).val(),
-				cred: $('#backup-credentials-'+id).val(),
-				description: $('#backup-description-'+id).val(),
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
-					toastr.error(data);
-				} else {
-					toastr.clear();
-					$("#backup-table-"+id).addClass( "update", 1000 );
-					setTimeout(function() {
-						$( "#backup-table-"+id ).removeClass( "update" );
-					}, 2500 );
-				}
-			}
-		} );
+		});
 	}
 }
 function showApacheLog(serv) {
-	var rows = $('#rows').val()
-	var grep = $('#grep').val()
-	var exgrep = $('#exgrep').val()
-	var hour = $('#time_range_out_hour').val()
-	var minut = $('#time_range_out_minut').val()
-	var hour1 = $('#time_range_out_hour1').val()
-	var minut1 = $('#time_range_out_minut1').val()
+	var rows = $('#rows').val();
+	var grep = $('#grep').val();
+	var exgrep = $('#exgrep').val();
+	var hour = $('#time_range_out_hour').val();
+	var minute = $('#time_range_out_minut').val();
+	var hour1 = $('#time_range_out_hour1').val();
+	var minute1 = $('#time_range_out_minut1').val();
+	var url = "/app/logs/apache_internal/" + serv + "/" + rows;
 	$.ajax( {
-		url: "options.py",
+		url: url,
 		data: {
-			rows1: rows,
+			rows: rows,
 			serv: serv,
 			grep: grep,
 			exgrep: exgrep,
 			hour: hour,
-			minut:minut,
+			minute: minute,
 			hour1: hour1,
-			minut1: minut1,
+			minute1: minute1,
 			token: $('#token').val()
 		},
 		type: "POST",
 		success: function( data ) {
 			$("#ajax").html(data);
-			window.history.pushState("Logs", "Logs", cur_url[0] + "?serv=" + serv + "&rows1=" + rows + "&grep=" + grep +
-					'&exgrep=' + exgrep +
-					'&hour=' + hour +
-					'&minut=' + minut +
-					'&hour1=' + hour1 +
-					'&minut1=' + minut1);
 		}
 	} );
 }
 function checkSshConnect(ip) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			checkSshConnect: 1,
-			serv: ip,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/server/check/ssh/" + ip,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1') {
 				toastr.error(data)
@@ -2236,64 +2153,64 @@ function changeUserPasswordDialog(id) {
 		return false;
 	}
 	$( "#user-change-password-table" ).dialog({
-			autoOpen: true,
-			resizable: false,
-			height: "auto",
-			width: 600,
-			modal: true,
-			title: change_word+ " "+$('#login-'+id).val()+" " +password_word,
-			show: {
-				effect: "fade",
-				duration: 200
-			},
-			hide: {
-				effect: "fade",
-				duration: 200
-			},
-			buttons: [{
-				text: change_word,
-				click: function () {
-					changeUserPassword(id, $(this));
-				}
-			}, {
-				text: cancel_word,
-				click: function() {
-					$(this).dialog("close");
-					$('#missmatchpass').hide();
-				}
-			}]
-		});
+		autoOpen: true,
+		resizable: false,
+		height: "auto",
+		width: 600,
+		modal: true,
+		title: change_word + " " + $('#login-' + id).val() + " " + password_word,
+		show: {
+			effect: "fade",
+			duration: 200
+		},
+		hide: {
+			effect: "fade",
+			duration: 200
+		},
+		buttons: [{
+			text: change_word,
+			click: function () {
+				changeUserPassword(id, $(this));
+			}
+		}, {
+			text: cancel_word,
+			click: function () {
+				$(this).dialog("close");
+				$('#missmatchpass').hide();
+			}
+		}]
+	});
 }
 function changeUserPassword(id, d) {
 	var pass = $('#change-password').val();
 	var pass2 = $('#change2-password').val();
-	if(pass != pass2) {
+	if (pass != pass2) {
 		$('#missmatchpass').show();
 	} else {
 		$('#missmatchpass').hide();
 		toastr.clear();
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/user/password",
 			data: {
 				updatepassowrd: pass,
 				id: id,
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
 				if (data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else {
 					toastr.clear();
-					$("#user-"+id).addClass( "update", 1000 );
-					setTimeout(function() {
-						$( "#user-"+id ).removeClass( "update" );
-					}, 2500 );
-					d.dialog( "close" );
+					$("#user-" + id).addClass("update", 1000);
+					setTimeout(function () {
+						$("#user-" + id).removeClass("update");
+					}, 2500);
+					d.dialog("close");
 				}
 			}
-		} );
+		});
 	}
 }
 function changeUserServiceDialog(id) {
@@ -2302,29 +2219,28 @@ function changeUserServiceDialog(id) {
 	var services_word = $('#translate').attr('data-services3');
 	var save_word = $('#translate').attr('data-save');
 	var superAdmin_services = $('#translate').attr('data-superAdmin_services');
-	if ($('#role-'+id + ' option:selected' ).val() == 'Select a role') {
+	if ($('#role-' + id + ' option:selected').val() == 'Select a role') {
 		toastr.warning(superAdmin_services);
 		return false;
 	}
-	$.ajax( {
-		url: "options.py",
-		data: {
-			getuserservices: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	$.ajax({
+		url: "/app/user/services/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
 			if (data.indexOf('danger') != '-1') {
 				toastr.error(data);
 			} else {
 				toastr.clear();
 				$('#change-user-service-form').html(data);
-				$( "#change-user-service-dialog" ).dialog({
+				$("#change-user-service-dialog").dialog({
 					resizable: false,
 					height: "auto",
 					width: 700,
 					modal: true,
-					title: manage_word+" "+$('#login-'+id).val()+" "+services_word,
+					title: manage_word + " " + $('#login-' + id).val() + " " + services_word,
 					buttons: [{
 						text: save_word,
 						click: function () {
@@ -2340,7 +2256,7 @@ function changeUserServiceDialog(id) {
 				});
 			}
 		}
-	} );
+	});
 }
 function changeUserServices(user_id) {
 	var jsonData = {};
@@ -2350,9 +2266,8 @@ function changeUserServices(user_id) {
 		jsonData[user_id][this_id] = {}
 	});
 	$.ajax( {
-		url: "options.py",
+		url: "/app/user/services/" + user_id,
 		data: {
-			changeUserServicesId: user_id,
 			jsonDatas: JSON.stringify(jsonData),
 			changeUserServicesUser: $('#login-'+user_id).val(),
 			token: $('#token').val()
@@ -2425,19 +2340,18 @@ function confirmAjaxServiceAction(action, service) {
 }
 function ajaxActionServies(action, service) {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			action_service: action,
-			serv: service,
-			token: $('#token').val()
-		},
+		url: "/app/admin/tools/action/" + service + "/" + action,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function( data ) {
 			if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
 				toastr.error(data);
 			} else if (data.indexOf('warning: ') != '-1') {
 				toastr.warning(data);
 			} else {
-				window.history.pushState("services", "services", cur_url[0].split("#")[0] + "#services");
+				window.history.pushState("services", "services", cur_url[0].split("#")[0] + "#tools");
 				toastr.success('The ' + service + ' has been ' + action +'ed');
 				loadServices();
 			}
@@ -2450,19 +2364,17 @@ function ajaxActionServies(action, service) {
 function updateService(service, action='update') {
 	$("#ajax-update").html('')
 	$("#ajax-update").html(wait_mess);
-	$.ajax( {
-		url: "options.py",
-		data: {
-			update_roxy_wi: 1,
-			service: service,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if (data.indexOf('Complete!') != '-1' || data.indexOf('Unpacking') != '-1'){
+	$.ajax({
+		url: "/app/admin/tools/update/" + service,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data.indexOf('Complete!') != '-1' || data.indexOf('Unpacking') != '-1') {
 				toastr.clear();
-				toastr.success(service + ' has been '+action+'ed');
+				toastr.success(service + ' has been ' + action + 'ed');
 			} else if (data.indexOf('Unauthorized') != '-1' || data.indexOf('Status code: 401') != '-1') {
 				toastr.clear();
 				toastr.error('It looks like there is no authorization in the Roxy-WI repository. Your subscription may have expired or there is no subscription. How to get the <b><a href="https://roxy-wi.org/pricing.py" title="Pricing" target="_blank">subscription</a></b>');
@@ -2497,7 +2409,7 @@ function updateService(service, action='update') {
 			loadupdatehapwi();
 			show_version();
 		}
-	} );
+	});
 }
 function confirmDeleteOpenVpnProfile(id) {
 	$( "#dialog-confirm" ).dialog({
@@ -2519,40 +2431,40 @@ function confirmDeleteOpenVpnProfile(id) {
 }
 
 function removeOpenVpnProfile(id) {
-	$("#"+id).css("background-color", "#f2dede");
-	$.ajax( {
-		url: "options.py",
+	$("#" + id).css("background-color", "#f2dede");
+	$.ajax({
+		url: "/app/admin/openvpn/delete",
 		data: {
 			openvpndel: id,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
-			if(data == "Ok ") {
-				$("#"+id).remove();
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data == "ok") {
+				$("#" + id).remove();
 			} else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			}
 		}
-	} );
+	});
 }
 function uploadOvpn() {
 	toastr.clear();
-	if ($( "#ovpn_upload_name" ).val() == '' || $('#ovpn_upload_file').val() == '') {
+	if ($("#ovpn_upload_name").val() == '' || $('#ovpn_upload_file').val() == '') {
 		toastr.error('All fields must be completed');
 	} else {
-		$.ajax( {
-			url: "options.py",
+		$.ajax({
+			url: "/app/admin/openvpn/upload",
 			data: {
 				uploadovpn: $('#ovpn_upload_file').val(),
 				ovpnname: $('#ovpn_upload_name').val(),
 				token: $('#token').val()
 			},
 			type: "POST",
-			success: function( data ) {
-				data = data.replace(/\s+/g,' ');
-				if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1')  {
+			success: function (data) {
+				data = data.replace(/\s+/g, ' ');
+				if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') {
 					toastr.error(data);
 				} else if (data.indexOf('success') != '-1') {
 					toastr.clear();
@@ -2562,18 +2474,16 @@ function uploadOvpn() {
 					toastr.error('Something wrong, check and try again');
 				}
 			}
-		} );
+		});
 	}
 }
 function OpenVpnSess(id, action) {
 	$.ajax({
-		url: "options.py",
-		data: {
-			actionvpn: action,
-			openvpnprofile: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/admin/openvpn/" + action + "/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') {
@@ -2586,48 +2496,15 @@ function OpenVpnSess(id, action) {
 				toastr.error('Something wrong, check and try again');
 			}
 		}
-	} );
+	});
 }
-function scanPorts(id) {
+function viewFirewallRules(ip) {
 	$.ajax({
-		url: "options.py",
-		data: {
-			scan_ports: id,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function (data) {
-			data = data.replace(/\s+/g, ' ');
-			if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') {
-				toastr.error(data);
-			} else {
-				toastr.clear();
-				$("#show_scans_ports_body").html(data);
-				$("#show_scans_ports" ).dialog({
-					resizable: false,
-					height: "auto",
-					width: 360,
-					modal: true,
-					title: "Openned ports",
-					buttons: {
-						Close: function() {
-							$( this ).dialog( "close" );
-							$("#show_scans_ports_body").html('');
-						}
-					}
-				});
-			}
-		}
-	} );
-}
-function viewFirewallRules(id) {
-	$.ajax({
-		url: "options.py",
-		data: {
-			viewFirewallRules: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/server/firewall/" + ip,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error: ') != '-1') {
@@ -2654,12 +2531,11 @@ function viewFirewallRules(id) {
 }
 function loadServices() {
 	$.ajax({
-		url: "options.py",
-		data: {
-			loadservices: 1,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/admin/tools",
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') {
@@ -2673,12 +2549,11 @@ function loadServices() {
 }
 function loadupdatehapwi() {
 	$.ajax({
-		url: "options.py",
-		data: {
-			load_update_hapwi: 1,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/server/update",
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') {
@@ -2689,15 +2564,10 @@ function loadupdatehapwi() {
 		}
 	} );
 }
-function loadchecker(tab = 0) {
+function loadchecker() {
 	$.ajax({
-		url: "options.py",
-		data: {
-			loadchecker: 1,
-			page: cur_url[0].split('#')[0],
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/checker/settings/load",
+		type: "GET",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('group_error') == '-1' && data.indexOf('error:') != '-1') {
@@ -2709,19 +2579,18 @@ function loadchecker(tab = 0) {
 				$( "input[type=checkbox]" ).checkboxradio();
 				$.getScript('/inc/users.js');
 				$.getScript(awesome);
-				$( "#checker_tabs" ).tabs( "option", "active", tab );
+				// $( "#checker_tabs" ).tabs( "option", "active", tab );
 			}
 		}
 	} );
 }
 function loadopenvpn() {
 	$.ajax({
-		url: "options.py",
-		data: {
-			loadopenvpn: 1,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/admin/openvpn",
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('group_error') == '-1' && data.indexOf('error:') != '-1') {
@@ -2735,14 +2604,11 @@ function loadopenvpn() {
 }
 function checkReceiver(channel_id, receiver_name) {
 	$.ajax({
-		url: "options.py",
-		data: {
-			check_receiver: 1,
-			receiver_channel_id: channel_id,
-			receiver_name: receiver_name,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/checker/check/" + channel_id + "/" + receiver_name,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
@@ -2751,43 +2617,37 @@ function checkReceiver(channel_id, receiver_name) {
 				toastr.success('Test message has been sent');
 			}
 		}
-	} );
+	});
 }
 function updateServerInfo(ip, id) {
 	$.ajax({
-			url: "options.py",
-			data: {
-				act: 'updateSystemInfo',
-				server_ip: ip,
-				server_id: id,
-				token: $('#token').val()
-			},
-			type: "POST",
-			success: function (data) {
-				data = data.replace(/\s+/g, ' ');
-				if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
-					toastr.error(data);
-				} else {
-					$("#server_info-"+id).html(data);
-					$('#server_info-'+id).show();
-					$('#server_info_link-'+id).attr('title', 'Hide System info');
-					$.getScript(awesome);
-				}
+		url: "/app/server/system_info/update/" + ip + "/" + id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
+				toastr.error(data);
+			} else {
+				$("#server_info-" + id).html(data);
+				$('#server_info-' + id).show();
+				$('#server_info_link-' + id).attr('title', 'Hide System info');
+				$.getScript(awesome);
 			}
-		} );
+		}
+	});
 }
 function showServerInfo(id, ip) {
 	var close_word = $('#translate').attr('data-close');
 	var server_info = $('#translate').attr('data-server_info');
 	$.ajax({
-		url: "options.py",
-		data: {
-			act: 'getSystemInfo',
-			server_ip: ip,
-			server_id: id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/server/system_info/get/" + ip + "/" +id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
@@ -2810,7 +2670,7 @@ function showServerInfo(id, ip) {
 				$.getScript(awesome);
 			}
 		}
-	} );
+	});
 }
 function updateHaproxyCheckerSettings(id) {
 	toastr.clear();
@@ -2818,168 +2678,167 @@ function updateHaproxyCheckerSettings(id) {
 	let server = 0;
 	let backend = 0;
 	let maxconn = 0;
-	if ($('#haproxy_server_email-'+id).is(':checked')) {
+	if ($('#haproxy_server_email-' + id).is(':checked')) {
 		email = '1';
 	}
-	if ($('#haproxy_server_status-'+id).is(':checked')) {
+	if ($('#haproxy_server_status-' + id).is(':checked')) {
 		server = '1';
 	}
-	if ($('#haproxy_server_backend-'+id).is(':checked')) {
+	if ($('#haproxy_server_backend-' + id).is(':checked')) {
 		backend = '1';
 	}
-	if ($('#haproxy_server_maxconn-'+id).is(':checked')) {
+	if ($('#haproxy_server_maxconn-' + id).is(':checked')) {
 		maxconn = '1';
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/checker/settings/update",
 		data: {
-			updateHaproxyCheckerSettings: id,
+			service: 'haproxy',
+			setting_id: id,
 			email: email,
 			server: server,
 			backend: backend,
 			maxconn: maxconn,
-			telegram_id: $('#haproxy_server_telegram_channel-'+id+' option:selected' ).val(),
-			slack_id: $('#haproxy_server_slack_channel-'+id+' option:selected').val(),
-			pd_id: $('#haproxy_server_pd_channel-'+id+' option:selected').val(),
+			telegram_id: $('#haproxy_server_telegram_channel-' + id + ' option:selected').val(),
+			slack_id: $('#haproxy_server_slack_channel-' + id + ' option:selected').val(),
+			pd_id: $('#haproxy_server_pd_channel-' + id + ' option:selected').val(),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else if (data.indexOf('ok') != '-1') {
 				toastr.clear();
-				$("#haproxy_server_tr_id-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#haproxy_server_tr_id-"+id ).removeClass( "update" );
-				}, 2500 );
+				$("#haproxy_server_tr_id-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#haproxy_server_tr_id-" + id).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function updateKeepalivedCheckerSettings(id) {
 	toastr.clear();
 	let email = 0;
 	let server = 0;
 	let backend = 0;
-	if ($('#keepalived_server_email-'+id).is(':checked')) {
+	if ($('#keepalived_server_email-' + id).is(':checked')) {
 		email = '1';
 	}
-	if ($('#keepalived_server_status-'+id).is(':checked')) {
+	if ($('#keepalived_server_status-' + id).is(':checked')) {
 		server = '1';
 	}
-	if ($('#keepalived_server_backend-'+id).is(':checked')) {
+	if ($('#keepalived_server_backend-' + id).is(':checked')) {
 		backend = '1';
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/checker/settings/update",
 		data: {
-			updateKeepalivedCheckerSettings: id,
+			service: 'keepavlied',
+			settings_id: id,
 			email: email,
 			server: server,
 			backend: backend,
-			telegram_id: $('#keepalived_server_telegram_channel-'+id+' option:selected' ).val(),
-			slack_id: $('#keepalived_server_slack_channel-'+id+' option:selected').val(),
-			pd_id: $('#keepalived_server_pd_channel-'+id+' option:selected').val(),
+			telegram_id: $('#keepalived_server_telegram_channel-' + id + ' option:selected').val(),
+			slack_id: $('#keepalived_server_slack_channel-' + id + ' option:selected').val(),
+			pd_id: $('#keepalived_server_pd_channel-' + id + ' option:selected').val(),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else if (data.indexOf('ok') != '-1') {
 				toastr.clear();
-				$("#keepalived_server_tr_id-"+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#keepalived_server_tr_id-"+id ).removeClass( "update" );
-				}, 2500 );
+				$("#keepalived_server_tr_id-" + id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#keepalived_server_tr_id-" + id).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function updateServiceCheckerSettings(id, service_name) {
 	toastr.clear();
 	let email = 0;
 	let server = 0;
-	if ($('#'+service_name+'_server_email-'+id).is(':checked')) {
+	if ($('#' + service_name + '_server_email-' + id).is(':checked')) {
 		email = '1';
 	}
-	if ($('#'+service_name+'_server_status-'+id).is(':checked')) {
+	if ($('#' + service_name + '_server_status-' + id).is(':checked')) {
 		server = '1';
 	}
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/checker/settings/update",
 		data: {
-			updateServiceCheckerSettings: id,
+			service: service_name,
+			settings_id: id,
 			email: email,
 			server: server,
-			telegram_id: $('#'+service_name+'_server_telegram_channel-'+id+' option:selected' ).val(),
-			slack_id: $('#'+service_name+'_server_slack_channel-'+id+' option:selected').val(),
-			pd_id: $('#'+service_name+'_server_pd_channel-'+id+' option:selected').val(),
+			telegram_id: $('#' + service_name + '_server_telegram_channel-' + id + ' option:selected').val(),
+			slack_id: $('#' + service_name + '_server_slack_channel-' + id + ' option:selected').val(),
+			pd_id: $('#' + service_name + '_server_pd_channel-' + id + ' option:selected').val(),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') {
 				toastr.error(data);
 			} else if (data.indexOf('ok') != '-1') {
 				toastr.clear();
-				$('#'+service_name+'_server_tr_id-'+id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$('#'+service_name+'_server_tr_id-'+id ).removeClass( "update" );
-				}, 2500 );
+				$('#' + service_name + '_server_tr_id-' + id).addClass("update", 1000);
+				setTimeout(function () {
+					$('#' + service_name + '_server_tr_id-' + id).removeClass("update");
+				}, 2500);
 			}
 		}
-	} );
+	});
 }
 function checkWebPanel() {
 	$.ajax({
-	  url: "options.py",
-	  data: {
-		  check_rabbitmq_alert: 1,
-		  token: $('#token').val()
-	  },
-	  type: "POST",
-	  success: function (data) {
-		  data = data.replace(/\s+/g, ' ');
-		  if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
-			  toastr.error(data);
-		  } else {
-			  toastr.success('Test message has been sent');
-		  }
-	  }
+		url: "/app/checker/check/rabbit",
+		// data: {
+		//   token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
+				toastr.error(data);
+			} else {
+				toastr.success('Test message has been sent');
+			}
+		}
 	});
 }
 function checkEmail() {
 	$.ajax({
-	  url: "options.py",
-	  data: {
-		  check_email_alert: 1,
-		  token: $('#token').val()
-	  },
-	  type: "POST",
-	  success: function (data) {
-		  data = data.replace(/\s+/g, ' ');
-		  if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
-			  toastr.error(data);
-		  } else {
-			  toastr.success('Test message has been sent');
-		  }
-	  }
+		url: "/app/checker/check/email",
+		// data: {
+		//   token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
+			if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
+				toastr.error(data);
+			} else {
+				toastr.success('Test message has been sent');
+			}
+		}
 	});
 }
 function checkGeoipInstallation() {
 	$.ajax( {
-		url: "options.py",
-		data: {
-			geoipserv: $('#geoipserv option:selected').val(),
-			geoip_service: $('#geoip_service option:selected').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/install/geoip/" + $('#geoip_service option:selected').val() + "/" + $('#geoipserv option:selected').val(),
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function( data ) {
 			data = data.replace(/^\s+|\s+$/g,'');
 			if(data.indexOf('No such file or directory') != '-1' || data.indexOf('cannot access') != '-1') {
@@ -2992,44 +2851,42 @@ function checkGeoipInstallation() {
 		}
 	} );
 }
-function installService(service){
+function installService(service) {
 	$("#ajax").html('')
 	var syn_flood = 0;
 	var docker = 0;
-	if ($('#'+service+'_syn_flood').is(':checked')) {
+	if ($('#' + service + '_syn_flood').is(':checked')) {
 		syn_flood = '1';
 	}
-	if ($('#'+service+'_docker').is(':checked')) {
+	if ($('#' + service + '_docker').is(':checked')) {
 		docker = '1';
 	}
-	if ($('#'+service+'addserv').val() == '------') {
+	if ($('#' + service + 'addserv').val() == '------') {
 		var select_server = $('#translate').attr('data-select_server');
 		toastr.warning(select_server);
 		return false
 	}
 	$("#ajax").html(wait_mess);
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/install/" + service + "/" + $('#' + service + 'addserv').val(),
 		data: {
-			install_service: $('#' + service + 'addserv').val(),
-			service: service,
 			syn_flood: syn_flood,
 			docker: docker,
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
-			data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			$("#ajax").html('')
 			if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
 				toastr.clear();
 				var p_err = show_pretty_ansible_error(data);
 				toastr.error(p_err);
-			} else if (data.indexOf('success') != '-1' ){
+			} else if (data.indexOf('success') != '-1') {
 				toastr.clear();
 				toastr.success(data);
-				$('#'+service+'addserv').trigger( "selectmenuchange" );
-			} else if (data.indexOf('Info') != '-1' ){
+				$('#' + service + 'addserv').trigger("selectmenuchange");
+			} else if (data.indexOf('Info') != '-1') {
 				toastr.clear();
 				toastr.info(data);
 			} else {
@@ -3037,49 +2894,45 @@ function installService(service){
 				toastr.info(data);
 			}
 		}
-	} );
+	});
 }
 function showServiceVersion(service) {
 	$.ajax({
-		url: "options.py",
-		data: {
-			get_service_v: service,
-			serv: $('#'+service+'addserv option:selected').val(),
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/install/" + service + "/version/" + $('#' + service + 'addserv option:selected').val(),
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			data = data.replace(/^\s+|\s+$/g, '');
 			if (data.indexOf('bash') != '-1' || data.indexOf('such') != '-1' || data.indexOf('command not found') != '-1' || data.indexOf('from') != '-1') {
-				$('#cur_'+service+'_ver').text(service+' has not installed');
-				$('#'+service+'_install').text('Install');
-				$('#'+service+'_install').attr('title', 'Install');
+				$('#cur_' + service + '_ver').text(service + ' has not installed');
+				$('#' + service + '_install').text('Install');
+				$('#' + service + '_install').attr('title', 'Install');
 			} else if (data.indexOf('warning: ') != '-1') {
 				toastr.warning(data);
 			} else if (data == '') {
-				$('#cur_'+service+'_ver').text(service+' has not installed');
-				$('#'+service+'_install').text('Install');
-				$('#'+service+'_install').attr('title', 'Install');
+				$('#cur_' + service + '_ver').text(service + ' has not installed');
+				$('#' + service + '_install').text('Install');
+				$('#' + service + '_install').attr('title', 'Install');
 			} else {
-				$('#cur_'+service+'_ver').text(data);
-				$('#cur_'+service+'_ver').css('font-weight', 'bold');
-				$('#'+service+'_install').text('Update');
-				$('#'+service+'_install').attr('title', 'Update');
+				$('#cur_' + service + '_ver').text(data);
+				$('#cur_' + service + '_ver').css('font-weight', 'bold');
+				$('#' + service + '_install').text('Update');
+				$('#' + service + '_install').attr('title', 'Update');
 			}
 		}
-	} );
+	});
 }
 function serverIsUp(server_ip, server_id) {
 	var cur_url = window.location.href.split('/').pop();
 	if (cur_url.split('#')[1] == 'servers') {
 		$.ajax({
-			url: "options.py",
-			data: {
-				act: 'server_is_up',
-				server_is_up: server_ip,
-				token: $('#token').val()
-			},
-			type: "POST",
+			url: "/app/server/check/server/" + server_ip,
+			// data: {
+			// 	token: $('#token').val()
+			// },
+			// type: "POST",
 			success: function (data) {
 				data = data.replace(/^\s+|\s+$/g, '');
 				if (data.indexOf('up') != '-1') {
@@ -3106,15 +2959,13 @@ function confirmChangeGroupsAndRoles(user_id) {
 	var cancel_word = $('#translate').attr('data-cancel');
 	var action_word = $('#translate').attr('data-save');
 	var user_groups_word = $('#translate').attr('data-user_groups');
-	var username = $('#login-'+user_id).val();
+	var username = $('#login-' + user_id).val();
 	$.ajax({
-		url: "options.py",
-		data: {
-			act: 'show_user_group_and_role',
-			user_id: user_id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/user/groups/" + user_id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function (data) {
 			$("#groups-roles").html(data);
 			$("#groups-roles").dialog({
@@ -3182,14 +3033,13 @@ function saveGroupsAndRoles(user_id) {
 	jsonData[user_id] = {};
 	$('#checked_groups tbody tr').each(function () {
 		var this_id = $(this).attr('id').split('-')[1];
-		var role_id = $('#add_role-'+this_id).val();
+		var role_id = $('#add_role-' + this_id).val();
 		jsonData[user_id][this_id] = {'role_id': role_id};
 	});
 	$.ajax({
-		url: "options.py",
+		url: "/app/user/groups/save",
 		data: {
-			act: 'save_user_group_and_role',
-			changeUserGroupsUser: $('#login-'+user_id).val(),
+			changeUserGroupsUser: $('#login-' + user_id).val(),
 			jsonDatas: JSON.stringify(jsonData),
 			token: $('#token').val()
 		},
@@ -3198,10 +3048,10 @@ function saveGroupsAndRoles(user_id) {
 			if (data.indexOf('error: ') != '-1') {
 				toastr.warning(data);
 			} else {
-				$("#user-"+user_id).addClass( "update", 1000 );
-				setTimeout(function() {
-					$( "#user-"+user_id ).removeClass( "update" );
-				}, 2500 );
+				$("#user-" + user_id).addClass("update", 1000);
+				setTimeout(function () {
+					$("#user-" + user_id).removeClass("update");
+				}, 2500);
 			}
 		}
 	});
@@ -3210,15 +3060,13 @@ function openChangeServerServiceDialog(server_id) {
 	var cancel_word = $('#translate').attr('data-cancel');
 	var action_word = $('#translate').attr('data-save');
 	var user_groups_word = $('#translate').attr('data-user_groups');
-	var hostname = $('#hostname-'+server_id).val();
+	var hostname = $('#hostname-' + server_id).val();
 	$.ajax({
-		url: "options.py",
-		data: {
-			act: 'show_server_services',
-			server_id: server_id,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/server/services/" + server_id,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "GET",
 		success: function (data) {
 			$("#groups-roles").html(data);
 			$("#groups-roles").dialog({
@@ -3283,16 +3131,15 @@ function changeServerServices(server_id) {
 		var this_id = $(this).attr('id').split('-')[1];
 		jsonData[this_id] = 0
 	});
-	$.ajax( {
-		url: "options.py",
+	$.ajax({
+		url: "/app/server/services/" + server_id,
 		data: {
-			changeServerServicesId: server_id,
 			jsonDatas: JSON.stringify(jsonData),
-			changeServerServicesServer: $('#hostname-'+server_id).val(),
+			changeServerServicesServer: $('#hostname-' + server_id).val(),
 			token: $('#token').val()
 		},
 		type: "POST",
-		success: function( data ) {
+		success: function (data) {
 			if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
 				toastr.error(data);
 			} else {
@@ -3302,5 +3149,5 @@ function changeServerServices(server_id) {
 				}, 2500);
 			}
 		}
-	} );
+	});
 }
diff --git a/inc/waf-6.3.8.js b/inc/waf.js
similarity index 65%
rename from inc/waf-6.3.8.js
rename to inc/waf.js
index eb98e23c..7b825994 100644
--- a/inc/waf-6.3.8.js
+++ b/inc/waf.js
@@ -1,8 +1,8 @@
 var awesome = "/inc/fontawesome.min.js"
-var waf = "/inc/waf-6.3.8.js"
-var overview = "/inc/overview-6.3.9.js"
+var waf = "/inc/waf.js"
+var overview = "/inc/overview.js"
 function showOverviewWaf(serv, hostnamea) {
-	var service = findGetParameter('service');
+	var service = cur_url[1];
 	if (service == 'haproxy') {
 		$.getScript('/inc/chart.min-4.3.0.js');
 		showWafMetrics();
@@ -15,28 +15,25 @@ function showOverviewWaf(serv, hostnamea) {
 	$.getScript(waf);
 }
 function showOverviewWafCallBack(serv, hostnamea) {
-	var service = findGetParameter('service');
-	$.ajax( {
-		url: "options.py",
-		data: {
-			act: "overviewwaf",
-			serv: serv,
-			service: service,
-			token: $('#token').val()
+	var service = cur_url[1];
+	$.ajax({
+		url: "/app/waf/overview/" + service + "/" + serv,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		beforeSend: function () {
+			$("#" + hostnamea).html('<img class="loading_small" src="/app/static/images/loading.gif" />');
 		},
-		beforeSend: function() {
-			$("#"+hostnamea).html('<img class="loading_small" src="/inc/images/loading.gif" />');
-		},
-		type: "POST",
-		success: function( data ) {
-			$("#"+hostnamea).empty();
-			$("#"+hostnamea).html(data)		
-			$( "input[type=submit], button" ).button();
-			$( "input[type=checkbox]" ).checkboxradio();
+		success: function (data) {
+			$("#" + hostnamea).empty();
+			$("#" + hostnamea).html(data)
+			$("input[type=submit], button").button();
+			$("input[type=checkbox]").checkboxradio();
 			$.getScript(overview);
 			$.getScript(awesome);
-		}				
-	} );
+		}
+	});
 }
 function metrics_waf(name) {
 	var enable = 0;
@@ -45,13 +42,11 @@ function metrics_waf(name) {
 	}
 	name = name.split('metrics')[1]
 	$.ajax( {
-		url: "options.py",
-		data: {
-			metrics_waf: name,
-			enable: enable,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/waf/metric/enable/" + enable + "/" + name,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function( data ) {
 			showOverviewWaf(ip, hostnamea);
 			setTimeout(function() {
@@ -63,52 +58,47 @@ function metrics_waf(name) {
 function installWaf(ip1) {
 	$("#ajax").html('');
 	$("#ajax").html(wait_mess);
-	var service = findGetParameter('service');
-	$.ajax( {
-		url: "options.py",
-		data: {
-			installwaf: ip1,
-			service: service,
-			token: $('#token').val()
-		},
+	var service = cur_url[1];
+	$.ajax({
+		url: "/app/install/waf/" + service + "/" + ip1,
+		// data: {
+		// 	token: $('#token').val()
+		// },
 		type: "POST",
-		success: function( data ) { 
-		data = data.replace(/\s+/g,' ');
+		success: function (data) {
+			data = data.replace(/\s+/g, ' ');
 			if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('fatal') != '-1') {
 				toastr.error(data);
-			} else if (data.indexOf('Info') != '-1' ){
+			} else if (data.indexOf('Info') != '-1') {
 				toastr.clear();
 				toastr.info(data);
-			} else if (data.indexOf('success') != '-1' ){
+			} else if (data.indexOf('success') != '-1') {
 				toastr.clear();
 				toastr.success('WAF service has been installed');
 				showOverviewWaf(ip, hostnamea);
 				$("#ajax").html('');
-			}	
+			}
 		}
-	} );	
+	});
 }
 function changeWafMode(id) {
-	var waf_mode = $('#'+id+' option:selected').val();
+	var waf_mode = $('#' + id + ' option:selected').val();
 	var server_hostname = id.split('_')[0];
-	var service = findGetParameter('service');
-	 $.ajax( {
-		url: "options.py",
-		data: {
-			change_waf_mode: waf_mode,
-			server_hostname: server_hostname,
-			service: service,
-			token: $('#token').val()
-		},
-		type: "POST",
-		success: function( data ) {
+	var service = cur_url[1];
+	$.ajax({
+		url: "/app/waf/" + service + "/mode/" + server_hostname + "/" + waf_mode,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
+		success: function (data) {
 			toastr.info('Do not forget restart WAF service');
-			$( '#'+server_hostname+'-select-line' ).addClass( "update", 1000 );										
-			setTimeout(function() {
-				$( '#'+server_hostname+'-select-line' ).removeClass( "update" );
-			}, 2500 );
+			$('#' + server_hostname + '-select-line').addClass("update", 1000);
+			setTimeout(function () {
+				$('#' + server_hostname + '-select-line').removeClass("update");
+			}, 2500);
 		}
-	} ); 
+	});
 }
 $( function() {
 	$( "#waf_rules input" ).change(function() {
@@ -121,16 +111,13 @@ function waf_rules_en(id) {
 	if ($('#rule_id-'+id).is(':checked')) {
 		enable = '1';
 	}
-	var serv = findGetParameter('serv')
+	var serv = cur_url[2];
 	$.ajax( {
-		url: "options.py",
-		data: {
-			waf_rule_id: id,
-			waf_en: enable,
-			serv: serv,
-			token: $('#token').val()
-		},
-		type: "POST",
+		url: "/app/waf/" + serv + "/rule/" + id + "/" + enable,
+		// data: {
+		// 	token: $('#token').val()
+		// },
+		// type: "POST",
 		success: function( data ) {
 			if (data.indexOf('sed:') != '-1' || data.indexOf('error: ') != '-1' ) {
 				toastr.error(data);
@@ -171,21 +158,19 @@ function addNewConfig() {
 					let new_rule_name = $('#new_rule_name').val();
 					let new_rule_description = $('#new_rule_description').val();
 					let new_rule_file = new_rule_name.replaceAll(' ','_');
-					var service = findGetParameter('service');
-					var serv = findGetParameter('serv');
+					var service = cur_url[1];
+					var serv = cur_url[2];
 					service = escapeHtml(service);
 					new_rule_name = escapeHtml(new_rule_name);
 					new_rule_description = escapeHtml(new_rule_description);
 					new_rule_file = escapeHtml(new_rule_file);
 					serv = escapeHtml(serv);
 					$.ajax({
-						url: "options.py",
+						url: "/app/waf/" + service + "/" + serv + "/rule/create",
 						data: {
 							new_waf_rule: new_rule_name,
 							new_rule_description: new_rule_description,
 							new_rule_file: new_rule_file,
-							service: service,
-							serv: serv,
 							token: $('#token').val()
 						},
 						type: "POST",
diff --git a/index.html b/index.html
index dd38b2b8..3a175c53 100644
--- a/index.html
+++ b/index.html
@@ -8,30 +8,29 @@
 		</script>
 		<meta charset="utf-8">
 		<title>Roxy-WI</title>
-		<link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" />
-		<link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png">
-		<link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png">
-		<link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png">
-		<link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png">
-		<link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png">
-		<link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png">
-		<link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png">
-		<link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png">
-		<link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png">
-		<link rel="icon" type="image/png" sizes="192x192"  href="/inc/images/favicon/android-icon-192x192.png">
-		<link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png">
-		<link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png">
-		<link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png">
-		<link rel="manifest" href="/inc/images/favicon/manifest.json">
+		<link href="/app/static/images/favicon/favicon.ico" rel="icon" type="image/png" />
+		<link rel="apple-touch-icon" sizes="57x57" href="/app/static/images/favicon/app/static/images/favicon/apple-icon-57x57.png">
+		<link rel="apple-touch-icon" sizes="60x60" href="/app/static/images/favicon/apple-icon-60x60.png">
+		<link rel="apple-touch-icon" sizes="72x72" href="/app/static/images/favicon/apple-icon-72x72.png">
+		<link rel="apple-touch-icon" sizes="76x76" href="/app/static/images/favicon/apple-icon-76x76.png">
+		<link rel="apple-touch-icon" sizes="114x114" href="/app/static/images/favicon/apple-icon-114x114.png">
+		<link rel="apple-touch-icon" sizes="120x120" href="/app/static/images/favicon/apple-icon-120x120.png">
+		<link rel="apple-touch-icon" sizes="144x144" href="/app/static/images/favicon/apple-icon-144x144.png">
+		<link rel="apple-touch-icon" sizes="152x152" href="/app/static/images/favicon/apple-icon-152x152.png">
+		<link rel="apple-touch-icon" sizes="180x180" href="/app/static/images/favicon/apple-icon-180x180.png">
+		<link rel="icon" type="image/png" sizes="192x192"  href="/app/static/images/favicon/android-icon-192x192.png">
+		<link rel="icon" type="image/png" sizes="32x32" href="/app/static/images/favicon/favicon-32x32.png">
+		<link rel="icon" type="image/png" sizes="96x96" href="/app/static/images/favicon/favicon-96x96.png">
+		<link rel="icon" type="image/png" sizes="16x16" href="/app/static/images/favicon/favicon-16x16.png">
+		<link rel="manifest" href="/app/static/images/favicon/manifest.json">
 		<meta name="msapplication-TileColor" content="#ffffff">
-		<meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png">
+		<meta name="msapplication-TileImage" content="/app/static/images/favicon/ms-icon-144x144.png">
 		<meta name="theme-color" content="#ffffff">
 		<script defer src="/inc/intro/introjs.min.js"></script>
 		<link href="/inc/intro/introjs.min.css" rel="stylesheet">
 		<link href="/inc/intro/introjs-modern.css" rel="stylesheet">
 		<link href="/inc/css/style-6.3.9.css" rel="stylesheet">
 		<link href="/inc/css/nprogress.css" rel="stylesheet">
-		<link href="/inc/css/provisioning.css" rel="stylesheet">
 		<link href="/inc/css/jquery-ui.min.css" rel="stylesheet">
 		<link href="/inc/css/jquery-ui.structure.min.css" rel="stylesheet">
 		<script src="/inc/jquery-3.6.0.min.js"></script>
@@ -41,7 +40,7 @@
 		<script defer src="/inc/fontawesome.min.js"></script>
 		<link href="/inc/css/awesome-6.3.9.css" rel="stylesheet">
 		<link href="/inc/css/chart.min.css" rel="stylesheet">
-		<script src="/inc/metrics-6.3.16.0.js"></script>
+		<script src="/inc/metrics.js"></script>
 		<script src="/inc/chart.min-4.3.0.js"></script>
 		<link rel="stylesheet" href="/inc/codemirror/codemirror.css">
 		<script src="/inc/codemirror/codemirror.js"></script>
@@ -50,15 +49,14 @@
 		<link href="/inc/css/toastr-6.3.9.css" rel="stylesheet"/>
 		<script src="/inc/toastr.js"></script>
 		<script defer src="/inc/ion.sound.min.js"></script>
-		<script src="/inc/provisioning.js"></script>
 		<link href="/inc/css/select2.css" rel="stylesheet" />
 		<script src="/inc/select2.js"></script>
 		<script src="/inc/reconnecting-websocket.js"></script>
 		<link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
 		<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
 		<script src="/inc/js.cookie.min.js"></script>
-		<script src="/inc/script-6.3.9.js"></script>
-		<meta http-equiv="refresh" content="0; url=/app/overview.py" />
+		<script src="/inc/script.js"></script>
+		<meta http-equiv="refresh" content="0; url=/app/" />
 	</head>
 	<body style="background-color: #239dee;">
 		<style>
@@ -83,7 +81,7 @@
 		<center>
 		<div style="color: white;">
 			<h1 style="font-size: 100px;">Welcome to</h1>
-			<img src="/inc/images/logo_index.png" alt="logo" style="margin-top: -50px;display: block;padding-bottom: 70px;" />
+			<img src="/app/static/images/logo_index.png" alt="logo" style="margin-top: -50px;display: block;padding-bottom: 70px;" />
 			<b style="font-size: 30px;">Redirecting... Please wait</b>
 		</div>
 		</center>
diff --git a/requirements.txt b/requirements.txt
index 9e92766c..f7456895 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -15,3 +15,4 @@ bottle>=0.12.20
 psutil>=5.9.1
 pdpyras>=4.5.2
 pika>=1.3.1
+Flask-Caching>=1.10.1