diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6d5d12d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+.vscode/
+ubl-settings-system
+*~
+build/
+compile/
+*#
+terminal-commands/
+source/ubl-cmake.h
+vgcore*
+.BUILD.md
+.updatebuild.sh
+.install.sh
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..be4d65b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,155 @@
+#!/usr/bin/make -f
+
+#SHELL := /bin/bash
+MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST)))
+MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH))))
+MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH))
+
+CMAKE_COMMAND = cmake
+CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source
+CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile
+DEPENDS = /bin/cmake
+PREFIX ?= /usr/local
+PKGNAME = $(MAKEFILE_DIR)
+FILE_VER = source/${PKGNAME}.h
+PKGIDENT=$(subst /,-,${PREFIX})
+
+default_target: all
+
+.PHONY: all init depend debug prepare check build uninstall install clean help
+
+all: init build
+
+init:
+	@echo "Initialize ..."; \
+	if [ -d ".git" ]; then \
+	    LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \
+		if [ -z "$${LATEST_TAG}" ]; \
+		then \
+			LATEST_TAG=$$"0.0"; \
+			echo "$${LATEST_TAG} is empty"; \
+		fi; \
+	else \
+	    LATEST_TAG="Development"; \
+	fi; \
+	sed -r "s/^(string version_application).*/\1 = \"$${LATEST_TAG}\";/" -i ${FILE_VER}; \
+	echo "-- Build path: ${CMAKE_BUILD_DIR}"
+
+depend:
+	@echo "Check depends ..."
+	@for FILE_DEPEND in $(DEPENDS); do \
+	    if [ ! -f $${FILE_DEPEND} ]; then \
+		echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \
+		exit 1; \
+	    fi; \
+	done; \
+	$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B${CMAKE_BUILD_DIR} --check-build-system CMakeFiles/Makefile.cmake 1 || exit 1; \
+	echo "Check depends: OK"
+
+debug:
+	@echo "Debug ..."
+	if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
+	    $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \
+	fi; \
+	echo "Debug: OK"
+
+prepare:
+	@echo "Prepare ..."; \
+	if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
+	    $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \
+	fi; \
+	echo "Prepare: OK"
+
+check:
+	@echo "Check ..."; \
+	if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \
+	    echo "Check: OK"; \
+	else \
+	    echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \
+	    exit 1; \
+	fi
+
+build: depend prepare
+	@echo "Build ..."; \
+	$(MAKE_COMMAND) --directory=${CMAKE_BUILD_DIR}; \
+	sed -r "s/^(string version_application).*/\1;/" -i ${FILE_VER}; \
+	echo "Build: OK"
+
+uninstall:
+	@echo "Uninstall ..."
+	@for FILE_PO in $(wildcard *.po); do \
+	    LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
+	    FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
+	    PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
+	    $(RM) "$${PATH_FILE_MO}"; \
+	done
+	@for SIZE in 16x16 32x32 48x48 scalable; do \
+	    $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+	    $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.png"; \
+	done
+	@for FILE_SVG in $(wildcard *.svg); do \
+	    for SIZE in 16x16 32x32 48x48 scalable; do \
+	        $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \
+	    done; \
+	done
+	@$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}"
+	@$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop"
+	@$(RM) "${DESTDIR}/usr/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg"
+	@$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy"
+	@if [ -z ${DESTDIR} ]; then \
+	    [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
+	    update-desktop-database --quiet &>/dev/null || true; \
+	    [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
+	fi
+	@echo "Uninstall: OK"
+
+install: check uninstall
+	@echo "Install ..."
+	@for FILE_PO in $(wildcard *.po); do \
+		LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
+		install -dm755 "${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES"; \
+		FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
+		PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
+		echo "$${FILE_PO}"; \
+		msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \
+	done
+	@for SIZE in 16 32 48; do \
+		install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \
+		rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+	done
+	@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg"
+	@cp ./com.ublinux.${PKGNAME}.policy ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy
+	@sed -e 's+/usr/bin+${PREFIX}/bin+' -e 's+.run+${PKGIDENT}.run+g' ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy -i
+	@install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
+	@install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"
+	@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg"
+	@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg"
+	@install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy"
+	@install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv/" "locales.csv"
+	@install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv/" "fonts.csv"
+	@if [ -z ${DESTDIR} ]; then \
+	    [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
+	    update-desktop-database --quiet &>/dev/null || true; \
+	    [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
+	fi
+	@echo "Install: OK"
+
+clean:
+	@echo "Clean ..."
+	@$(RM) -rd ${CMAKE_BUILD_DIR}
+	@if [ -d ${CMAKE_BUILD_DIR} ]; then \
+	    echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \
+	else \
+	    echo "Clean: OK"; \
+	fi
+
+help:
+	@echo "The following are some of the valid targets for this Makefile:"; \
+	echo "... all (the default if no target is provided)"; \
+	echo "... init"; \
+	echo "... debug"; \
+	echo "... prepare"; \
+	echo "... compile"; \
+	echo "... install"; \
+	echo "... uninstall"; \
+	echo "... clean"
\ No newline at end of file
diff --git a/README.md b/README.md
index e50809d..9442fd3 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,29 @@
 # ubl-settings-system
+# Выполнить
+# Build
+In order to build ubl-settings-system you will need:
+
+- CMake
+- C compiler
+- GTK+ 3 & dependencies
+- webkit2gtk (optional)
+
+Once you have all the necessary dependencies, you can use:
+```sh
+$ make
+```
+
+# Installation
+After a successful build, just use:
+```sh
+$ sudo make install clean
+```
+
+# Uninstallation
+After a successful build, just use:
+```sh
+$ sudo make uninstall
+```
+
+
 
diff --git a/com.ublinux.ubl-settings-system.checked.svg b/com.ublinux.ubl-settings-system.checked.svg
new file mode 100644
index 0000000..e3cab42
--- /dev/null
+++ b/com.ublinux.ubl-settings-system.checked.svg
@@ -0,0 +1,327 @@
+
+
diff --git a/com.ublinux.ubl-settings-system.policy b/com.ublinux.ubl-settings-system.policy
new file mode 100644
index 0000000..f85bdee
--- /dev/null
+++ b/com.ublinux.ubl-settings-system.policy
@@ -0,0 +1,24 @@
+
+
+
+
+  UBLinux
+  https://ublinux.ru
+
+  
+    Run ubl-settings-system as root
+    Запуск утилиты ubl-settings-system с правами root
+    Authentication is required to run ubl-settings-system
+    Требуется авторизация для запуска утилиты ubl-settings-system с правами root
+    
+      auth_admin
+      auth_admin
+      auth_admin
+    
+    /usr/bin/ubl-settings-system
+    true
+  
+
+
diff --git a/com.ublinux.ubl-settings-system.svg b/com.ublinux.ubl-settings-system.svg
new file mode 100644
index 0000000..9c90d43
--- /dev/null
+++ b/com.ublinux.ubl-settings-system.svg
@@ -0,0 +1,3521 @@
+
+
diff --git a/com.ublinux.ubl-settings-system.warning.svg b/com.ublinux.ubl-settings-system.warning.svg
new file mode 100644
index 0000000..9a90dba
--- /dev/null
+++ b/com.ublinux.ubl-settings-system.warning.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/fonts.csv b/fonts.csv
new file mode 100644
index 0000000..e09d0b7
--- /dev/null
+++ b/fonts.csv
@@ -0,0 +1,2 @@
+cyr-sun16
+terminus-bold-16
\ No newline at end of file
diff --git a/gresource.xml b/gresource.xml
new file mode 100644
index 0000000..02e88c1
--- /dev/null
+++ b/gresource.xml
@@ -0,0 +1,12 @@
+
+
+  
+    ubl-settings-system.glade
+  
+  
+    ubl-settings-system.css
+  
+  
+    ubl-settings-system-banner.png
+  
+
\ No newline at end of file
diff --git a/locales.csv b/locales.csv
new file mode 100644
index 0000000..543d3ee
--- /dev/null
+++ b/locales.csv
@@ -0,0 +1,129 @@
+af_ZA.UTF-8;Afrikaans, South Africa
+ar_AE.UTF-8;Arabic, United Arab Emirates
+ar_BH.UTF-8;Arabic, Bahrain
+ar_DZ.UTF-8;Arabic, Algeria
+ar_EG.UTF-8;Arabic, Egypt
+ar_IQ.UTF-8;Arabic, Iraq
+ar_JO.UTF-8;Arabic, Jordan
+ar_KW.UTF-8;Arabic, Kuwait
+ar_LY.UTF-8;Arabic, Libya
+ar_MA.UTF-8;Arabic, Morocco
+ar_OM.UTF-8;Arabic, Oman
+ar_QA.UTF-8;Arabic, Qatar
+ar_SA.UTF-8;Arabic, Saudi Arabia
+ar_TN.UTF-8;Arabic, Tunisia
+ar_YE.UTF-8;Arabic, Yemen
+as_IN.UTF-8;Assamese, India
+az_AZ.UTF-8;Azerbaijani, Azerbaijan
+be_BY.UTF-8;Belarusian, Belarus
+bg_BG.UTF-8;Bulgarian, Bulgaria
+bn_IN.UTF-8;Bengali, India
+bs_BA.UTF-8;Bosnian, Bosnia and Herzegovina
+ca_ES.UTF-8;Catalan, Spain
+cs_CZ.UTF-8;Czech, Czech Republic
+da_DK.UTF-8;Danish, Denmark
+de_AT.UTF-8;German, Austria
+de_BE.UTF-8;German, Belgium
+de_CH.UTF-8;German, Switzerland
+de_DE.UTF-8;German, Germany
+de_LI.UTF-8;German, Liechtenstein
+de_LU.UTF-8;German, Luxembourg
+el_CY.UTF-8;Greek, Cyprus
+el_GR.UTF-8;Greek, Greece
+en_AU.UTF-8;English, Australia
+en_BW.UTF-8;English, Botswana
+en_CA.UTF-8;English, Canada
+en_GB.UTF-8;English, United Kingdom
+en_HK.UTF-8;English, Hong Kong SAR China
+en_IE.UTF-8;English, Ireland
+en_IN.UTF-8;English, India
+en_MT.UTF-8;English, Malta
+en_NZ.UTF-8;English, New Zealand
+en_PH.UTF-8;English, Philippines
+en_SG.UTF-8;English, Singapore
+en_US.UTF-8;English, U.S.A.
+en_ZW.UTF-8;English, Zimbabwe
+es_AR.UTF-8;Spanish, Argentina
+es_BO.UTF-8;Spanish, Bolivia
+es_CL.UTF-8;Spanish, Chile
+es_CO.UTF-8;Spanish, Colombia
+es_CR.UTF-8;Spanish, Costa Rica
+es_DO.UTF-8;Spanish, Dominican Republic
+es_EC.UTF-8;Spanish, Ecuador
+es_ES.UTF-8;Spanish, Spain
+es_GT.UTF-8;Spanish, Guatemala
+es_HN.UTF-8;Spanish, Honduras
+es_MX.UTF-8;Spanish, Mexico
+es_NI.UTF-8;Spanish, Nicaragua
+es_PA.UTF-8;Spanish, Panama
+es_PE.UTF-8;Spanish, Peru
+es_PR.UTF-8;Spanish, Puerto Rico
+es_PY.UTF-8;Spanish, Paraguay
+es_SV.UTF-8;Spanish, El Salvador
+es_US.UTF-8;Spanish, U.S.A.
+es_UY.UTF-8;Spanish, Uruguay
+es_VE.UTF-8;Spanish, Venezuela
+et_EE.UTF-8;Estonian, Estonia
+fi_FI.UTF-8;Finnish, Finland
+fr_BE.UTF-8;French, Belgium
+fr_CA.UTF-8;French, Canada
+fr_CH.UTF-8;French, Switzerland
+fr_FR.UTF-8;French, France
+fr_LU.UTF-8;French, Luxembourg
+gu_IN.UTF-8;Gujarati, India
+he_IL.UTF-8;Hebrew, Israel
+hi_IN.UTF-8;Hindi, India
+hr_HR.UTF-8;Croatian, Croatia
+hu_HU.UTF-8;Hungarian, Hungary
+hy_AM.UTF-8;Armenian, Armenia
+id_ID.UTF-8;Indonesian, Indonesia
+is_IS.UTF-8;Icelandic, Iceland
+it_CH.UTF-8;Italian, Switzerla;nd
+it_IT.UTF-8;Italian, Italy
+ja_JP.UTF-8;Japanese, Japan
+ka_GE.UTF-8;Georgian, Georgia
+kk_KZ.UTF-8;Kazakh, Kazakhstan
+kn_IN.UTF-8;Kannada, India
+ko_KR.UTF-8;Korean, Korea
+ks_IN.UTF-8;Kashmiri, India
+ku_TR.UTF-8;Kurdish, Turkey
+ku_TR.UTF-8@sorani;Kurdish (Sorani), Turkey
+ky_KG.UTF-8;Kirghiz, Kyrgyzstan
+lt_LT.UTF-8;Lithuanian, Lithuania
+lv_LV.UTF-8;Latvian, Latvia
+mk_MK.UTF-8;Macedonian, Macedonia
+ml_IN.UTF-8;Malayalam, India
+mr_IN.UTF-8;Marathi, India
+ms_MY.UTF-8;Malay, Malaysia
+mt_MT.UTF-8;Maltese, Malta
+nb_NO.UTF-8;Bokmal, Norway
+nl_BE.UTF-8;Dutch, Belgium
+nl_NL.UTF-8;Dutch, Netherlands
+nn_NO.UTF-8;Nynorsk, Norway
+or_IN.UTF-8;Oriya, India
+pa_IN.UTF-8;Punjabi, India
+pl_PL.UTF-8;Polish, Poland
+pt_BR.UTF-8;Portuguese, Brazil
+pt_PT.UTF-8;Portuguese, Portugal
+ro_RO.UTF-8;Romanian, Romania
+ru_RU.UTF-8;Russian, Russia
+ru_UA.UTF-8;Russian, Ukraine
+sa_IN.UTF-8;Sanskrit, India
+sk_SK.UTF-8;Slovak, Slovakia
+sl_SI.UTF-8;Slovenian, Slovenia
+sq_AL.UTF-8;Albanian, Albania
+sr_ME.UTF-8;Serbian, Montenegro
+sr_ME.UTF-8@latin;Serbian, Montenegro (Latin)
+sr_RS.UTF-8;Serbian, Serbia
+sr_RS.UTF-8@latin;Serbian, Serbia (Latin)
+sv_SE.UTF-8;Swedish, Sweden
+ta_IN.UTF-8;Tamil, India
+te_IN.UTF-8;Telugu, India
+th_TH.UTF-8;Thai, Thailand
+tr_TR.UTF-8;Turkish, Turkey
+uk_UA.UTF-8;Ukrainian, Ukraine
+vi_VN.UTF-8;Vietnamese, Vietnam
+zh_CN.UTF-8;Simplified Chinese, China
+zh_HK.UTF-8;Traditional Chinese, Hong Kong SAR China
+zh_SG.UTF-8;Chinese, Singapore
+zh_TW.UTF-8;Traditional Chinese, Taiwan
\ No newline at end of file
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
new file mode 100644
index 0000000..865fcbb
--- /dev/null
+++ b/source/CMakeLists.txt
@@ -0,0 +1,96 @@
+cmake_minimum_required(VERSION 3.7)
+project(ubl-settings-system)
+
+find_package(PkgConfig REQUIRED)
+
+pkg_check_modules(GTK REQUIRED gtk+-3.0)
+include_directories(${GTK_INCLUDE_DIRS})
+link_directories(${GTK_LIBRARY_DIRS})
+add_definitions(${GTK_CFLAGS_OTHER})
+
+#pkg_check_modules(VTE291 REQUIRED vte-2.91)
+#include_directories(${VTE291_INCLUDE_DIRS})
+#link_directories(${VTE291_LIBRARY_DIRS})
+#add_definitions(${VTE291_CFLAGS_OTHER})
+
+find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
+
+option(WEBKIT_FOUND "No" OFF)
+if(WEBKIT_LIBRARIES_FOUND)
+        option(WEBKIT_FOUND "Yes" ON)
+        PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
+        include_directories(${WEBKIT_INCLUDE_DIRS})
+        link_directories(${WEBKIT_LIBRARY_DIRS})
+        add_definitions(${WEBKIT_CFLAGS_OTHER})
+endif()
+
+configure_file(ubl-cmake.in ubl-cmake.h)
+
+file(COPY ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h DESTINATION ./)
+
+set(GRESOURCE_C   resources.c)
+set(GRESOURCE_XML gresource.xml)
+
+find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED)  
+add_custom_target(GLADE ubl-settings-system.glade)
+
+set(DEPENDFILES 
+                ../ubl-settings-system.glade
+                ../gresource.xml
+                ../ubl-settings-system-banner.png
+                ../ubl-settings-system.css
+        )
+
+file(COPY ${DEPENDFILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+
+add_custom_command(
+    OUTPUT ${GRESOURCE_C}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    COMMAND ${GLIB_COMPILE_RESOURCES}
+    ARGS
+        --generate-source
+        --target=${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
+        ${GRESOURCE_XML}
+    VERBATIM
+    MAIN_DEPENDENCY ${GRESOURCE_XML}
+    DEPENDS
+        ${GLADE}
+)
+add_custom_target(
+    dummy-resource
+    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
+)
+
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a")
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -lm")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \
+	-O2 -pipe -fno-plt -fexceptions \
+        -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
+        -fstack-clash-protection -fcf-protection")
+      
+
+set(SOURCE_FILES
+        ubl-settings-system.c
+        ubl-settings-system.h
+        ubl-strings.h
+        ubl-utils.h
+        ubl-utils.c
+        ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h
+        )
+
+set(LIBRARIES
+        ${GTK_LIBRARIES}
+        ${WEBKIT_LIBRARIES}
+#        ${VTE291_LIBRARIES}
+        pthread)
+
+
+add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})
+target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES})
+target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR})
+set_source_files_properties(
+    ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
+    PROPERTIES GENERATED TRUE
+)
+install(TARGETS ${PROJECT_NAME} DESTINATION bin)
+add_dependencies(${PROJECT_NAME} dummy-resource)
\ No newline at end of file
diff --git a/source/ubl-cmake.in b/source/ubl-cmake.in
new file mode 100644
index 0000000..d4623a7
--- /dev/null
+++ b/source/ubl-cmake.in
@@ -0,0 +1 @@
+#cmakedefine WEBKIT_FOUND
diff --git a/source/ubl-settings-system.c b/source/ubl-settings-system.c
new file mode 100644
index 0000000..86422f3
--- /dev/null
+++ b/source/ubl-settings-system.c
@@ -0,0 +1,500 @@
+#include "ubl-settings-system.h"
+
+config main_config;
+
+//signal emmit handlers - no header initialization
+
+/**on_close_subwindow(GtkWidget *self)
+ * [EN]
+ * Closes window in which [self] is contained.
+ * [RU]
+ * Закрывает окно, в котором расположен виджет [self].
+*/
+void on_close_subwindow(GtkWidget *self){
+    gtk_widget_destroy(gtk_widget_get_toplevel(self));
+}
+
+/**yon_open_browser(GtkWidget *self, char *link)
+ * [EN]
+ * Opens browser with [link] link.
+ * [RU]
+ * Открывает браузер с [link] ссылкой.
+*/
+void yon_open_browser(GtkWidget *self, char *link){
+    yon_ubl_browser_window_open(link,TITLE_LABEL);
+}
+
+/**on_open_documentation_confirmation(GtkWidget *self, char *link)
+ * [EN]
+ * Opens confirmation window for [link] link.
+ * [RU]
+ * Открывает окно подтверждение перехода по ссылке [link].
+*/
+void on_open_documentation_confirmation(GtkWidget *self, char *link){
+    if (main_config.always_open_documentation==0){
+        GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
+        documentation_confirmation_window *widgets = malloc(sizeof(documentation_confirmation_window));
+        widgets->Window = yon_gtk_builder_get_widget(builder,"helpConfirmationWindow");
+        widgets->AcceptButton = yon_gtk_builder_get_widget(builder,"ReadHelpButton");
+        widgets->CloseButton = yon_gtk_builder_get_widget(builder,"CancelHelpButton");
+        widgets->HatText = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel");
+        widgets->HeaderText = yon_gtk_builder_get_widget(builder,"helpHeader");
+        widgets->InfoText = yon_gtk_builder_get_widget(builder,"helpText");
+        widgets->AlwaysOpenCheck = yon_gtk_builder_get_widget(builder,"AlwaysOpenDocumentationCheckbox");
+        gtk_label_set_text(GTK_LABEL(widgets->HatText),TITLE_LABEL);
+        gtk_label_set_text(GTK_LABEL(widgets->HeaderText),HELP_TITLE_LABEL);
+        gtk_label_set_text(GTK_LABEL(widgets->InfoText),HELP_INFO_LABEL);
+        gtk_button_set_label(GTK_BUTTON(widgets->AcceptButton),OPEN_HELP_LABEL);
+        gtk_button_set_label(GTK_BUTTON(widgets->AlwaysOpenCheck),HELP_ALWAYS_OPEN_LABEL);
+        gtk_button_set_label(GTK_BUTTON(widgets->CloseButton),CANCEL_LABEL);
+        gtk_widget_show_all(widgets->Window);
+        g_signal_connect(G_OBJECT(widgets->CloseButton),"clicked",G_CALLBACK(on_close_subwindow),NULL);
+        g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(yon_open_browser),yon_char_new(link));
+        g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(on_close_subwindow),NULL);
+        
+        
+    } else {
+        yon_open_browser(self,link);
+    }
+}
+
+/**on_link(GtkWidget *self, char* uri, gpointer user_data)
+ * [EN]
+ * Signal for hadnling AboutDialog links.
+ * Connect to "activate-link" signal.
+ * [self] is AboutDialog window;
+ * [uri] is activated link;
+ * [user_data] is pointer for user data, hasn't used in standard handler;
+ * [RU]
+ * Функция для обработки сигнала нажатия на ссылку окна AboutDialog.
+ * Присоединять к сигналу "activate-link".
+ * [self] - окно AboutDialog;
+ * [uri] - ссылка, по которой совершается переход;
+ * [user_data] - указатель на любые другие данные, не используется в стандартном обработчике;
+*/
+void on_link(GtkWidget *self, char* uri, gpointer user_data){
+    gtk_widget_destroy(self);
+    on_open_documentation_confirmation(self,uri);
+}
+
+/**on_about()
+ * [EN]
+ * Function for setting up and showing AboutDialog.
+ * Connect it to "activate" signal of Documentation MenuItem.
+ * [RU]
+ * Функиця для настройки и показа окна AboutDialog.
+ * Присоединять к сигналу "activate" кнопки справки типа MenuItem.
+*/
+void on_about(){
+    GtkBuilder *builder=gtk_builder_new_from_resource(glade_path);
+    GtkWidget *window=yon_gtk_builder_get_widget(builder,"AboutWindow");
+    GtkWidget *title=yon_gtk_builder_get_widget(builder,"headerAboutTopic");
+    GtkWidget *hideButtonBox=yon_gtk_builder_get_widget(builder,"buttonBoxHide");
+    gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window),version_application);
+    gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(window),PROJECT_HOME_LABEL);
+    gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),TITLE_LABEL);
+    gtk_label_set_text(GTK_LABEL(title),TITLE_LABEL);
+    g_signal_connect(G_OBJECT(window),"activate-link",G_CALLBACK(on_link),NULL);
+    gtk_widget_set_visible(hideButtonBox,0);
+    gtk_widget_destroy(hideButtonBox);
+    gtk_widget_show(window);
+}
+
+//functions
+
+void yon_load_proceed(YON_CONFIG_TYPE type){
+    if (yon_config_load_register(type,"config",hostname_parameter,"config",id_parameter,"locale",console_font_parameter,"locale",language_parameter,NULL))
+        yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+    else
+        yon_ubl_status_box_render(LOAD_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
+    
+}
+
+void yon_config_local_load(GtkWidget *self, main_window *widgets){
+    gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),"");
+    gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),"");
+        gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),"");
+    gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ConsoleFontCombo),0);
+    gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->LanguageCombo),0);
+    yon_load_proceed(YON_CONFIG_LOCAL);
+    gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),yon_config_get_by_key(hostname_parameter));
+    char *id = yon_config_get_by_key(id_parameter);
+    if (!strcmp(id,"Random"))
+        gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->IDCombo),1);
+    else if (!strcmp(id,"hardware"))
+        gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->IDCombo),2);
+    else
+        gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),id);
+
+    GtkTreeIter iter;
+    char *code;
+    char *cons_font = yon_config_get_by_key(console_font_parameter);
+    if (cons_font){
+        int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->fontlist),&iter);
+        for(;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->fontlist),&iter)){
+            gtk_tree_model_get(GTK_TREE_MODEL(widgets->fontlist),&iter,0,&code,-1);
+            if (code&&!strcmp(code,cons_font)) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ConsoleFontCombo),&iter);
+        }
+    }
+    char *lang = yon_config_get_by_key(language_parameter);
+    if (lang){
+        int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->languagelist),&iter);
+        for(;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->languagelist),&iter)){
+            gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,1,&code,-1);
+            if (code&&!strcmp(code,lang)) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->LanguageCombo),&iter);
+        }
+    }
+
+}
+
+void yon_config_global_load(GtkWidget *self, main_window *widgets){
+    gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),"");
+    gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),"");
+        gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),"");
+    gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ConsoleFontCombo),0);
+    gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->LanguageCombo),0);
+    yon_load_proceed(YON_CONFIG_GLOBAL);
+    gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),yon_config_get_by_key(hostname_parameter));
+    char *id = yon_config_get_by_key(id_parameter);
+    if (!strcmp(id,"Random"))
+        gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->IDCombo),1);
+    else if (!strcmp(id,"hardware"))
+        gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->IDCombo),2);
+    else
+        gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),id);
+
+    GtkTreeIter iter;
+    char *code;
+    char *cons_font = yon_config_get_by_key(console_font_parameter);
+    if (cons_font){
+        int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->fontlist),&iter);
+        for(;valid;gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->fontlist),&iter)){
+            gtk_tree_model_get(GTK_TREE_MODEL(widgets->fontlist),&iter,1,&code,-1);
+            if (code&&!strcmp(code,cons_font)){ gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ConsoleFontCombo),&iter); break; }
+            else { gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ConsoleFontCombo),0); }
+        }
+    }
+    char *lang = yon_config_get_by_key(language_parameter);
+    if (lang){
+        int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->languagelist),&iter);
+        for(;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->languagelist),&iter)){
+            gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,1,&code,-1);
+            if (!strcmp(code,lang)){ gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->LanguageCombo),&iter); break; }
+            else { gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->LanguageCombo),0); }
+        }
+    }
+
+}
+
+void yon_config_global_local_save(){
+    yon_config_save_registered(NULL,"");
+
+}
+
+void yon_config_local_save(){
+    yon_config_save_registered("system","config");
+}
+
+void yon_config_global_save(){
+    yon_config_save_registered("global","");
+
+}
+
+void on_hostname_changed(GtkEntry *self, main_window *widgets){
+    char *text = (char*)gtk_entry_get_text(self);
+    if (yon_config_get_by_key(hostname_parameter)){
+        yon_config_set(hostname_parameter,text);
+    } else {
+        yon_config_register(hostname_parameter,"config",text);
+    }
+}
+
+void on_id_combo_toggled(GtkComboBox *self, main_window *widgets){
+    int id = gtk_combo_box_get_active(self);
+    if (id==2||id==1){ 
+        if (yon_config_get_by_key(id_parameter)){
+            yon_config_set(id_parameter, id == 1 ? "Random" : "hardware");
+        } else {
+            yon_config_register(id_parameter,"config", id == 1 ? "Random":"hardware");
+        }
+    }
+    if (id<3){
+
+        gtk_widget_set_sensitive(widgets->IDEntry,0);
+        gtk_widget_set_sensitive(widgets->IDCopyButton,0);
+    }
+    else {
+        gtk_widget_set_sensitive(widgets->IDCopyButton,1);
+        gtk_widget_set_sensitive(widgets->IDEntry,1);
+    }
+}
+
+void on_id_changed(GtkEntry *self, main_window *widgets){
+    char *text = (char*)gtk_entry_get_text(self);
+    if (yon_config_get_by_key(id_parameter)){
+        yon_config_set(id_parameter,text);
+    } else {
+        yon_config_register(id_parameter,"config",text);
+    }
+
+}
+
+void on_id_copy(GtkButton *self, main_window *widgets){
+    GtkClipboard *clipboard = gtk_clipboard_get_default(gdk_display_get_default());
+    const char *clipboard_id = gtk_entry_get_text(GTK_ENTRY(widgets->IDEntry));
+    gtk_clipboard_set_text(clipboard,clipboard_id,strlen(clipboard_id));
+    yon_ubl_status_box_render(COPY_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+}
+
+void on_console_font_changed(GtkComboBox *self, main_window *widgets){
+    GtkTreeIter iter;
+    if (gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ConsoleFontCombo))==0){
+        yon_config_remove_by_key(console_font_parameter);
+    } else {
+        gtk_combo_box_get_active_iter(self,&iter);
+        char *code;
+        gtk_tree_model_get(GTK_TREE_MODEL(widgets->fontlist),&iter,0,&code,-1);
+        if (code)
+        if (yon_config_get_by_key(console_font_parameter)){
+            yon_config_set(console_font_parameter,code);
+        } else {
+            yon_config_register(console_font_parameter,"locale",code);
+        }
+    }
+}
+
+void on_language_changed(GtkComboBox *self, main_window *widgets){
+    GtkTreeIter iter;
+    if (gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->LanguageCombo))==0){
+        yon_config_remove_by_key(language_parameter);
+    } else {
+        gtk_combo_box_get_active_iter(self,&iter);
+        char *code;
+        gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,1,&code,-1);
+        if (code)
+        if (yon_config_get_by_key(language_parameter)){
+            yon_config_set(language_parameter,code);
+        } else {
+            yon_config_register(language_parameter,"locale",code);
+        }
+    }
+}
+
+// standard functions
+
+void config_init(){
+    main_config.always_open_documentation=0;
+    main_config.win_height=0;
+    main_config.win_width=0;
+    main_config.win_pos_x=0;
+    main_config.win_pos_y=0;
+    main_config.socket_id=-1;
+    main_config.save_socket_id=-1;
+    main_config.load_socket_id=-1;
+    main_config.lock_help=0;
+    main_config.lock_help=0;
+    main_config.lock_load_global=0;
+    main_config.lock_save_global=0;
+    main_config.lock_save_local=0;
+}
+
+main_window *setup_window(){
+    /* Widgets getting | Получение виджетов */
+    main_window *widgets = malloc(sizeof(main_window));
+    GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
+    widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow");
+    widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic");
+    widgets->PlugBox = yon_gtk_builder_get_widget(builder,"plugBox");
+
+    widgets->HeadOverlay = yon_gtk_builder_get_widget(builder,"HeadOverlay");
+    widgets->HeadImage = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage");
+    widgets->HeadBox = yon_gtk_builder_get_widget(builder,"HeaderBox");
+    widgets->HeadTitleLabel = yon_gtk_builder_get_widget(builder,"HeaderTitleLabel");
+    widgets->HeadInfoLabel = yon_gtk_builder_get_widget(builder,"HeaderInfoLabel");
+    
+    widgets->StatusBox = yon_gtk_builder_get_widget(builder,"mainStatusBox");
+    widgets->StatusIcon = yon_gtk_builder_get_widget(builder,"mainStatusIcon");
+    widgets->StatusLabel = yon_gtk_builder_get_widget(builder,"mainStatusLabel");
+
+    widgets->SaveLabel = yon_gtk_builder_get_widget(builder,"headerSaveConfigLabel");
+    widgets->SaveMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalLocalConfigurationMenuItem");
+    widgets->SaveGlobalMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalConfigurationMenuItem");
+    widgets->SaveLocalMenuItem = yon_gtk_builder_get_widget(builder,"SaveLocalConfigurationMenuItem");
+    widgets->RightBox = yon_gtk_builder_get_widget(builder,"HeaderRightBox");
+
+    widgets->LoadLabel = yon_gtk_builder_get_widget(builder,"headerLoadConfigLabel");
+    widgets->LoadGlobalMenuItem = yon_gtk_builder_get_widget(builder,"LoadGlobalConfigurationMenuItem");
+    widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem");
+    widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox");
+
+    widgets->HostnameEntry = yon_gtk_builder_get_widget(builder,"HostnameEntry");
+    widgets->IDCombo = yon_gtk_builder_get_widget(builder,"IDCombo");
+    widgets->IDEntry = yon_gtk_builder_get_widget(builder,"IDEntry");
+    widgets->IDCopyButton = yon_gtk_builder_get_widget(builder,"IDCopyButton");
+    widgets->ConsoleFontCombo = yon_gtk_builder_get_widget(builder,"ConsoleFontCombo");
+    widgets->LanguageCombo = yon_gtk_builder_get_widget(builder,"LanguageCombo");
+
+    widgets->fontlist = GTK_LIST_STORE(gtk_builder_get_object(builder,"fontlist"));
+    widgets->languagelist = GTK_LIST_STORE(gtk_builder_get_object(builder,"languagelist"));
+
+    widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL);
+    widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL);
+
+    
+    gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL);
+    
+    GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2");
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem);
+
+    if (main_config.lock_load_global == 1){
+        gtk_widget_set_sensitive(widgets->LoadGlobalMenuItem,0);
+    }
+    if (main_config.lock_save_global == 1){
+        gtk_widget_set_sensitive(widgets->SaveGlobalMenuItem,0);
+        gtk_widget_set_sensitive(widgets->SaveMenuItem,0);
+    }
+    if (main_config.lock_save_local == 1){
+        gtk_widget_set_sensitive(widgets->SaveLocalMenuItem,0);
+        gtk_widget_set_sensitive(widgets->SaveMenuItem,0);
+    }
+
+    /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */
+    // yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING); 
+
+    /* Signal connection | Присоединение сигналов */
+    g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK);
+    g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),widgets);
+
+    g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(yon_config_global_load),widgets);
+    g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(yon_config_local_load),widgets);
+
+    g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(yon_config_global_local_save),widgets);
+    g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(yon_config_global_save),widgets);
+    g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(yon_config_local_save),widgets);
+
+    g_signal_connect(G_OBJECT(widgets->HostnameEntry),"changed",G_CALLBACK(on_hostname_changed),widgets);
+    g_signal_connect(G_OBJECT(widgets->IDCombo),"changed",G_CALLBACK(on_id_combo_toggled),widgets);
+    g_signal_connect(G_OBJECT(widgets->IDEntry),"changed",G_CALLBACK(on_id_changed),widgets);
+    g_signal_connect(G_OBJECT(widgets->IDCopyButton),"clicked",G_CALLBACK(on_id_copy),widgets);
+    g_signal_connect(G_OBJECT(widgets->ConsoleFontCombo),"changed",G_CALLBACK(on_console_font_changed),widgets);
+    g_signal_connect(G_OBJECT(widgets->LanguageCombo),"changed",G_CALLBACK(on_language_changed),widgets);
+    // g_signal_connect(G_OBJECT(widgets->IDRandomCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),widgets->IDCopyButton);
+    // g_signal_connect(G_OBJECT(widgets->IDRandomCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),widgets->IDEntry);
+    int size;
+    config_str locales = yon_config_load(get_locales_command,&size);
+    GtkTreeIter iter;
+    for (int i=0;ilanguagelist,&iter);
+        gtk_list_store_set(widgets->languagelist,&iter,0,_(loc_parsed[1]),1,loc_parsed[0],-1);
+    }
+    config_str fonts = yon_config_load(get_fonts_command,&size);
+    for (int i=0;ifontlist,&iter);
+        gtk_list_store_set(widgets->fontlist,&iter,0,fonts[i],-1);
+    }
+    gtk_widget_show(widgets->Window);
+    return widgets;
+}
+
+int main(int argc, char *argv[]){
+    local=setlocale(LC_ALL, "");
+    textdomain (LocaleName);
+    config_init();
+    int option_index=0;
+    int show_help=0;
+    int debug_mode=0;
+    {
+        struct option long_options[] = {
+                {"help", 0, 0, 'h'},
+                {"version", 0, 0, 'V'},
+                {"lock-help", 0,0, 1},
+                {"lock-save", 0,0, 2},
+                {"lock-save-local", 0,0, 3},
+                {"lock-save-global", 0,0, 4},
+                {"lock-load-global", 0,0, 5},
+                {"socket-id", 1, 0, 's'},
+                {"socket-ext-id", 1,0, 'e'},
+                {"socket-trd-id", 1,0, 't'},
+                {"debug", 0,0, 'd'},
+                { NULL, 0, NULL, 0 }
+        };
+        for (int i=0;iHeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path);
+    
+    yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel);
+    if (getuid()!=0)
+        yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
+    else
+        yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+    yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id);
+    yon_window_config_setup(GTK_WINDOW(widgets->Window));
+    yon_window_config_load(config_path);
+    yon_config_local_load(NULL,widgets);
+
+    GtkCssProvider *css=gtk_css_provider_new();
+    gtk_css_provider_load_from_resource(css,CssPath);
+    gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
+                            GTK_STYLE_PROVIDER(css),
+                            -1);
+    gtk_main();
+}
\ No newline at end of file
diff --git a/source/ubl-settings-system.h b/source/ubl-settings-system.h
new file mode 100644
index 0000000..02f4723
--- /dev/null
+++ b/source/ubl-settings-system.h
@@ -0,0 +1,114 @@
+#include 
+#include 
+#include "ubl-utils.h"
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "../compile/ubl-cmake.h"
+#ifdef WEBKIT_FOUND
+    #include 
+#endif 
+#include "ubl-strings.h"
+
+#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-system"
+
+#define _(String) gettext(String)
+
+#define glade_path "/com/ublinux/ui/ubl-settings-system.glade"
+#define banner_path "/com/ublinux/images/ubl-settings-system-banner.png"
+#define CssPath "/com/ublinux/css/ubl-settings-system.css"
+#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL)
+#define locale_transcriptions_path "/usr/share/ubl-settings-system/csv/locales.csv"
+
+#define LocalePath "/usr/share/locale" 
+#define LocaleName "ubl-settings-system"
+
+#define config_global_load_command "ubconfig --source global get "
+#define config_local_load_command "ubconfig --source system get "
+
+#define get_locales_command "grep '' /usr/share/ubl-settings-system/csv/locales.csv"
+#define get_fonts_command "grep '' /usr/share/ubl-settings-system/csv/fonts.csv"
+// #define get_fonts_command "ls /usr/share/kbd/consolefonts/ |grep -v \"README\"|grep -oE \"^[-a-zA-Z0-9_]{3,}.psf\"|sed -e 's/\\.psf//g'"
+
+typedef char* string;
+string version_application;
+
+char *local;
+
+typedef struct {
+    int always_open_documentation;
+    int win_pos_x;
+    int win_pos_y;
+    int win_width;
+    int win_height;
+
+    int socket_id;
+    int load_socket_id;
+    int save_socket_id;
+    
+    int lock_help;
+    int lock_save_local;
+    int lock_save_global;
+    int lock_load_global;
+} config;
+
+typedef struct {
+    //Standard
+    GtkWidget *Window;
+    GtkWidget *HatLabel;
+    GtkWidget *PlugBox;
+
+    GtkWidget *HeadOverlay;
+    GtkWidget *HeadImage;
+    GtkWidget *HeadBox;
+    GtkWidget *HeadTitleLabel;
+    GtkWidget *HeadInfoLabel;
+
+    GtkWidget *StatusBox;
+    GtkWidget *StatusIcon;
+    GtkWidget *StatusLabel;
+
+    GtkWidget *SaveLabel;
+    GtkWidget *SaveMenuItem;
+    GtkWidget *SaveGlobalMenuItem;
+    GtkWidget *SaveLocalMenuItem;
+    GtkWidget *RightBox;
+
+    GtkWidget *LoadLabel;
+    GtkWidget *LoadGlobalMenuItem;
+    GtkWidget *LoadLocalMenuItem;
+    GtkWidget *LeftBox;
+
+    GtkWidget *DocumentationMenuItem;
+    GtkWidget *AboutMenuItem;
+    // Custom 
+    GtkWidget *HostnameEntry;
+    GtkWidget *IDCombo;
+    GtkWidget *IDEntry;
+    GtkWidget *IDCopyButton;
+    GtkWidget *ConsoleFontCombo;
+    GtkWidget *LanguageCombo;
+
+    GtkListStore *fontlist;
+    GtkListStore *languagelist;
+
+} main_window;
+
+
+typedef struct {
+    GtkWidget *Window;
+
+    GtkWidget *HatText;
+    GtkWidget *HeaderText;
+    GtkWidget *InfoText;
+    GtkWidget *AlwaysOpenCheck;
+
+    GtkWidget *CloseButton;
+    GtkWidget *AcceptButton;
+} documentation_confirmation_window;
+
+main_window *setup_window();
\ No newline at end of file
diff --git a/source/ubl-strings.h b/source/ubl-strings.h
new file mode 100644
index 0000000..e8136b9
--- /dev/null
+++ b/source/ubl-strings.h
@@ -0,0 +1,53 @@
+#define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL)
+#define HELP_LABEL yon_char_unite(_("ubl-settings-system version:")," ", version_application,"\n",_("System configuration"),"\n",_("Usage:"), " ubl-settings-system ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n",NULL)
+
+#define TITLE_LABEL _("System configuration")
+#define TITLE_INFO_LABEL _("System basic parameters configuration")
+
+#define SUCCESS_LABEL _("Operation succeeded")
+#define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked")
+
+#define ABOUT_LABEL _("About")
+#define DOCUMENTATION_LABEL _("Documentation")
+
+#define SAVE_LOCAL_LABEL _("Save to local configuration")
+#define SAVE_GLOBAL_LABEL _("Save to global configuration")
+#define SAVE_CONFIGURATION_LABEL _("Save configuration")
+#define SAVE_LABEL _("Save")
+
+#define LOAD_LOCAL_LABEL _("Load local configuration")
+#define LOAD_GLOBAL_LABEL _("Load global configuration")
+#define LOAD_LABEL _("Load")
+
+#define CANCEL_LABEL _("Cancel")
+
+#define HELP_TITLE_LABEL _("Would you like to read documentation in the Web?")
+#define HELP_INFO_LABEL _("You will be redirected to documentation website where documentation is\ntranslated and supported by community.")
+#define HELP_ALWAYS_OPEN_LABEL _("Always redirect to online documentation")
+#define OPEN_HELP_LABEL _("Open documentation")
+#define PROJECT_HOME_LABEL _("Project Home Page")
+#define NOTHING_CHOSEN_LABEL _("Nothing were chosen")
+
+
+#define GLOBAL_LOAD_SUCCESS_LABEL _("Global configuration loading succseeded.")
+#define LOCAL_LOAD_SUCCESS_LABEL _("Local configuration loading succseeded.")
+#define LOAD_FAILED_LABEL _("Config loading failed")
+
+#define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succseeded.")
+#define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succseeded.")
+#define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.")
+
+#define HOSTNAME_LABEL _("Hostname:")
+#define ID_LABEL _("Work station ID:")
+#define SYSTEM_LABEL _("System")
+#define RANDOM_LABEL _("Random")
+#define HARDWARE_LABEL _("Hardware")
+#define MANUAL_LABEL _("Manual")
+#define CONSOLE_LABEL _("Console")
+#define FONT_LABEL _("Console font:")
+#define LOCALE_LABEL _("Locale")
+#define LANGUAGE_LABEL _("Language:")
+
+#define DEFAULT_LABEL _("Default")
+
+#define COPY_SUCCESS_LABEL _("Machine ID has been copied")
\ No newline at end of file
diff --git a/source/ubl-utils.c b/source/ubl-utils.c
new file mode 100644
index 0000000..c5a6551
--- /dev/null
+++ b/source/ubl-utils.c
@@ -0,0 +1,2041 @@
+#include "ubl-utils.h"
+
+// dictionary functions
+
+/**yon_dictionary_new():
+ * [EN]
+ * Creates and returns empty dictionary
+ * [RU]
+ * Создаёт и возвращает пустой словарь.
+ */
+dictionary *yon_dictionary_new()
+{
+    dictionary *dict = malloc(sizeof(dictionary));
+    dict->data = NULL;
+    dict->key = NULL;
+    dict->next = NULL;
+    dict->prev = NULL;
+    dict->first = dict;
+    dict->data_type = DICTIONARY_OTHER_TYPE;
+    return dict;
+}
+
+/**yon_dictionary_copy(dictionary *dict)
+ * [EN]
+ * 
+ * [RU]
+ * Создаёт и возвращает копию элемента словаря [dict]
+*/
+dictionary *yon_dictinoary_copy(dictionary *dict){
+    dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data);
+    dct->data_type= dict->data_type;
+    return dct;
+}
+
+/**yon_dictionary_copy_deep(dictionary *dict)
+ * [EN]
+ * 
+ * [RU]
+ * Создаёт полную копию словаря [dict] и возвращает первый элемент
+*/
+dictionary *yon_dictionary_copy_deep(dictionary *dict){
+    dictionary *dct = NULL;
+    dictionary *newone=NULL;
+    for_dictionaries(dct,dict){
+        yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data);
+        newone->data_type=dct->data_type;
+    }
+    return newone->first;
+}
+
+/**int yon_dictionary_set_data(dictionary *dict, void *data)
+ * [EN]
+ * 
+ * [RU]
+ * Установить элементу словаря [dict] значение [data]
+*/
+int yon_dictionary_set_data(dictionary *dict, void *data){
+    dict->data=data;
+}
+
+/**int yon_dictionary_set_key(dictionary *dict, char *key)
+ * [EN]
+ * 
+ * [RU]
+ * Изменяет ключ элемента словаря [dict] на [key]
+*/
+int yon_dictionary_set_key(dictionary *dict, char *key){
+    dict->key=key;
+    return 1;
+}
+
+/** int yon_dictionary_set(dictionary *dict, char *key, void *data)
+ * [EN]
+ * 
+ * [RU]
+* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data] 
+*/
+int yon_dictionary_set(dictionary *dict, char *key, void *data){
+    dict->key=key;
+    dict->data=data;
+    return 1;
+}
+
+/**int yon_dictionary_empty(dictionary *dict)
+ * [EN]
+ * 
+ * [RU]
+ * Очищает элемент словаря [dict] от данных
+*/
+int yon_dictionary_empty(dictionary *dict){
+    dict->data=NULL;
+    dict->data_type=DICTIONARY_OTHER_TYPE;
+    return 1;
+}
+
+/**yon_dictionary_switch_to_last(dictionary **dict)
+ * [EN]
+ * 
+ * [RU]
+ * Переключает словарь [dict] на последний элемент.
+*/
+void yon_dictionary_switch_to_last(dictionary **dict)
+{
+    dictionary *dct=NULL, *dact=*dict;
+    for_dictionaries(dct,dact);
+}
+
+/**yon_dictionary_create_conneced(dictionary *targetdict)
+ * [EN]
+ * 
+ * [RU]
+ * Создаёт новый элемент словаря [targetdict]
+*/
+dictionary *yon_dictionary_append(dictionary *targetdict)
+{
+    targetdict = yon_dictionary_get_last(targetdict);
+    targetdict->next = yon_dictionary_new();
+    targetdict->next->prev = targetdict;
+    targetdict->next->first = targetdict->first;
+    targetdict->next->data_type = DICTIONARY_OTHER_TYPE;
+    return targetdict->next;
+}
+
+/**yon_dictionary_get_last(dictionary *dict)
+ * [EN]
+ * 
+ * [RU]
+ * Возвращает последний элемент словаря [dict].
+ * В отличае от yon_dictionary_switch_to_last()
+ * словарь [dict] остаётся на прежнем элементе.
+*/
+dictionary *yon_dictionary_get_last(dictionary *dict)
+{
+    if (dict->next){
+        dictionary *dct = NULL;
+        for_dictionaries(dct,dict);
+        return dct;
+    } else return dict;
+}
+
+/**yon_dictionary_switch_places(dictionary *dict, int aim)
+ * [EN]
+ * 
+ * [RU]
+ * Меняет элемент словаря [dict] местами с другим элементом.
+ * если [aim]<0 элемент меняется местами с левым элементом;
+ * если [aim]>0 элемент меняется местами с правым элементом;
+*/
+dictionary *yon_dictionary_swap(dictionary *dict, int aim)
+{
+    if (aim < 0)
+    {
+        if (dict->prev)
+        {
+            if (dict->prev->prev)
+            {
+                dictionary *next = dict->next, *prev = dict->prev, *preprev = prev->prev;
+                if (next)
+                {
+                    preprev->next = dict;
+                    dict->prev = preprev;
+                    dict->next = prev;
+                    prev->prev = dict;
+                    prev->next = next;
+                    next->prev = prev;
+                }
+                else
+                {
+                    preprev->next = dict;
+                    dict->prev = preprev;
+                    dict->next = prev;
+                    prev->prev = dict;
+                    prev->next = NULL;
+                }
+                return prev;
+            }
+            else
+            {
+                dictionary *next = dict->next, *prev = dict->prev;
+                if (next)
+                {
+                    yon_dictionary_make_first(dict);
+                    dict->prev = NULL;
+                    dict->next = prev;
+                    prev->prev = dict;
+                    prev->next = next;
+                    next->prev = prev;
+                }
+                else
+                {
+                    dict->prev = NULL;
+                    dict->next = prev;
+                    prev->prev = dict;
+                    prev->next = NULL;
+                }
+                return prev;
+            }
+        }
+    }
+    else if (aim > 0)
+    {
+        if (dict->next)
+        {
+            if (dict->next->next)
+            {
+                dictionary *next = dict->next, *prev = dict->prev, *afnext = next->next;
+                if (prev)
+                {
+                    prev->next = next;
+                    next->prev = prev;
+                    next->next = dict;
+                    dict->prev = next;
+                    dict->next = afnext;
+                    afnext->prev = dict;
+                }
+                else
+                {
+                    yon_dictionary_make_first(next);
+                    next->prev = NULL;
+                    next->next = dict;
+                    dict->prev = next;
+                    dict->next = afnext;
+                    afnext->prev = dict;
+                }
+                return next;
+            }
+            else
+            {
+                dictionary *next = dict->next, *prev = dict->prev;
+                if (prev)
+                {
+                    prev->next = next;
+                    next->prev = prev;
+                    next->next = dict;
+                    dict->prev = next;
+                    dict->next = NULL;
+                }
+                else
+                {
+                    next->prev = NULL;
+                    next->next = dict;
+                    dict->prev = next;
+                    dict->next = NULL;
+                }
+            }
+        }
+    }
+}
+
+/**yon_dictionary_make_first(dictionary *dict)
+ * [EN]
+ * 
+ * [RU]
+ * Устанавливает указатель первого элемента словаря [dict]
+ * на текущий элемент. Не использовать.
+*/
+void yon_dictionary_make_first(dictionary *dict)
+{
+    for (dictionary *dct = dict->first; dct != NULL; dct = dct->next)
+    {
+        dct->first = dict;
+    }
+}
+
+/**yon_dictionary_make_nth(dictionary *dict, int nth)
+ * [EN]
+ * 
+ * [RU]
+ * Перемещает элемент словаря [dict] на позицию [nth].
+*/
+void yon_dictionary_make_nth(dictionary *dict, int nth)
+{
+    dictionary *dct = dict->first;
+    for (int i = 0; i < nth; i++)
+    {
+        if (dct == NULL)
+            return;
+        else
+            dct = dct->next;
+    }
+    yon_dictionary_rip(dict);
+    dictionary *prev = dct->prev;
+    prev->next = dict;
+    dict->prev = prev;
+    dict->next = dct;
+    dct->prev = dict;
+}
+
+/**yon_dictionary_create_with_data(char *key, void *data)
+ * [EN]
+ * 
+ * [RU]
+ * Создаёт новый словарь с ключом [key] и указателем на данные [data] 
+*/
+dictionary *yon_dictionary_new_with_data(char *key, void *data)
+{
+    dictionary *dct = yon_dictionary_new();
+    dct->key = yon_char_new(key);
+    dct->data = data;
+    dct->data_type = DICTIONARY_OTHER_TYPE;
+    return dct;
+}
+
+/** void *yon_dictionary_free_all(dictionary *dictionary,void *data_manipulation)
+ * [EN]
+ * Frees whole [dictionary] and activates [data_manipulation] function if not NULL with [dictionary]->data argument for each dictionary.
+ * [RU]
+ * Освобождает память для всех элементов словаря [dictionary] и активирует функцию [data_manipulation], если она была передана, с аргументом [dictionary]->data на каждый элемент словаря.
+*/
+void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipulation)(void*)){
+    dictionary *dict=NULL;
+    for_dictionaries(dict,dictionary_to_free){
+        if(data_manipulation)
+            data_manipulation(dict->data);
+        if(dict->prev)
+            free(dict->prev);
+    }
+    free(dict);
+    return NULL;
+}
+
+/**yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data)
+ * [EN]
+ * 
+ * [RU]
+ * Создаёт новый элемент словаря, присоединяемый в конец словаря [dict]
+ * с ключом [key] и указателем на данные [data]
+*/
+dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data)
+{
+    dictionary *dct = yon_dictionary_append(dict);
+    dct->key = yon_char_new(key);
+    dct->data = data;
+    dct->data_type = DICTIONARY_OTHER_TYPE;
+    return dct;
+}
+
+/**yon_dictionary_connect(dictionary *old, dictionary *toconnect)
+ * [EN]
+ * 
+ * [RU]
+ * Присоединяет словарь [toconnect] в конец словаря [old].
+*/
+dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect)
+{
+    dictionary *dict = yon_dictionary_get_last(old);
+    dict->next = toconnect;
+    toconnect->prev = dict;
+    toconnect->first = dict->first;
+    return toconnect;
+}
+
+/**yon_dictionary_get(dictionary **dict, char *key)
+ * [EN]
+ * 
+ * [RU]
+ * Возвращает элемент словаря [dict] с ключом [key].
+ * Если такого элемента не было обнаружено, возвращается NULL 
+*/
+dictionary *yon_dictionary_get(dictionary **dict, char *key)
+{
+    dictionary *dct = *dict;
+    for (dictionary *pointer = dct->first; pointer != NULL; pointer = pointer->next)
+    {
+        if (strcmp(pointer->key, key) == 0)
+        {
+            *dict = pointer;
+            return pointer;
+        }
+    }
+    return NULL;
+}
+
+/**yon_dictionary_rip(dictionary *dict)
+ * [EN]
+ * 
+ * [RU]
+ * Вырезает элемент из словаря и возвращает вырезанный элемент.
+*/
+dictionary *yon_dictionary_rip(dictionary *dict)
+{
+    if (!dict->next&&!dict->prev) return NULL;
+    else if (!dict->next)
+    {
+        dictionary *prev = dict->prev;
+        if (prev)
+        {
+            prev->next = NULL;
+            return prev;
+        }
+        else
+            return dict;
+    }
+    else if (!dict->prev)
+    {
+        dictionary *next = dict->next;
+        if (next)
+        {
+            yon_dictionary_make_first(next);
+            next->prev = NULL;
+            return next;
+        }
+        else
+            return dict;
+    }
+    else
+    {
+        dictionary *next = dict->next, *prev = dict->prev;
+        next->prev = prev;
+        prev->next = next;
+        return next;
+    }
+}
+
+/**yon_dictionary_get_nth(dictionary *dict, int place)
+ * [EN]
+ * 
+ * [RU]
+ * Возвращает [place]-й элемент словаря [dict]
+*/
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place)
+{
+    if (dict){
+        dict = dict->first;
+        int i = 0;
+        for (i = 0; i < place; i++)
+            if (dict->next)
+                dict = dict->next;
+            else
+                break;
+        if (i == place)
+            return dict;
+        else
+            return NULL;
+    } else return NULL;
+}
+
+// char functions
+
+int yon_char_find_last(char *source, char find){
+    int size = strlen(source);
+    int i=size;
+    for (;source[i]!=find&&i>0;i--);
+    return i;
+}
+
+/**[EN]
+ * 
+ * creates new char string by combining two char strings.
+ */
+char *yon_char_append(char *source, char *append)
+{
+    if (source && append)
+    {
+        int size = strlen(source) + strlen(append) + 1;
+        char *final = malloc(size);
+        memset(final, 0, size);
+        if (strstr(source, "%%"))
+            sprintf(final, source, append);
+        else
+            sprintf(final, "%s%s", source, append);
+        return final;
+    }
+    else
+        return NULL;
+}
+
+/**[EN]
+ * 
+ * creates new char string by copying another char.
+ */
+char *yon_char_new(char *chr)
+{
+    if (chr){
+        char *newchar = malloc(strlen(chr) + 1);
+        memset(newchar, 0, strlen(chr) + 1);
+        memcpy(newchar, chr, strlen(chr));
+        return newchar;
+    } else
+        return NULL;
+}
+
+/**yon_char_unite(char *source, ...)
+ * [En]
+ * 
+ * [RU]
+ * Объединяет строку [source] со всеми строками, написанными в [...]
+*/
+char *yon_char_unite(char *source, ...){
+    va_list arglist;
+    char *new_char=NULL;
+    char *unite_char=NULL;
+    new_char=yon_char_new(source);
+    va_start(arglist,source);
+    unite_char = va_arg(arglist,char*);
+    while(unite_char){
+        new_char = yon_char_append(new_char,unite_char);
+        unite_char = va_arg(arglist,char*);
+    }
+    va_end(arglist);
+    return new_char;
+}
+
+/**yon_cut(char *source, int size, int startpos)
+ * [EN]
+ * cuts source string by size length from startpos position.
+ */
+char *yon_cut(char *source, int size, int startpos)
+{
+    char *cut = NULL;
+    cut = malloc(size + 1);
+    memset(cut, 0, size + 1);
+    memcpy(cut, source + startpos, size);
+    return cut;
+}
+
+/**yon_char_divide(char *source, int dividepos)
+ * [EN]
+ * divides source string in dividepos position,
+ * returning left part of divided string and
+ * inserting right part to source string.
+ */
+char *yon_char_divide(char *source, int dividepos)
+{
+    char *cut = malloc(dividepos + 1);
+    memset(cut, 0, dividepos + 1);
+    memcpy(cut, source, dividepos);
+    char *left = malloc(strlen(source) - strlen(cut));
+    memset(left, 0, strlen(source) - strlen(cut));
+    memcpy(left, source + dividepos + 1, (strlen(source) - dividepos));
+    memset(source, 0, strlen(source));
+    memcpy(source, left, strlen(left));
+    return cut;
+}
+
+/**yon_char_find_count(char *source, char *find)
+ * [EN]
+ * 
+ * [RU]
+ * Считает количество символов [find] в строке [source]
+*/
+int yon_char_find_count(char *source, char *find){
+    char *working_string=yon_char_new(source);
+    int i=0;
+    int size=0;
+    int pos=0;
+    config_str rtn = yon_char_parse(working_string,&size,"\n");
+    for (int j=0;j= 10; i++)
+    {
+        convert_check = convert_check / 10;
+    }
+    char *ch = g_malloc0(i * sizeof(char) + 1);
+    sprintf(ch, "%d", int_to_convert);
+    return ch;
+}
+
+/**yon_char_replace(char *source, char *find, char*replace)
+ * [EN]
+ * 
+ * [RU]
+ * Заменяет в строке [source] все вхождения строки [find] на [replace]
+*/
+char *yon_char_replace(char *source, char *find, char*replace){
+    if (!strstr(replace,find)){
+
+
+        char *final=NULL;
+        char *temp=NULL;
+        if(!strstr(replace,find)){
+            while ((final=strstr(source,find))){
+                temp=malloc(strlen(source)-strlen(final));
+                memset(temp,0,strlen(source)-strlen(final)+strlen(replace));
+                memcpy(temp,source,strlen(source)-strlen(final));
+                temp=yon_char_append(temp,replace);
+                source=yon_char_append(temp,final+1);
+            }
+            
+        }
+    }
+    return source;
+}
+
+/**yon_char_parse(char *parameters, int *size, char *divider)
+ * [EN]
+ * Parses string [parameters], divided by [divider],
+ * then returns parsed string array and sets [size] to
+ * size of returned array
+*/
+char **yon_char_parse(char *parameters, int *size, char *divider){
+    char **string=NULL;
+    int i=1;
+    string=malloc(sizeof(char*));
+    char *paramline=yon_char_new(parameters);
+    char *param;
+    while ((param=yon_char_divide_search(paramline,divider,1))){
+        string=realloc(string,sizeof(char*)*i);
+        string[i-1]=yon_char_new(param);
+        i++;
+        if (strcmp(param,paramline)==0) break;
+    }
+    string=realloc(string,sizeof(char*)*i);
+        string[i-1]=yon_char_new(paramline);
+        i++;
+    // printf("%d\n",i);
+    *size=i-1;
+    return string;
+
+}
+
+/**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete)
+ * [EN]
+ * 
+ * [RU]
+ * Удаляет элемент [item_to_delete] из массива строк [char_string], размера [size]
+ * Возвращает получившийся массив, в [size] загружается размер нового массива.
+*/
+char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete){
+    char **new_char_parsed=NULL;
+    new_char_parsed=malloc(sizeof(char*)*((*size)-1));
+    int flag = 0;
+    for (int i=0;i < (*size);i++){
+        if (i==item_to_delete) {
+            flag = 1;
+        }
+        if (flag == 0) {
+            new_char_parsed[i]=yon_char_new(char_string[i]);
+        }
+        else if (flag == 1 && i!=item_to_delete) {
+            new_char_parsed[i-1]=yon_char_new(char_string[i]);
+        }
+    }
+    (*size)=(*size)-1;
+    return new_char_parsed;
+}
+
+/**yon_char_parsed_check_exist(char **parameters, int size, char *param)
+ * [EN]
+ * Checks if [parameters] string array of length [size]
+ * has [param] element;
+ * [RU]
+ * Проверяет есть ли в массиве строк [parameters], размера [size]
+ * элемент [param]
+*/
+int yon_char_parsed_check_exist(char **parameters, int size, char *param){
+    
+    for (int i=0;id_name);
+            file = fopen(path, "r");
+            if (strlen(de->d_name) > 9)
+            {
+                char *extension = strstr(path, ".");
+                if (extension != NULL)
+                {
+                    if (strcmp(extension, ".desktop") == 0)
+                    {
+                        apps tempapp;
+                        GKeyFile *gfile = g_key_file_new();
+                        GError *err = NULL;
+                        g_key_file_load_from_file(gfile, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL);
+                        char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", &err);
+                        if (err)
+                        {
+                            printf("%s\n", err->message);
+                        }
+                        if (strcmp(Type, "Application") == 0)
+                            tempapp.Type = 1;
+                        else if (strcmp(Type, "pyApplication") == 0)
+                            tempapp.Type = 2;
+                        else
+                            continue;
+                        tempapp.Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL);
+                        if (tempapp.Name == NULL)
+                            continue;
+                        tempapp.Categories = g_key_file_get_string(gfile, "Desktop Entry", "Categories", NULL);
+                        if (tempapp.Categories == NULL)
+                            continue;
+                        tempapp.Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL);
+                        if (tempapp.Exec == NULL)
+                            continue;
+                        tempapp.Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL);
+                        if (tempapp.Icon == NULL)
+                            continue;
+                        tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "Pluggable", NULL);
+                        if (!tempapp.Pluggable)
+                            tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-XfcePluggable", NULL);
+                        if (tempapp.Pluggable)
+                            tempapp.DualPluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBLPluggable", NULL);
+                        if (g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBL-SettingsManager-Hidden", NULL) == 0)
+                            if (size == 0)
+                            {
+                                applist = (apps *)malloc(size + 1 * sizeof(apps));
+                                applist[0].Name = yon_char_new(tempapp.Name);
+                                applist[0].Categories = yon_char_new(tempapp.Categories);
+                                applist[0].Exec = yon_char_new(tempapp.Exec);
+                                applist[0].Icon = yon_char_new(tempapp.Icon);
+                                applist[0].Type = tempapp.Type;
+                                applist[0].Pluggable = tempapp.Pluggable;
+                                applist[0].DualPluggable = tempapp.DualPluggable;
+                                size++;
+                            }
+                            else
+                            {
+                                applist = (apps *)realloc(applist, (size + 1) * sizeof(apps));
+                                applist[size].Name = yon_char_new(tempapp.Name);
+                                applist[size].Categories = yon_char_new(tempapp.Categories);
+                                applist[size].Exec = yon_char_new(tempapp.Exec);
+                                applist[size].Icon = yon_char_new(tempapp.Icon);
+                                applist[size].Pluggable = tempapp.Pluggable;
+                                applist[size].DualPluggable = tempapp.DualPluggable;
+                                applist[size].Type = tempapp.Type;
+                                size++;
+                            }
+                    }
+                }
+            }
+        }
+    }
+    *sizef = size;
+    return applist;
+};
+
+void yon_apps_sort(apps *applist, int size)
+{
+    apps tmp;
+    if (size > 2)
+    {
+        for (int i = 1; i < size; i++)
+        {
+            for (int j = 1; j < size; j++)
+            {
+                if (strcmp(applist[j].Name, applist[j - 1].Name) < 0)
+                {
+                    tmp = applist[j];
+                    applist[j] = applist[j - 1];
+                    applist[j - 1] = tmp;
+                };
+            }
+        };
+    }
+};
+
+apps *yon_apps_get_by_name(apps *applist, char *name, int size)
+{
+    for (int i = 0; i < size; i++)
+    {
+        if (strcmp(applist[i].Name, name) == 0)
+            return &applist[i];
+    }
+    return NULL;
+};
+
+//config functions
+
+typedef struct yon_config_parameter
+{
+    char *key;
+    void *data;
+    struct yon_config_parameter *next;
+    struct yon_config_parameter *prev;
+    struct yon_config_parameter *first;
+    DICT_TYPE data_type;
+    int flag1;
+    char *section;
+} yon_config_parameter;
+
+yon_config_parameter *yon_config_parameter_new_with_data(char *key, void *data){
+    yon_config_parameter *param = yon_remalloc(NULL,sizeof(yon_config_parameter));
+    param->data=data;
+    param->data_type=DICTIONARY_CHAR_TYPE;
+    param->first=param;
+    param->flag1=0;
+    param->key=yon_char_new(key);
+    param->next=NULL;
+    param->prev=NULL;
+    param->section=NULL;
+    return param;
+}
+
+yon_config_parameter *yon_config_parameter_append_with_data(yon_config_parameter *dict, char *key, void *data){
+    yon_config_parameter *param = yon_config_parameter_new_with_data(key,data);
+    param->first=dict->first;
+    (param->prev)=(yon_config_parameter*)yon_dictionary_get_last((dictionary*)dict);
+    dict->next=param;
+    return param;
+}
+
+
+static yon_config_parameter *__yon__config__strings = NULL;
+#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE)
+#define for_config dictionary temp = NULL; for_dictionary(temp,(dictionary*)__yon__config__strings)
+#define yon_config_parameter_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_config_parameter_new_with_data(key,data); \
+                                                                        else dict=yon_config_parameter_append_with_data(dict,key,data);}
+
+/**yon_config_load_register(char *command)
+ * [EN]
+ * 
+ * [RU]
+ * Выполняет команду [command].
+ * Полученные данные парсятся и регистрируются в конфиг.
+*/
+int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...){
+    if (__yon__config__strings){
+        __yon__config__strings = yon_dictionary_free_all((dictionary*)__yon__config__strings,NULL);
+    }
+    va_list args;
+    va_start(args,parameter);
+    char *arg;
+    dictionary *sections = NULL;
+    {
+        if (sections&&yon_dictionary_get(§ions,section)) sections->data=(void*)yon_char_unite(yon_dictionary_get_data(sections,char*)," ",parameter,NULL);
+        else yon_dictionary_add_or_create_if_exists_with_data(sections,section,parameter);
+    }
+    while (arg=va_arg(args,char*)){
+        char *key = va_arg(args,char*);
+        if (sections&&yon_dictionary_get(§ions,arg)) sections->data=(void*)yon_char_unite(yon_dictionary_get_data(sections,char*)," ",key,NULL);
+        else yon_dictionary_add_or_create_if_exists_with_data(sections,arg,key);
+    }
+    char *command=NULL;
+    dictionary *dict;
+    for_dictionaries(dict,sections){
+        command = yon_char_unite(ubconfig_load_command,config_type==YON_CONFIG_GLOBAL ? " global get " : " system get ", dict->key," ", yon_dictionary_get_data(dict,char*),NULL);
+        FILE *output = popen(command, "r");
+        char **output_strings = NULL;
+        output_strings = malloc(sizeof(char*));
+        int i = 0;
+        char str[4096];
+        memset(str, 0, 4096);
+        while (fgets(str, 4096, output))
+        {
+            if (strcmp(str, "") != 0&& strcmp(str,"(null)\n")!=0)
+            {
+                char *key = yon_char_divide_search(str,"=",-1);
+                char *final_str=yon_char_divide_search(str,"\n",-1);
+                yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,yon_char_new(final_str));
+                __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE;
+                __yon__config__strings->section=dict->key;
+            }
+        }
+    }
+    check_config
+        return 1;
+    else return 0;
+}
+
+/**yon_config_remove_by_key(char *key)
+ * [EN]
+ * 
+ * [RU]
+ * Удаляет параметр конфига по ключу [key]
+*/
+int yon_config_remove_by_key(char *key){
+    check_config{
+        dictionary *dict = yon_dictionary_get((dictionary**)&__yon__config__strings,key);
+        if (dict){
+            ((yon_config_parameter*)dict)->flag1=-1;
+            return 1;
+        }else return 0;
+    }
+    return 0;
+}
+
+/**yon_config_remove_by_data(void *data)
+ * [EN]
+ * 
+ * [RU]
+ * Производит поиск по конфигу на наличие параметра со значением [data] и удаляет найденное значение из конфига. 
+*/
+int yon_config_remove_by_data(void *data){
+    check_config{
+        dictionary *dict = NULL;
+        for_dictionaries(dict,(dictionary*)__yon__config__strings){
+            if (dict->data==data){
+                yon_dictionary_rip(dict);
+                return 1;
+            }
+        }
+        return 0;
+    }
+    return 0;
+}
+
+/**yon_config_remove_element(char *key, char *deleted)
+ * [EN]
+ * 
+ * [RU]
+ * Удаляет элемент [deleted] из массива параметров с ключом [key] 
+*/
+int yon_config_remove_element(char *key, char *deleted){
+    check_config{
+        yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key);
+        char *data = (char*)dict->data;
+        char *found = strstr(data,deleted);
+        int size=strlen(data)-strlen(found)+1;
+        char *new_data = malloc(size);
+        memset(new_data,0,size);
+        if (strlen(found)!=strlen(deleted)){
+        memcpy(new_data,data,size-1);
+        new_data = yon_char_append(new_data,found+strlen(deleted)+1);
+        } else {
+        memcpy(new_data,data,size-2);
+        new_data = yon_char_append(new_data,found+strlen(deleted));
+        }
+        dict->data=(void*)(new_data);
+        dict->flag1=1;
+        return 1;
+    } else return 0;
+}
+
+/**yon_config_get_by_key(char *key)
+ * [EN]
+ * 
+ * [RU]
+ * Возвращает значение параметра конфига с ключом [key]
+*/
+void *yon_config_get_by_key(char *key){
+    check_config{
+        dictionary *dict = NULL;
+        for_dictionaries(dict, (dictionary*)__yon__config__strings){
+            if (strcmp(dict->key,key)==0){
+                return dict->data;
+            }
+        }
+    }
+    return NULL;
+}
+
+/**yon_config_get_key_by_data(char *data)
+ * [EN]
+ * 
+ * [RU]
+ * Возвращает ключ параметра конфига со значением [data].
+ * Если параметр с таким значением не найден, возвращается NULL
+*/
+char *yon_config_get_key_by_data(char *data){
+    check_config{
+        dictionary *dict = NULL;
+        for_dictionaries(dict, (dictionary*)__yon__config__strings){
+            if (strcmp(((char*)dict->data),data)==0){
+                return dict->key;
+            }
+        }
+    }
+    return NULL;
+}
+
+/**yon_config_set(char *key, void *data)
+ * [EN]
+ * 
+ * [RU]
+ * Производит поиск по конфигу и заменяет значение параметра с ключом [key] на новое значение [data];
+*/
+int yon_config_set(char *key, void *data){
+    check_config{
+    yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key);
+    dict->data=data;
+    dict->flag1=1;
+    return 1;
+    } else return 0;
+}
+
+
+/**yon_config_append(char *key, void *data)
+ * [EN]
+ * 
+ * [RU]
+ * Производит поиск по конфигу и дополняет значение параметра с ключом [key] значением [data];
+*/
+int yon_config_append(char *key, char *data){
+    check_config{
+        yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key);
+        if (strcmp(((char*)dict->data),"")!=0)
+            dict->data=(void*)(yon_char_unite((char*)dict->data," ",data,NULL));
+        else dict->data=(void*)data;
+        dict->flag1=1;
+        return 1;
+    } else return 0;
+}
+
+
+/**yon_config_clean()
+ * [EN]
+ * Erase all parameters from config;
+ * [RU]
+ * Удаляет все параметры из конфига;
+*/
+int yon_config_clean(){
+    check_config{
+        __yon__config__strings = (yon_config_parameter*)yon_dictionary_free_all((dictionary*)__yon__config__strings, NULL);
+        return 1;
+    }
+    else return 0;
+}
+
+/**yon_config_register(char *key, void *data)
+ * [EN]
+ * 
+ * [RU]
+ * Регистрирует новый параметр конфига.
+ * [key] - ключ параметра;
+ * [data] - значение параметра;
+*/
+void yon_config_register(char *key, char *config_section, void *data){
+    if (!__yon__config__strings||!yon_dictionary_get((dictionary**)&__yon__config__strings,key)){        
+        yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,data);
+    }
+    else if (yon_dictionary_get((dictionary**)&__yon__config__strings,key)) __yon__config__strings->data=data;
+    __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE;
+    __yon__config__strings->flag1=1;
+    __yon__config__strings->section=yon_char_new(config_section);
+}
+
+/**yon_config_load(char *command, int *str_len)
+ * [EN]
+ * 
+ * [RU]
+ * Выполняет команду [command] и возвращает распаршеный результат выполнения команды.
+ * В [str_len] возвращается длина возвращаемого массива
+*/
+config_str yon_config_load(char *command, int *str_len){
+    FILE *output = popen(command, "r");
+    char **output_strings = NULL;
+    output_strings = malloc(sizeof(char));
+    int i = 0;
+    char str[4096];
+    memset(str, 0, 4096);
+    while (fgets(str, 4096, output))
+    {
+        if (strcmp(str, "") != 0)
+        {
+            output_strings = realloc(output_strings, sizeof(char *) * (i + 1));
+            output_strings[i] = NULL;
+            output_strings[i] = yon_char_new(str);
+            memset(str, 0, 4096);
+            i++;
+        }
+    }
+    if (i>0){
+    *str_len = i;
+    return output_strings;
+    } else{
+        *str_len=-1;
+        return NULL;
+    }
+}
+
+/**int yon_config_save_registered(char *path, char *section)
+ * [EN]
+ * Saves config with [command]
+ * [RU]
+ * Выполняет команду [command], добавляя в конец все записи конфига в таком виде:
+ * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]"
+*/
+int yon_config_save_registered(char *path, char *section){
+    check_config{
+        dictionary *dct;
+        dictionary *sections_add=NULL;
+        dictionary *sections_remove=NULL;
+        for_dictionaries(dct,(dictionary*)__yon__config__strings){
+            if (dct->data&&strcmp(yon_dictionary_get_data(dct,char*),"")!=0){
+                if (((yon_config_parameter*)dct)->flag1==1){
+                    ((yon_config_parameter*)dct)->flag1=0;
+                    if (sections_add&&yon_dictionary_get(§ions_add,((yon_config_parameter*)dct)->section)) sections_add->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_add,char*)," ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL);
+                    else yon_dictionary_add_or_create_if_exists_with_data(sections_add,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", ((yon_config_parameter*)dct)->section, " ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL));
+                } else if (((yon_config_parameter*)dct)->flag1==-1){
+                    ((yon_config_parameter*)dct)->flag1=0;
+                    if (sections_remove&&yon_dictionary_get(§ions_remove,((yon_config_parameter*)dct)->section)) sections_remove->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_remove,char*)," ",dct->key,NULL);
+                    else yon_dictionary_add_or_create_if_exists_with_data(sections_remove,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " remove ", ((yon_config_parameter*)dct)->section, " ",dct->key,NULL));
+                }
+            }
+        }
+        if (sections_add)
+        for_dictionaries(dct,sections_add){
+            char *command = yon_dictionary_get_data(dct,char*);
+            yon_launch(command);
+        }
+        if (sections_remove)
+        for_dictionaries(dct,sections_remove){
+            char *command = yon_dictionary_get_data(dct,char*);
+            yon_launch(command);
+        }
+
+
+        // char *command = yon_char_unite(ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", section, " ", yon_dictionary_get_data(dct,char*),NULL);
+        // char *remove_command = yon_char_unite(ubconfig_save_command, path ? yon_char_append(" --target ",path):"", " remove "," ", yon_dictionary_get_data(dct,char*), section,NULL);
+        // dictionary *dict = NULL;
+        // int any_add = 0;
+        // int any_remove = 0;
+        // for_dictionaries(dict,(dictionary*)__yon__config__strings){
+        //         char *data = yon_dictionary_get_data(dict,char*);
+        //         if (((yon_config_parameter*)dict)->flag1==1&&strcmp(data,"")!=0){
+        //             command = yon_char_unite(command, " ", dict->key,"=\"", yon_dictionary_get_data(dict,char*),"\"", NULL);
+        //             any_add=1;
+        //         }
+        //         if (strcmp(data,"")==0){
+        //             remove_command = yon_char_unite(remove_command, " ", dict->key, NULL);
+        //             any_remove=1;
+        //         }
+        // }
+        // if (any_add) yon_launch(command);
+        // if (any_remove) yon_launch(remove_command);
+        return 1;
+    } else return 1;
+}
+
+/**yon_config_get_all(int *size)
+ * [EN]
+ * 
+ * [RU]
+ * Возвращает массив со всеми параметрами конфига, оканчивающаяся NULL
+ * [size] - указатель, в который выгружается длина массива
+*/
+config_str yon_config_get_all(int *size){
+    check_config{
+        *size = 1;
+        config_str conf = NULL; 
+        dictionary *dict = NULL;
+        for_dictionaries(dict,(dictionary*)__yon__config__strings){
+            conf = yon_remalloc(conf,sizeof(char*)*(*size));
+            conf[(*size)-1] = yon_char_unite(dict->key,"=",(char*)dict->data,NULL);
+            (*size)++;
+        }
+        conf = yon_remalloc(conf,sizeof(char*)*(*size));
+        conf[*size-1] = NULL;
+        return conf;
+    } else return NULL;
+}
+
+/**char *yon_config_get_parameter(config parameters, int size, char *param)
+ * [EN]
+ * Gets parameter [param] from parameter list [parameters] of size [size];
+ * or NULL if nothing were found
+ * [RU] 
+ * Возвращает параметр [param] из массива строк [parameters] размером [size]
+ * или NULL если такой не был найден
+*/
+char *yon_config_get_parameter(config_str parameters, int size, char *param)
+{
+    if (param[0]==' ')
+        yon_char_divide_search(param," ",-1);
+    param=yon_char_divide_search(yon_char_new(param)," ",-1);
+    
+    char *str = NULL;
+    for (int j = 0; j < size; j++)
+    {
+        char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1);
+        if (name)
+        {
+            if (strcmp(name, param) == 0)
+            {
+                str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1);
+                if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0)
+                    return str;
+                else
+                    return NULL;
+            }
+        }
+    }
+    return NULL;
+}
+
+
+
+// terminal-using functions
+
+/**yon_launch_app_with_arguments(char *name, char *args)
+ * [EN]
+ * Execute [command] in separate thread;
+ * [RU]
+ * Выполнить команду [command] в отдельном потоке;
+*/
+int yon_launch_app_with_arguments(char *name, char *args)
+{
+    char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL);
+    pthread_t thread_id;
+    char *command = NULL;
+    command = path;
+    pthread_create(&thread_id, NULL, (void *)yon_launch, command);
+};
+
+/**yon_launch(char *command)
+ * [EN]
+ * Execute command [command]
+ * [RU]
+ * Выполнить команду [command]
+*/
+void yon_launch(char *command)
+{
+    system(command);
+}
+
+// Gtk functions
+
+
+#ifdef __GTK_H__
+
+
+static render_data render;
+
+#ifdef VTE_TERMINAL
+
+static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data)
+{
+    if (!terminal) return;
+    if (pid == -1) printf("Error\n\n\n");
+    else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data));
+}
+
+/**
+ * void yon_terminal_integrated_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument)
+ * [EN]
+ * launches terminal with specific [command],
+ * terminal is shown in [place_to_show] container,
+ * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument.
+ * [RU]
+ * Запускает терминал с командой [command],
+ * терминал добавляется в контейнер [place_to_show] виджета,
+ * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument].
+*/
+void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument){
+    char **commands=new_arr(char*,2);
+    gchar **envp = g_get_environ();
+    commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL"));
+    commands[1]=NULL;
+    char **env=new_arr(char*,2);
+    env[0]="";
+    env[1]=NULL;
+    GtkWidget *terminal = vte_terminal_new();
+    vte_terminal_set_size(VTE_TERMINAL(terminal),10,15);
+    VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL);
+    vte_terminal_set_pty(VTE_TERMINAL(terminal),pty);
+    gtk_container_add(GTK_CONTAINER(place_to_show),terminal);
+    char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command,"  ; sleep 5;exit 0","\n",NULL); 
+    printf("%s\n",install_command);
+    if(endwork_function)
+        g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument);
+     vte_terminal_spawn_async(VTE_TERMINAL(terminal),
+        VTE_PTY_DEFAULT,
+        NULL,   
+        commands,   
+        NULL,  
+        0,      
+        NULL, NULL,
+        NULL,   
+        -1, 
+        NULL, 
+        child_ready,    
+        install_command); 
+    vte_pty_spawn_async(pty,
+        NULL,        
+        commands,      
+        NULL,         
+        0,            
+        NULL, NULL,   
+        NULL,         
+        -1,           
+        NULL,         
+        NULL,           
+        NULL);        
+        vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1);
+        vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE);
+        vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE);
+        gtk_widget_show_all(terminal);
+    }
+
+/**yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument)
+ * [EN]
+ * launches terminal with specific [command],
+ * terminal is shown in [place_to_show] container,
+ * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument.
+ * [RU]
+ * Запускает терминал с командой [command],
+ * терминал добавляется в контейнер [place_to_show] виджета,
+ * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument].
+*/
+void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument){
+    char **commands=new_arr(char*,2);
+    gchar **envp = g_get_environ();
+    commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL"));
+    commands[1]=NULL;
+    char **env=new_arr(char*,2);
+    env[0]="";
+    env[1]=NULL;
+    vte_terminal_set_size(VTE_TERMINAL(terminal),10,15);
+    VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL);
+    vte_terminal_set_pty(VTE_TERMINAL(terminal),pty);
+    char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command,"  ; sleep 5;exit 0","\n",NULL); 
+    if(endwork_function)
+        g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument);
+     vte_terminal_spawn_async(VTE_TERMINAL(terminal),
+        VTE_PTY_DEFAULT,
+        NULL,   
+        commands,   
+        NULL,  
+        0,      
+        NULL, NULL,
+        NULL,   
+        -1, 
+        NULL, 
+        child_ready,    
+        install_command); 
+    vte_pty_spawn_async(pty,
+        NULL,        
+        commands,      
+        NULL,         
+        0,            
+        NULL, NULL,   
+        NULL,         
+        -1,           
+        NULL,         
+        NULL,           
+        NULL);        
+        vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100);
+        vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE);
+        vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE);
+        gtk_widget_show_all(terminal);
+    }
+#endif
+
+    // Window config functions
+
+    #define check_window_config_setup if(__yon_window_config_target_window)
+
+    typedef struct {
+        char *parameter_name;
+        enum YON_TYPE containing_type;
+        GtkWidget *track_widget;
+        char *property_name;
+    } __yon_listener_parameter;
+
+    typedef struct {
+        char *parameter_name;
+        char *section;
+        enum YON_TYPE containing_type;
+        void *property;
+    } __yon_custom_parameter;
+
+    struct {
+        int x;
+        int y;
+        int width;
+        int height;
+        int fullscreen;
+        dictionary *custom_listeners;
+        dictionary *custom_parameters;
+        dictionary *deleted_parameters;
+    } __yon_main_window_config;
+    
+    static GtkWindow *__yon_window_config_target_window = NULL;
+    static GKeyFile *__yon_window_config_file = NULL;
+    static char *__yon_window_config_path = NULL;
+
+    void yon_window_config_save(){
+            g_key_file_set_integer(__yon_window_config_file,"window","WindowPosX",__yon_main_window_config.x);
+            g_key_file_set_integer(__yon_window_config_file,"window","WindowPosY",__yon_main_window_config.y);
+            g_key_file_set_integer(__yon_window_config_file,"window","WindowWidth",__yon_main_window_config.width);
+            g_key_file_set_integer(__yon_window_config_file,"window","WindowHeight",__yon_main_window_config.height);
+            g_key_file_set_integer(__yon_window_config_file,"window","fullscreen",__yon_main_window_config.fullscreen);
+        dictionary *dict=NULL;
+        if (__yon_main_window_config.custom_listeners)
+        for_dictionaries(dict,__yon_main_window_config.custom_listeners){
+            __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*);
+            GValue *val = g_malloc0(sizeof(GValue));
+            g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val);
+            switch(param->containing_type){
+                case YON_TYPE_STRING:
+                    g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val));
+                    break;
+                case YON_TYPE_INT:
+                    g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val));
+                    break;
+                case YON_TYPE_BOOLEAN:
+                    g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val));
+                    break;
+                case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break;
+            }
+        }
+        if (__yon_main_window_config.custom_parameters)
+        for_dictionaries(dict,__yon_main_window_config.custom_parameters){
+            __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*);
+            switch (param->containing_type){
+                case YON_TYPE_STRING:
+                    g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property);
+                    break;
+                case YON_TYPE_INT:
+                    g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property);
+                    break;
+                case YON_TYPE_BOOLEAN:
+                    g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property);
+                    break;
+                default:
+                    break;
+            }
+        }
+        if (__yon_main_window_config.deleted_parameters)
+        for_dictionaries(dict,__yon_main_window_config.deleted_parameters){
+            __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*);
+            g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL);
+        }
+        g_key_file_save_to_file(__yon_window_config_file,__yon_window_config_path,NULL);
+    }
+
+    void yon_get_is_fullscreen(){
+        gtk_window_is_maximized(__yon_window_config_target_window);
+        __yon_main_window_config.fullscreen = gtk_window_is_maximized(__yon_window_config_target_window);
+        if (!__yon_main_window_config.fullscreen) gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); 
+    }
+
+    /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event)
+     * [EN]
+     * 
+     * [RU]
+     * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается.
+    */
+    void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){
+        check_window_config_setup{
+            yon_get_is_fullscreen();
+            yon_window_config_save();
+        }
+        gtk_main_quit();
+    }
+
+    void __yon_window_config_on_resize(){
+        int max=0;
+        max=gtk_window_is_maximized(__yon_window_config_target_window);
+        if(max==0){
+            gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height); 
+            gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); 
+        }
+    }
+
+    /**yon_window_config_setup(GtkWindow *window)
+     * [EN]
+     * 
+     * [RU]
+     * Устанавливает указатель на окно для отслеживания его положения и размера
+    */
+    void yon_window_config_setup(GtkWindow *window){
+        __yon_window_config_target_window = window;
+        g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL);
+        g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL);
+    }   
+
+    void _yon_maximize(void *data){
+        g_usleep(G_USEC_PER_SEC/10);
+        if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window);
+    }
+    
+    /**yon_window_config_load(char *path)
+     * [EN]
+     * 
+     * [RU]
+     * Загружает конфиг окна и инициализирует отслеживание его параметров
+    */
+    int yon_window_config_load(char *path){
+        __yon_window_config_file = g_key_file_new();
+        __yon_window_config_path=yon_char_new(path);
+        if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){
+            struct stat st;
+            int size;
+            config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/");
+            char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL);
+            if (stat(path, &st) == -1) {
+                mkdir(path, 0777);
+            }
+            FILE *fp;
+            fp=fopen(__yon_window_config_path,"w");
+            fclose(fp);
+            g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL);
+        }
+        __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL);
+        __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL);
+        __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL);
+        __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL);
+        __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL);
+        dictionary *dict=NULL;
+        if (__yon_main_window_config.custom_listeners)
+        for_dictionaries(dict,__yon_main_window_config.custom_listeners){
+            __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*);
+            GValue *val = g_malloc0(sizeof(GValue));
+            g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val);
+            switch(param->containing_type){
+                case YON_TYPE_STRING:
+                    g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL));
+                    break;
+                case YON_TYPE_INT:
+                    g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL));
+                    break;
+                case YON_TYPE_BOOLEAN:
+                    gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL);
+                    g_value_set_boolean(val,res); 
+                    break;
+                default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break;
+            }
+            g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val);
+        }
+        if (__yon_main_window_config.width==0) __yon_main_window_config.width=800;
+        if (__yon_main_window_config.height==0) __yon_main_window_config.height=600;
+        gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height);
+        gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y);
+        pthread_t tid;
+        pthread_create(&tid,NULL,(void *)_yon_maximize,NULL);
+        return 1;
+    }
+
+    void yon_window_config_apply(){
+        dictionary *dict=NULL;
+        gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y);
+        gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height);
+    } 
+
+    config_str yon_window_config_get_section(char *section, gsize *size){
+        config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL);
+        return key;
+    }
+
+    /**yon_window_config_add_custom_parameter(GtkWidget *widget, char *param_name, char *widget_property)
+     * [EN]
+     * 
+     * [RU]
+     * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name].
+    */
+    void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){
+        __yon_listener_parameter *param = NULL;
+        param = yon_remalloc(param,sizeof(__yon_listener_parameter));
+        param->parameter_name = yon_char_new(param_name);
+        param->track_widget = widget;
+        param->property_name = yon_char_new(widget_property);
+        param->containing_type = val_type;
+        yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param);
+    }
+
+    void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){
+        __yon_custom_parameter *param = NULL;
+        param = yon_remalloc(param,sizeof(__yon_custom_parameter));
+        param->parameter_name = yon_char_new(param_name);
+        param->section=section;
+        param->property = tracked_value;
+        param->containing_type = val_type;
+        yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param);
+    }
+
+    void yon_window_config_erase_custom_parameter(char *param_name, char *section){
+        __yon_custom_parameter *param = NULL;
+        param = yon_remalloc(param,sizeof(__yon_custom_parameter));
+        param->parameter_name=param_name;
+        param->section=section;
+        yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param);
+    }
+
+GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){
+    GtkWidget *menu_item = gtk_menu_item_new();
+    gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom");
+    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
+    GtkWidget *label = gtk_label_new(buttonname);
+    GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON);
+    gtk_label_set_xalign(GTK_LABEL(label),0.0);
+    gtk_box_pack_start(GTK_BOX(box),image,0,0,5);
+    gtk_box_pack_start(GTK_BOX(box),label,0,0,5);
+    gtk_container_add(GTK_CONTAINER(menu_item),box);
+    gtk_widget_show_all(menu_item);
+    return menu_item;
+}
+
+GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){
+    GtkWidget *menu_item = gtk_menu_item_new();
+    gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop");
+    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
+    GtkWidget *label = gtk_label_new(buttonname);
+    GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON);
+    gtk_label_set_xalign(GTK_LABEL(label),0.0);
+    gtk_box_pack_start(GTK_BOX(box),image,0,0,5);
+    gtk_box_pack_start(GTK_BOX(box),label,0,0,5);
+    gtk_container_add(GTK_CONTAINER(menu_item),box);
+    gtk_widget_show_all(menu_item);
+    return menu_item;
+}
+
+
+// other Gtk functions
+
+/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size)
+ * [EN]
+ * 
+ * [RU]
+ * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size]
+*/
+int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){
+    if (combo&¶meters){
+        for (int i=0;i=0 ? 1 : 0);
+}
+
+void yon_gtk_widget_set_sensitive_from_toggle_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target){
+    gtk_widget_set_sensitive(target,!gtk_combo_box_get_active(toggle)>=0 ? 0 : 1);
+}
+
+void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path)
+{
+    gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head);
+    gtk_image_set_from_file(GTK_IMAGE(Image), image_path);
+}
+
+void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path)
+{
+    gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head);
+    gtk_image_set_from_resource(GTK_IMAGE(Image), image_path);
+}
+
+int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label)
+{
+    if(icon&&box&&label){
+        render.icon=icon;
+        render.box=box;
+        render.label=label;
+        return 1;
+    } else return 0;
+} 
+
+void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type)
+{
+    render_data data = render;
+    GtkIconTheme *ictheme = gtk_icon_theme_get_default();
+    GError *err = NULL;
+    if (err)
+    {
+        printf("%s\n", err->message);
+        g_error_free(err);
+    }
+    if (type == BACKGROUND_IMAGE_SUCCESS_TYPE||! type)
+    {
+        gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessError");
+        gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK");
+        gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
+    }
+    else if (type == BACKGROUND_IMAGE_FAIL_TYPE)
+    {
+        gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK");
+        gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessError");
+        gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
+    }
+    if (text)
+        gtk_label_set_text(GTK_LABEL(data.label), text);
+}
+
+void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type){
+    _yon_ubl_status_box_render(text,type);
+}
+
+/**yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id)
+ * [EN]
+ * Set up plugs for using with GtkSockets insine ubl-settings-manager.
+ * [main_window] is container widget, which holds main application functionality.
+ * [left_window] is container widget, which holds widgets, have to be shown at left part of ubl-settings-manager header.
+ * [right_window] is container widget, which holds widgets, have to be shown at right part of ubl-settings-manager header.
+ * [socket_main_id] is id of socket for [main_window].
+ * [socket_left_id] is id of socket for [left_window].
+ * [socket_right_id] is id of socket for [right_window].
+ * [RU]
+ * Настраивает плаги для работы с сокетами в утилите ubl-settings-manager.
+ * [main_window] - контейнер основного интерфейса приложения.
+ * [left_window] - контейнер для виджетов которые должны отображаться в левой части шапки ubl-settings-manager.
+ * [right_window] - контейнер для виджетов которые должны отображаться в правой части шапки ubl-settings-manager.
+ * [socket_main_id] - id сокета для [main_window].
+ * [socket_left_id] - id сокета для [left_window].
+ * [socket_right_id] - id сокета для [right_window].
+*/
+void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id){
+    if (main_window&&socket_main_id>-1){
+        gtk_widget_hide(gtk_widget_get_toplevel(main_window));
+        GtkWidget *plug_main=gtk_plug_new(socket_main_id);
+        GtkWidget *plug_left=NULL;
+        GtkWidget *plug_right=NULL;
+        GtkWidget *box=NULL;
+        g_signal_connect(G_OBJECT(plug_main), "destroy", G_CALLBACK(gtk_main_quit),NULL);
+        if (socket_left_id>-1&&left_window){
+            plug_left=gtk_plug_new(socket_left_id);
+            g_object_ref(left_window);
+            gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window);
+            gtk_container_add(GTK_CONTAINER(plug_left),left_window);
+        gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"primary-toolbar");
+        gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"button");
+        gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"opacited");
+        gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"color");
+        gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"noborder");
+            gtk_widget_show(plug_left);
+        }
+        else if (left_window){
+            if (box==NULL){
+                box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+                gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5);
+                gtk_box_reorder_child(GTK_BOX(main_window),box,0);
+                gtk_widget_show(box);
+            }
+            gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited");
+            gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window);
+            gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5);
+        }
+        if (socket_right_id>-1&&right_window){
+            plug_right=gtk_plug_new(socket_right_id);
+            g_object_ref(right_window);
+            gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window);
+            gtk_container_add(GTK_CONTAINER(plug_right),right_window);
+        gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"primary-toolbar");
+        gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"button");
+        gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"opacited");
+        gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"color");
+        gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"noborder");
+            gtk_widget_show(plug_right);
+        }
+        else if (right_window){
+            if (box==NULL){
+                box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+                gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5);
+                gtk_box_reorder_child(GTK_BOX(main_window),box,0);
+                gtk_widget_show(box);
+            }
+            gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited");
+            gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window);
+            gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5);
+        }
+        g_object_ref(main_window);
+        gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window);
+        gtk_container_add(GTK_CONTAINER(plug_main),main_window);
+        gtk_widget_show(plug_main);
+    }
+}
+
+#ifdef WEBKIT_FOUND
+
+/**yon_ubl_browser_window_open(char *link, char *browser_window_name)
+ * [EN]
+ * Launches integrated browser window, named [browser_window_name] at header with [link].
+ * [RU]
+ * Открывает встроенный браузер с именем [browser_window_name] и показываемой страницей по ссылке [link]
+*/
+void yon_ubl_browser_window_open(char *link, char *browser_window_name){
+    GtkWidget *browser=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    GtkWidget *web_place=gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
+    GtkWidget *header=gtk_header_bar_new();
+    GtkWidget *header_label=gtk_label_new(browser_window_name);
+    GtkWidget *WebView=webkit_web_view_new();
+    gtk_container_add(GTK_CONTAINER(browser),web_place);
+    gtk_window_set_titlebar(GTK_WINDOW(browser),header);
+    gtk_window_set_title(GTK_WINDOW(browser),browser_window_name);
+    gtk_widget_set_size_request(browser,800,600);
+    gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header),header_label);
+    gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header),1);
+    webkit_web_view_load_uri(WEBKIT_WEB_VIEW(WebView),link);
+    gtk_box_pack_start(GTK_BOX(web_place),WebView,1,1,0);
+    gtk_widget_show_all(browser);
+}
+#else
+
+/**yon_ubl_browser_window_open(char *link, char *browser_window_name)
+ * [EN]
+ * Launches browser with [link].
+ * [browser_window_name] is't used. It's needed for compatibility with webkit version of that function.
+ * [RU]
+ * Открывает браузер со страницей по ссылке [link]
+ * [browser_window_name] не используется. Нужна для совместимости с webkit версией этой функции.
+*/
+void yon_ubl_browser_window_open(char *link,  char *browser_window_name){
+        char *user=getenv("SUDO_USER");
+        if (!user)
+            user=getlogin();
+        char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL);
+        yon_launch_app(command);
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/source/ubl-utils.h b/source/ubl-utils.h
new file mode 100644
index 0000000..88222c1
--- /dev/null
+++ b/source/ubl-utils.h
@@ -0,0 +1,384 @@
+#ifndef UBL_UTILS
+#define UBL_UTILS
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "../compile/ubl-cmake.h"
+#ifdef WEBKIT_FOUND
+    #include 
+#endif 
+#define DesktopPath "/usr/share/applications/"
+
+#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next)
+
+#define new(type) malloc(sizeof(type))
+#define new_arr(type,size) malloc(sizeof(type)*size)
+
+#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL)
+
+
+#define hostname_parameter "HOSTNAME"
+#define id_parameter "MACHINEID"
+#define keyboard_layout_parameter "XkbLayout"
+#define console_font_parameter "CONSOLE_FONT"
+#define num_lock_boot_parameter "NUMLOCK"
+#define language_parameter "LANG"
+
+typedef enum
+{
+    #ifdef __GTK_H__
+    DICTIONARY_GTK_WIDGETS_TYPE,
+    #endif
+    DICTIONARY_OTHER_TYPE=0,
+    DICTIONARY_CHAR_TYPE,
+    DICTIONARY_INT_TYPE,
+    DICTIONARY_BOOL_TYPE,
+
+} DICT_TYPE;
+
+typedef struct dictionary
+{
+    char *key;
+    void *data;
+    struct dictionary *next;
+    struct dictionary *prev;
+    struct dictionary *first;
+    DICT_TYPE data_type;
+} dictionary;
+
+
+
+
+typedef struct apps
+{
+    char *Name;
+    int Type;
+    char *Categories;
+    char *Exec;
+    char *Icon;
+    int Pluggable;
+    int DualPluggable;
+} apps;
+
+typedef char** config_str;
+
+#define config(key) yon_config_get_by_key(key) 
+
+#define yon_remalloc(pointer, size) (!pointer) ? malloc(size) : realloc(pointer, size)
+// dictionary functions
+
+/**yon_dictionary_get_data(dictionary, type)
+ * [EN]
+ * Gets data from dictionary.
+ * [dictionary] is dictionary, from which data should be extracted;
+ * [type] is type of data, [dictionary] contains.
+ * [RU]
+ * Возвращает данные из словаря.
+ * [dictionary] - словарь из которого достаются данные.
+ * [type] - тип данных, хранящихся в словаре [dictionary].
+*/
+#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data)
+
+/**yon_dictionary_add_or_create_if_exists_with_data(dict,key,data)
+ * [EN]
+ * 
+ * [RU]
+ * Добавляет элемент словаря в конец словаря [dict] c ключом [key] и данными [data].
+ * Если словарь не существует, создаёт его 
+*/
+#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_new_with_data(key,data); \
+                                                                        else dict=yon_dictionary_append_with_data(dict,key,data);}
+
+dictionary *yon_dictionary_new();
+
+dictionary *yon_dictionary_append(dictionary *targetdict);
+
+dictionary *yon_dictionary_get_last(dictionary *dict);
+
+dictionary *yon_dictionary_swap(dictionary *dict, int aim);
+
+void yon_dictionary_make_first(dictionary *dict);
+
+void yon_dictionary_make_nth(dictionary *dict, int nth);
+
+dictionary *yon_dictionary_new_with_data(char *key, void *data);
+
+dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data);
+
+dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect);
+
+dictionary *yon_dictionary_get(dictionary **dict, char *key);
+
+dictionary *yon_dictionary_rip(dictionary *dict);
+
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place);
+
+void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(void*));
+
+// char functions
+
+int yon_char_find_last(char *source, char find);
+
+char *yon_char_append(char *source, char *append);
+
+char *yon_char_new(char *chr);
+
+char *yon_char_unite(char *source, ...);
+
+char *yon_cut(char *source, int size, int startpos);
+
+char *yon_char_divide(char *source, int dividepos);
+
+char *yon_char_divide_search(char *source, char *dividepos, int delete_divider);
+
+char *yon_char_from_int(int int_to_convert);
+
+char *yon_char_replace(char *source, char *find, char*replace);
+
+char **yon_char_parse(char *parameters, int *size, char *divider);
+
+char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete);
+
+int yon_char_parsed_check_exist(char **parameters, int size, char *param);
+
+int yon_char_find_count(char *source, char *find);
+
+int yon_char_parsed_includes_char_parsed (config_str source, config_str to_check, int source_size, int check_size);
+
+config_str yon_char_parsed_new (int *size, ...);
+
+void yon_char_parsed_copy(config_str *source, config_str *to_copy);
+
+config_str yon_char_parsed_append(config_str parsed, int *size, char *string);
+
+int yon_ubl_check_root();
+
+char *yon_ubl_root_user_get();
+
+char *yon_ubl_user_get_home_directory();
+
+// parsing functions
+
+config_str philos_list_user(int* size);
+
+apps *yon_apps_scan_and_parse_desktops(int *sizef);
+
+void yon_apps_sort(apps *applist, int size);
+
+apps *yon_apps_get_by_name(apps *applist, char *name, int size);
+
+//config functions
+
+#define ubconfig_save_command "ubconfig"
+#define ubconfig_load_command "ubconfig --source"
+
+typedef enum {
+    YON_CONFIG_LOCAL=0,
+    YON_CONFIG_GLOBAL,
+    YON_CONFIG_BOTH
+} YON_CONFIG_TYPE;
+
+config_str yon_config_load(char *command, int *str_len);
+
+int yon_config_save_registered(char *path, char *section);
+
+char *yon_config_get_parameter(config_str parameters, int size, char *param);
+
+int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...);
+
+int yon_config_remove_by_key(char *key);
+
+int yon_config_remove_by_data(void *data);
+
+int yon_config_remove_element(char *key, char *deleted);
+
+void *yon_config_get_by_key(char *key);
+
+char *yon_config_get_key_by_data(char *data);
+
+int yon_config_set(char *key, void *data);
+
+int yon_config_clean();
+
+void yon_config_register(char *key, char* config_section, void *data);
+
+config_str yon_config_get_all();
+
+// terminal-using functions
+
+int yon_launch_app_with_arguments(char *name, char *args);
+
+void yon_launch(char *command);
+
+// Gtk functions
+
+#ifdef __GTK_H__
+#ifdef VTE_TERMINAL
+void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument);
+
+void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument);
+
+#endif
+
+enum YON_TYPE{
+    YON_TYPE_STRING,
+    YON_TYPE_INT,
+    YON_TYPE_BOOLEAN,
+    YON_TYPE_OTHER
+};
+
+GtkWidget *yon_ubl_menu_item_about_new(char *buttonname);
+GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname);
+
+/**yon_gtk_builder_get_widget(builder, widget_name)
+ * [EN]
+ * Returns GtkWidget from GtkBuilder *[builder].
+ * [builder] is GtkBuilder*;
+ * [widget_name] is id of widget;
+*/
+#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name))
+
+typedef struct
+{
+    GtkWidget *Icon;
+    GtkWidget *Label;
+    GtkWidget *IconView;
+    GtkListStore *List;
+} expander_icon_view;
+
+void yon_window_config_setup(GtkWindow *window);
+
+int yon_window_config_load(char *path);
+
+config_str yon_window_config_get_section(char *section, gsize *size);
+
+void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type);
+
+void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type);
+
+void yon_window_config_erase_custom_parameter(char *param_name, char *section);
+
+int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size);
+
+int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find);
+
+int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment);
+
+int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
+
+int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
+
+
+void yon_gtk_widget_set_sensitive_from_toggle_button(GtkToggleButton *toggle, GtkWidget *target);
+void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *toggle, GtkWidget *target);
+void yon_gtk_widget_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target);
+void yon_gtk_widget_set_sensitive_from_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target);
+
+typedef enum
+{
+    BACKGROUND_IMAGE_SUCCESS_TYPE,
+    BACKGROUND_IMAGE_FAIL_TYPE
+} BACKGROUND_IMAGE_TYPE;
+
+typedef struct {
+    BACKGROUND_IMAGE_TYPE type;
+    GtkWidget *icon;
+    GtkWidget *box;
+    GtkWidget *label;
+    char* text_to_render;
+} render_data;
+
+
+/**yon_ubl_status_box_setup(render,icon,box,label)
+ * [EN]
+ * Sets up [render] structure of type render_data.
+ * [icon] is GtkImage widget of status box for showing status icons;
+ * [box] is GtkBox widget of status box for showing status color;
+ * [label] is GtkLabel widget of status box for showing status text;
+ * [RU]
+ * Настраивает структуру [render] типа render_data.
+ * [icon] - виджет типа GtkIcon в котором будут отображаться статусные иконки;
+ * [box] - виджет типа GtkBox в котором будет отображаться цвет статуса;
+ * [label] - виджет типа GtkLabel в котором будет отображаться текст статусного сообщения;
+*/
+int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label);
+
+/**yon_ubl_status_box_render(render,text,type)
+ * [EN]
+ * Renders message in status box;
+ * [render] is render_data structure of status box;
+ * [text] is text to be shown in status box;
+ * [type] if type of message. Can be BACKGROUND_IMAGE_FAIL_TYPE or BACKGROUND_IMAGE_SUCCESS_TYPE
+ * [RU]
+ * Отображает сообщение в статусном окне.
+ * [render] - структура типа render_data для нужного статусного окна;
+ * [text] - текст, отображаемый в статусном окне;
+ * [type] - тип сообщения. Может быть:
+ * BACKGROUND_IMAGE_FAIL_TYPE (красный фон,иконка - восклицательный знак)
+ * или
+ * BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка)
+*/
+void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type);
+
+#ifdef __cplusplus
+
+/**yon_ubl_header_setup(overlay, head, image, imag_path)
+ * [EN]
+ * Sets up header of app.
+ * [overlay] is overlay for app header;
+ * [head] is box of header, which connects to [overlay]
+ * [image] is header background image;
+ * [imag_path] is path of image, shown in [image] 
+ * [RU]
+ * Настраивает заголовок приложения.
+ * [overlay] - оверлей заголовка приложения;
+ * [head] - шапка заголовка, присоединяемая к [overlay]
+ * [image] - виджет картинки для заднего фона;
+ * [imag_path] - путь до картинки, загружаемой в [image] 
+*/
+#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()), GTK_WIDGET(head.gobj()), GTK_WIDGET(image.gobj()), (char *)imag_path)
+#else
+
+/**yon_ubl_header_setup(overlay, head, image, imag_path)
+ * [EN]
+ * Sets up header of app.
+ * [overlay] is overlay for app header;
+ * [head] is box of header, which connects to [overlay]
+ * [image] is header background image;
+ * [imag_path] is path of image, shown in [image] 
+ * [RU]
+ * Настраивает заголовок приложения.
+ * [overlay] - оверлей заголовка приложения;
+ * [head] - шапка заголовка, присоединяемая к [overlay]
+ * [image] - виджет картинки для заднего фона;
+ * [imag_path] - путь до картинки, загружаемой в [image] 
+*/
+#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
+#define yon_ubl_header_setup_resource(overlay, head, image, imag_path) _yon_ubl_header_setup_resource(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
+#endif
+
+void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
+
+void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
+
+void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id);
+#ifdef WEBKIT_FOUND
+
+void yon_ubl_browser_window_open(char *link, char *browser_window_name);
+#else
+void yon_ubl_browser_window_open(char *link,  char *browser_window_name);
+#endif
+#endif
+#endif
\ No newline at end of file
diff --git a/ubl-settings-system-banner.png b/ubl-settings-system-banner.png
new file mode 100644
index 0000000..8eb67cb
Binary files /dev/null and b/ubl-settings-system-banner.png differ
diff --git a/ubl-settings-system-layouts.glade b/ubl-settings-system-layouts.glade
new file mode 100644
index 0000000..6853c3b
--- /dev/null
+++ b/ubl-settings-system-layouts.glade
@@ -0,0 +1,141 @@
+
+
+
+  
+  
+  
+  
+  
+
diff --git a/ubl-settings-system.css b/ubl-settings-system.css
new file mode 100644
index 0000000..88e8c57
--- /dev/null
+++ b/ubl-settings-system.css
@@ -0,0 +1,114 @@
+
+.thin {
+	margin:0px;
+	padding:0px;
+}
+.noborder {
+	border:none;
+}
+.nobackground {
+background:transparent;
+}
+.nobackground:active {
+background:transparent;
+}
+.textHead{
+    text-shadow: 2px 2px @theme_bg_color;
+	color: @theme_text_color;
+}
+
+.inherited>* {
+	border:none;
+	background:inherit;
+}
+.workingbg {
+	background:@theme_base_color;
+}
+.menuitembottom{
+	margin-top:0px;
+	margin-bottom:3px;
+	border-color:inherit;
+	border-left-width:inherit;
+	border-right-width:inherit;
+  }
+  .menuitemmiddle{
+	margin-top:0px;
+	margin-bottom:0px;
+	border-color:inherit;
+	border-left-width:inherit;
+	border-right-width:inherit;
+  }
+  
+  .menuitemtop{
+	margin-bottom:0px;
+	border-color:inherit;
+	border-top-width:inherit;
+	border-left-width:inherit;
+	border-right-width:inherit;
+  }
+  .menuitemtop>*{
+	margin:2px 2px 0 2px;
+	padding: 3px 10px 3px 5px;
+	/* padding: 5px 0px 3px 5px; */
+	border:transparent;
+  }
+  .menuitemmiddle>*{
+	margin:0 2px 0 2px;
+	padding: 3px 10px 3px 5px;
+	/* padding: 3px 0px 3px 5px; */
+	border:transparent;
+  }
+  .menuitembottom>*{
+	margin:0 2px 2px 2px;
+	padding: 3px 10px 3px 5px;
+	/* padding: 3px 0px 5px 5px; */
+  }
+  .menuitemtop:hover {
+	background:@theme_bg_color;
+	border-color:inherit;
+	border-top-width:inherit;
+	border-left-width:inherit;
+	border-right-width:inherit;
+  }
+  .menuitemmiddle:hover {
+	background:@theme_bg_color;
+	border-color:inherit;
+	border-left-width:inherit;
+	border-right-width:inherit;
+  }
+  .menuitembottom:hover {
+	background:@theme_bg_color;
+	border-color:inherit;
+	border-bottom-width:0px;
+	border-left-width:inherit;
+	border-right-width:inherit;
+	
+  }
+  .menuitemtop:hover>* {
+	margin:2px 2px 0 2px;
+	padding: 3px 10px 3px 5px;
+	/* padding: 5px 0 3px 5px; */
+	background:@theme_selected_bg_color;
+	border-radius:2px;
+  }
+  .menuitemmiddle:hover>* {
+	margin:0 2px 0px 2px;
+	padding: 3px 10px 3px 5px;
+	/* padding: 3px 0px 3px 5px; */
+	background:@theme_selected_bg_color;
+	border-radius:2px;
+  }
+  .menuitembottom:hover>* {
+	margin:0 2px 2px 2px;
+	padding: 3px 10px 3px 5px;
+	/* padding: 3px 0px 5px 5px; */
+	background:@theme_selected_bg_color;
+	border-radius:2px;
+  }
+  .boxInfoMessError{
+    background-color: #ea9999;
+}
+
+.boxInfoMessOK{
+    background-color: #f3f0ac;
+}
\ No newline at end of file
diff --git a/ubl-settings-system.desktop b/ubl-settings-system.desktop
new file mode 100644
index 0000000..941293e
--- /dev/null
+++ b/ubl-settings-system.desktop
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=System configuration
+Name[ru]=TEMPLATE
+GenericName=ubl-settings-system
+GenericName[ru]=TEMPLATE
+Comment=System basic parameters configuration
+Comment[ru]=Приложение для TEMPLATE
+Type=Application
+Exec=pkexec ubl-settings-system
+Icon=com.ublinux.ubl-settings-system
+Terminal=false
+X-XfcePluggable=true
+X-UBLPluggable=true
+Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;X-UBL-SettingsManager;X-UBL-Personal-Settings;
diff --git a/ubl-settings-system.glade b/ubl-settings-system.glade
new file mode 100644
index 0000000..85456f4
--- /dev/null
+++ b/ubl-settings-system.glade
@@ -0,0 +1,1114 @@
+
+
+
+  
+  
+  
+  
+  
+  
+    False
+    False
+    True
+    center
+    com.ublinux.ubl-settings-system
+    dialog
+    True
+    ubl-settings-system
+    1.1
+    Copyright © 2022 - 2023, UBSoft LLC
+    System configuration
+    https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-system
+    Project Home Page
+    Это приложение распространяется без каких-либо гарантий.
+Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>.
+    UBGroup
+    UBGroup
+    com.ublinux.ubl-settings-system
+    True
+    gpl-2-0
+    
+      
+        True
+        False
+        vertical
+        2
+        
+          
+            False
+            end
+          
+          
+            False
+            False
+            1
+          
+        
+      
+    
+    
+      
+    
+  
+  
+  
+    
+      
+      
+      
+      
+    
+    
+      
+        Default
+         
+      
+    
+  
+  
+    True
+    False
+    edit-copy-symbolic
+  
+  
+    True
+    False
+    process-stop-symbolic
+  
+  
+    True
+    False
+    emblem-ok-symbolic
+  
+  
+    450
+    False
+    False
+    450
+    dialog-question-symbolic
+    
+      
+        True
+        False
+        5
+        5
+        5
+        5
+        vertical
+        10
+        
+          
+            True
+            False
+            
+              
+                True
+                False
+                start
+                20
+                20
+                dialog-question-symbolic
+                6
+              
+              
+                False
+                True
+                0
+              
+            
+            
+              
+                True
+                False
+                vertical
+                
+                  
+                  
+                    False
+                    True
+                    0
+                  
+                
+                
+                  
+                    True
+                    False
+                    start
+                    start
+                    10
+                    10
+                    You will be redirected to documentation website where documentation is
+translated and supported by community.
+                    True
+                    0
+                    
+                  
+                  
+                    False
+                    True
+                    1
+                  
+                
+                
+                  
+                    Always redirect to online documentation
+                    True
+                    True
+                    False
+                    end
+                    True
+                    
+                  
+                  
+                    False
+                    True
+                    end
+                    2
+                  
+                
+                
+              
+              
+                True
+                True
+                1
+              
+            
+            
+          
+          
+            True
+            True
+            0
+          
+        
+        
+          
+            True
+            False
+            30
+            True
+            
+              
+                Cancel
+                True
+                True
+                True
+                image8
+                
+              
+              
+                True
+                True
+                0
+              
+            
+            
+              
+                Open documentation
+                True
+                True
+                True
+                image9
+                
+              
+              
+                True
+                True
+                1
+              
+            
+          
+          
+            False
+            True
+            1
+          
+        
+      
+    
+    
+      
+    
+  
+  
+    
+      
+      
+      
+      
+    
+    
+      
+        Default
+         
+      
+    
+  
+  
+  
+  
+  
+    800
+    False
+    800
+    600
+    com.ublinux.ubl-settings-system
+    
+      
+        True
+        False
+        vertical
+        
+          
+            True
+            False
+            vertical
+            
+              
+                True
+                False
+                
+                  
+                    True
+                    False
+                    5
+                    5
+                    5
+                    5
+                    5
+                    5
+                    25
+                  
+                  
+                    False
+                    True
+                    0
+                  
+                
+                
+                  
+                    True
+                    False
+                    start
+                    5
+                    5
+                    5
+                    5
+                    6
+                    6
+                    True
+                    
+                      
+                      
+                    
+                  
+                  
+                    False
+                    True
+                    1
+                  
+                
+              
+              
+                False
+                True
+                0
+              
+            
+            
+              
+                True
+                False
+                vertical
+                
+                  
+                    81
+                    True
+                    False
+                    
+                      
+                        True
+                        False
+                        start
+                      
+                      
+                        -1
+                      
+                    
+                  
+                  
+                    False
+                    True
+                    0
+                  
+                
+              
+              
+                False
+                True
+                1
+              
+            
+            
+              
+                True
+                False
+                5
+                5
+                5
+                5
+                5
+                5
+                True
+                True
+                vertical
+                5
+                
+                  
+                    True
+                    False
+                    0.019999999552965164
+                    in
+                    
+                      
+                        True
+                        False
+                        5
+                        5
+                        5
+                        
+                          
+                            True
+                            False
+                            vertical
+                            5
+                            
+                              
+                                True
+                                False
+                                5
+                                
+                                  
+                                    True
+                                    False
+                                    Hostname:
+                                    True
+                                    0
+                                  
+                                  
+                                    False
+                                    True
+                                    0
+                                  
+                                
+                                
+                                  
+                                    True
+                                    True
+                                  
+                                  
+                                    True
+                                    True
+                                    1
+                                  
+                                
+                              
+                              
+                                False
+                                True
+                                0
+                              
+                            
+                            
+                              
+                                True
+                                False
+                                5
+                                
+                                  
+                                    True
+                                    False
+                                    Work station ID:
+                                    True
+                                    0
+                                  
+                                  
+                                    False
+                                    True
+                                    0
+                                  
+                                
+                                
+                                  
+                                    True
+                                    False
+                                    5
+                                    
+                                      
+                                        True
+                                        False
+                                        0
+                                        
+                                          - Default
 
+                                          - Random
 
+                                          - Hardware
 
+                                          - Manual
 
+                                        
+                                      
+                                      
+                                        False
+                                        True
+                                        0
+                                      
+                                    
+                                    
+                                      
+                                        True
+                                        True
+                                      
+                                      
+                                        True
+                                        True
+                                        1
+                                      
+                                    
+                                    
+                                      
+                                        True
+                                        True
+                                        True
+                                        image1
+                                        
+                                      
+                                      
+                                        False
+                                        True
+                                        2
+                                      
+                                    
+                                  
+                                  
+                                    True
+                                    True
+                                    1
+                                  
+                                
+                              
+                              
+                                False
+                                True
+                                1
+                              
+                            
+                          
+                        
+                      
+                    
+                    
+                      
+                        True
+                        False
+                        System
+                      
+                    
+                  
+                  
+                    False
+                    True
+                    0
+                  
+                
+                
+                  
+                    True
+                    False
+                    0.019999999552965164
+                    in
+                    
+                      
+                        True
+                        False
+                        5
+                        5
+                        5
+                        
+                          
+                            True
+                            False
+                            vertical
+                            5
+                            
+                              
+                                True
+                                False
+                                5
+                                
+                                  
+                                    True
+                                    False
+                                    Console font:
+                                    True
+                                    0
+                                  
+                                  
+                                    False
+                                    True
+                                    0
+                                  
+                                
+                                
+                                  
+                                    True
+                                    False
+                                    fontlist
+                                    0
+                                    
+                                      
+                                      
+                                        0
+                                      
+                                    
+                                  
+                                  
+                                    True
+                                    True
+                                    1
+                                  
+                                
+                              
+                              
+                                False
+                                True
+                                1
+                              
+                            
+                          
+                        
+                      
+                    
+                    
+                      
+                        True
+                        False
+                        Console
+                      
+                    
+                  
+                  
+                    False
+                    True
+                    1
+                  
+                
+                
+                  
+                    True
+                    False
+                    0.019999999552965164
+                    in
+                    
+                      
+                        True
+                        False
+                        5
+                        5
+                        5
+                        
+                          
+                            True
+                            False
+                            5
+                            
+                              
+                                True
+                                False
+                                Language:
+                                True
+                                0
+                              
+                              
+                                False
+                                True
+                                0
+                              
+                            
+                            
+                              
+                                True
+                                False
+                                languagelist
+                                0
+                                
+                                  
+                                  
+                                    0
+                                  
+                                
+                              
+                              
+                                True
+                                True
+                                1
+                              
+                            
+                          
+                        
+                      
+                    
+                    
+                      
+                        True
+                        False
+                        Locale
+                      
+                    
+                  
+                  
+                    False
+                    True
+                    2
+                  
+                
+              
+              
+                False
+                True
+                2
+              
+            
+          
+          
+            True
+            True
+            0
+          
+        
+      
+    
+    
+      
+    
+  
+  
+    
+      
+      
+      
+      
+    
+  
+
diff --git a/ubl-settings-system.pot b/ubl-settings-system.pot
new file mode 100644
index 0000000..c0517de
--- /dev/null
+++ b/ubl-settings-system.pot
@@ -0,0 +1,609 @@
+# Russian translations for ubl-settings-system package.
+# Copyright (C) 2022, UBTech LLC
+# This file is distributed under the same license as the ubl-settings-system package.
+# UBLinux Team , 2022
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: ubl-settings-system 1.0\n"
+"Report-Msgid-Bugs-To: info@ublinux.com\n"
+"POT-Creation-Date: 2023-04-25 15:52+0600\n"
+"PO-Revision-Date: 2023-01-01 00:00+0600\n"
+"Last-Translator: UBLinux Team \n"
+"Language-Team: UBLinux Team \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: source/ubl-strings.h:1
+msgid "Version:"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "ubl-settings-system version:"
+msgstr ""
+
+#: source/ubl-strings.h:2 source/ubl-strings.h:4
+msgid "System configuration"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Usage:"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "[OPTIONS]"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Options:"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Show this help"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Show package version"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Lock this help menu"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Lock configuration saving"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Lock local configration saving"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Lock global configration saving"
+msgstr ""
+
+#: source/ubl-strings.h:2
+msgid "Lock global configration loading"
+msgstr ""
+
+#: source/ubl-strings.h:5
+msgid "System basic parameters configuration"
+msgstr ""
+
+#: source/ubl-strings.h:7
+msgid "Operation succeeded"
+msgstr ""
+
+#: source/ubl-strings.h:8
+msgid ""
+"Warning! Application was launched without root - root-dependent actions are "
+"locked"
+msgstr ""
+
+#: source/ubl-strings.h:10
+msgid "About"
+msgstr ""
+
+#: source/ubl-strings.h:11
+msgid "Documentation"
+msgstr ""
+
+#: source/ubl-strings.h:13
+msgid "Save to local configuration"
+msgstr ""
+
+#: source/ubl-strings.h:14
+msgid "Save to global configuration"
+msgstr ""
+
+#: source/ubl-strings.h:15
+msgid "Save configuration"
+msgstr ""
+
+#: source/ubl-strings.h:16
+msgid "Save"
+msgstr ""
+
+#: source/ubl-strings.h:18
+msgid "Load local configuration"
+msgstr ""
+
+#: source/ubl-strings.h:19
+msgid "Load global configuration"
+msgstr ""
+
+#: source/ubl-strings.h:20
+msgid "Load"
+msgstr ""
+
+#: source/ubl-strings.h:22
+msgid "Cancel"
+msgstr ""
+
+#: source/ubl-strings.h:24
+msgid "Would you like to read documentation in the Web?"
+msgstr ""
+
+#: source/ubl-strings.h:25
+msgid ""
+"You will be redirected to documentation website where documentation is\n"
+"translated and supported by community."
+msgstr ""
+
+#: source/ubl-strings.h:26
+msgid "Always redirect to online documentation"
+msgstr ""
+
+#: source/ubl-strings.h:27
+msgid "Open documentation"
+msgstr ""
+
+#: source/ubl-strings.h:28
+msgid "Project Home Page"
+msgstr ""
+
+#: source/ubl-strings.h:29
+msgid "Nothing were chosen"
+msgstr ""
+
+#: source/ubl-strings.h:32
+msgid "Global configuration loading succseeded."
+msgstr ""
+
+#: source/ubl-strings.h:33
+msgid "Local configuration loading succseeded."
+msgstr ""
+
+#: source/ubl-strings.h:34
+msgid "Config loading failed"
+msgstr ""
+
+#: source/ubl-strings.h:36
+msgid "Local and global configuration saving succseeded."
+msgstr ""
+
+#: source/ubl-strings.h:37
+msgid "Global configuration saving succseeded."
+msgstr ""
+
+#: source/ubl-strings.h:38
+msgid "Local configuration saving succseeded."
+msgstr ""
+
+#: source/ubl-strings.h:40
+msgid "Hostname:"
+msgstr ""
+
+#: source/ubl-strings.h:41
+msgid "Work station ID:"
+msgstr ""
+
+#: source/ubl-strings.h:42
+msgid "System"
+msgstr ""
+
+#: source/ubl-strings.h:43
+msgid "Random"
+msgstr ""
+
+#: source/ubl-strings.h:44
+msgid "Hardware"
+msgstr ""
+
+#: source/ubl-strings.h:45
+msgid "Manual"
+msgstr ""
+
+#: source/ubl-strings.h:46
+msgid "Console"
+msgstr ""
+
+#: source/ubl-strings.h:47
+msgid "Console font:"
+msgstr ""
+
+#: source/ubl-strings.h:48
+msgid "Locale"
+msgstr ""
+
+#: source/ubl-strings.h:49
+msgid "Language:"
+msgstr ""
+
+#: source/ubl-strings.h:51
+msgid "Default"
+msgstr ""
+
+#: source/ubl-strings.h:53
+msgid "Machine ID has been copied"
+msgstr ""
+
+msgid "Afrikaans, South Africa"
+msgstr ""
+
+msgid "Arabic, United Arab Emirates"
+msgstr ""
+
+msgid "Arabic, Bahrain"
+msgstr ""
+
+msgid "Arabic, Algeria"
+msgstr ""
+
+msgid "Arabic, Egypt"
+msgstr ""
+
+msgid "Arabic, Iraq"
+msgstr ""
+
+msgid "Arabic, Jordan"
+msgstr ""
+
+msgid "Arabic, Kuwait"
+msgstr ""
+
+msgid "Arabic, Libya"
+msgstr ""
+
+msgid "Arabic, Morocco"
+msgstr ""
+
+msgid "Arabic, Oman"
+msgstr ""
+
+msgid "Arabic, Qatar"
+msgstr ""
+
+msgid "Arabic, Saudi Arabia"
+msgstr ""
+
+msgid "Arabic, Tunisia"
+msgstr ""
+
+msgid "Arabic, Yemen"
+msgstr ""
+
+msgid "Assamese, India"
+msgstr ""
+
+msgid "Azerbaijani, Azerbaijan"
+msgstr ""
+
+msgid "Belarusian, Belarus"
+msgstr ""
+
+msgid "Bulgarian, Bulgaria"
+msgstr ""
+
+msgid "Bengali, India"
+msgstr ""
+
+msgid "Bosnian, Bosnia and Herzegovina"
+msgstr ""
+
+msgid "Catalan, Spain"
+msgstr ""
+
+msgid "Czech, Czech Republic"
+msgstr ""
+
+msgid "Danish, Denmark"
+msgstr ""
+
+msgid "German, Austria"
+msgstr ""
+
+msgid "German, Belgium"
+msgstr ""
+
+msgid "German, Switzerland"
+msgstr ""
+
+msgid "German, Germany"
+msgstr ""
+
+msgid "German, Liechtenstein"
+msgstr ""
+
+msgid "German, Luxembourg"
+msgstr ""
+
+msgid "Greek, Cyprus"
+msgstr ""
+
+msgid "Greek, Greece"
+msgstr ""
+
+msgid "English, Australia"
+msgstr ""
+
+msgid "English, Botswana"
+msgstr ""
+
+msgid "English, Canada"
+msgstr ""
+
+msgid "English, United Kingdom"
+msgstr ""
+
+msgid "English, Hong Kong SAR China"
+msgstr ""
+
+msgid "English, Ireland"
+msgstr ""
+
+msgid "English, India"
+msgstr ""
+
+msgid "English, Malta"
+msgstr ""
+
+msgid "English, New Zealand"
+msgstr ""
+
+msgid "English, Philippines"
+msgstr ""
+
+msgid "English, Singapore"
+msgstr ""
+
+msgid "English, U.S.A."
+msgstr ""
+
+msgid "English, Zimbabwe"
+msgstr ""
+
+msgid "Spanish, Argentina"
+msgstr ""
+
+msgid "Spanish, Bolivia"
+msgstr ""
+
+msgid "Spanish, Chile"
+msgstr ""
+
+msgid "Spanish, Colombia"
+msgstr ""
+
+msgid "Spanish, Costa Rica"
+msgstr ""
+
+msgid "Spanish, Dominican Republic"
+msgstr ""
+
+msgid "Spanish, Ecuador"
+msgstr ""
+
+msgid "Spanish, Spain"
+msgstr ""
+
+msgid "Spanish, Guatemala"
+msgstr ""
+
+msgid "Spanish, Honduras"
+msgstr ""
+
+msgid "Spanish, Mexico"
+msgstr ""
+
+msgid "Spanish, Nicaragua"
+msgstr ""
+
+msgid "Spanish, Panama"
+msgstr ""
+
+msgid "Spanish, Peru"
+msgstr ""
+
+msgid "Spanish, Puerto Rico"
+msgstr ""
+
+msgid "Spanish, Paraguay"
+msgstr ""
+
+msgid "Spanish, El Salvador"
+msgstr ""
+
+msgid "Spanish, U.S.A."
+msgstr ""
+
+msgid "Spanish, Uruguay"
+msgstr ""
+
+msgid "Spanish, Venezuela"
+msgstr ""
+
+msgid "Estonian, Estonia"
+msgstr ""
+
+msgid "Finnish, Finland"
+msgstr ""
+
+msgid "French, Belgium"
+msgstr ""
+
+msgid "French, Canada"
+msgstr ""
+
+msgid "French, Switzerland"
+msgstr ""
+
+msgid "French, France"
+msgstr ""
+
+msgid "French, Luxembourg"
+msgstr ""
+
+msgid "Gujarati, India"
+msgstr ""
+
+msgid "Hebrew, Israel"
+msgstr ""
+
+msgid "Hindi, India"
+msgstr ""
+
+msgid "Croatian, Croatia"
+msgstr ""
+
+msgid "Hungarian, Hungary"
+msgstr ""
+
+msgid "Armenian, Armenia"
+msgstr ""
+
+msgid "Indonesian, Indonesia"
+msgstr ""
+
+msgid "Icelandic, Iceland"
+msgstr ""
+
+msgid "Italian, Switzerla"
+msgstr ""
+
+msgid "Italian, Italy"
+msgstr ""
+
+msgid "Japanese, Japan"
+msgstr ""
+
+msgid "Georgian, Georgia"
+msgstr ""
+
+msgid "Kazakh, Kazakhstan"
+msgstr ""
+
+msgid "Kannada, India"
+msgstr ""
+
+msgid "Korean, Korea"
+msgstr ""
+
+msgid "Kashmiri, India"
+msgstr ""
+
+msgid "Kurdish, Turkey"
+msgstr ""
+
+msgid "Kurdish (Sorani), Turkey"
+msgstr ""
+
+msgid "Kirghiz, Kyrgyzstan"
+msgstr ""
+
+msgid "Lithuanian, Lithuania"
+msgstr ""
+
+msgid "Latvian, Latvia"
+msgstr ""
+
+msgid "Macedonian, Macedonia"
+msgstr ""
+
+msgid "Malayalam, India"
+msgstr ""
+
+msgid "Marathi, India"
+msgstr ""
+
+msgid "Malay, Malaysia"
+msgstr ""
+
+msgid "Maltese, Malta"
+msgstr ""
+
+msgid "Bokmal, Norway"
+msgstr ""
+
+msgid "Dutch, Belgium"
+msgstr ""
+
+msgid "Dutch, Netherlands"
+msgstr ""
+
+msgid "Nynorsk, Norway"
+msgstr ""
+
+msgid "Oriya, India"
+msgstr ""
+
+msgid "Punjabi, India"
+msgstr ""
+
+msgid "Polish, Poland"
+msgstr ""
+
+msgid "Portuguese, Brazil"
+msgstr ""
+
+msgid "Portuguese, Portugal"
+msgstr ""
+
+msgid "Romanian, Romania"
+msgstr ""
+
+msgid "Russian, Russia"
+msgstr ""
+
+msgid "Russian, Ukraine"
+msgstr ""
+
+msgid "Sanskrit, India"
+msgstr ""
+
+msgid "Slovak, Slovakia"
+msgstr ""
+
+msgid "Slovenian, Slovenia"
+msgstr ""
+
+msgid "Albanian, Albania"
+msgstr ""
+
+msgid "Serbian, Montenegro"
+msgstr ""
+
+msgid "Serbian, Montenegro (Latin)"
+msgstr ""
+
+msgid "Serbian, Serbia"
+msgstr ""
+
+msgid "Serbian, Serbia (Latin)"
+msgstr ""
+
+msgid "Swedish, Sweden"
+msgstr ""
+
+msgid "Tamil, India"
+msgstr ""
+
+msgid "Telugu, India"
+msgstr ""
+
+msgid "Thai, Thailand"
+msgstr ""
+
+msgid "Turkish, Turkey"
+msgstr ""
+
+msgid "Ukrainian, Ukraine"
+msgstr ""
+
+msgid "Vietnamese, Vietnam"
+msgstr ""
+
+msgid "Simplified Chinese, China"
+msgstr ""
+
+msgid "Traditional Chinese, Hong Kong SAR China"
+msgstr ""
+
+msgid "Chinese, Singapore"
+msgstr ""
+
+msgid "Traditional Chinese, Taiwan"
+msgstr ""
diff --git a/ubl-settings-system_ru.po b/ubl-settings-system_ru.po
new file mode 100644
index 0000000..a47ba90
--- /dev/null
+++ b/ubl-settings-system_ru.po
@@ -0,0 +1,613 @@
+# Russian translations for ubl-settings-system package.
+# Copyright (C) 2022, UBTech LLC
+# This file is distributed under the same license as the ubl-settings-system package.
+# UBLinux Team , 2022
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: ubl-settings-system 1.0\n"
+"Report-Msgid-Bugs-To: info@ublinux.com\n"
+"POT-Creation-Date: 2023-04-25 15:52+0600\n"
+"PO-Revision-Date: 2023-01-01 00:00+0600\n"
+"Last-Translator: UBLinux Team \n"
+"Language-Team: Russian - UBLinux Team \n"
+"Language: Russian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: source/ubl-strings.h:1
+msgid "Version:"
+msgstr "Версия:"
+
+#: source/ubl-strings.h:2
+msgid "ubl-settings-system version:"
+msgstr "Версия ubl-settings-system: "
+
+#: source/ubl-strings.h:2 source/ubl-strings.h:4
+msgid "System configuration"
+msgstr "Системные настройки"
+
+#: source/ubl-strings.h:2
+msgid "Usage:"
+msgstr "Использование:"
+
+#: source/ubl-strings.h:2
+msgid "[OPTIONS]"
+msgstr "[АРГУМЕНТЫ]"
+
+#: source/ubl-strings.h:2
+msgid "Options:"
+msgstr "Аргументы:"
+
+#: source/ubl-strings.h:2
+msgid "Show this help"
+msgstr "Показать параметры справки"
+
+#: source/ubl-strings.h:2
+msgid "Show package version"
+msgstr "Показать текущую версию"
+
+#: source/ubl-strings.h:2
+msgid "Lock this help menu"
+msgstr "Блокировка вызова справки"
+
+#: source/ubl-strings.h:2
+msgid "Lock configuration saving"
+msgstr "Блокировка сохранения локальной и глобальной конфигурации"
+
+#: source/ubl-strings.h:2
+msgid "Lock local configration saving"
+msgstr "Блокировка сохранения локальной конфигурации"
+
+#: source/ubl-strings.h:2
+msgid "Lock global configration saving"
+msgstr "Блокировка сохранения глобальной конфигурации"
+
+#: source/ubl-strings.h:2
+msgid "Lock global configration loading"
+msgstr "Блокировка загрузки глобальной конфигурации"
+
+#: source/ubl-strings.h:5
+msgid "System basic parameters configuration"
+msgstr "Настройка основных параметров системы"
+
+#: source/ubl-strings.h:7
+msgid "Operation succeeded"
+msgstr "Операция завершена"
+
+#: source/ubl-strings.h:8
+msgid ""
+"Warning! Application was launched without root - root-dependent actions are "
+"locked"
+msgstr ""
+"Внимание! Приложение было запущено без прав суперпользователя - действия, "
+"требующие их наличия заблокированы"
+
+#: source/ubl-strings.h:10
+msgid "About"
+msgstr "О программе"
+
+#: source/ubl-strings.h:11
+msgid "Documentation"
+msgstr "Справка"
+
+#: source/ubl-strings.h:13
+msgid "Save to local configuration"
+msgstr "Сохранить в локальную конфигурацию"
+
+#: source/ubl-strings.h:14
+msgid "Save to global configuration"
+msgstr "Сохранить в глобальную конфигурацию"
+
+#: source/ubl-strings.h:15
+msgid "Save configuration"
+msgstr "Сохранить конфигурацию"
+
+#: source/ubl-strings.h:16
+msgid "Save"
+msgstr "Сохранить"
+
+#: source/ubl-strings.h:18
+msgid "Load local configuration"
+msgstr "Загрузить локальную конфигуруцию"
+
+#: source/ubl-strings.h:19
+msgid "Load global configuration"
+msgstr "Загрузить глобальную конфигурацию"
+
+#: source/ubl-strings.h:20
+msgid "Load"
+msgstr "Загрузить"
+
+#: source/ubl-strings.h:22
+msgid "Cancel"
+msgstr "Отмена"
+
+#: source/ubl-strings.h:24
+msgid "Would you like to read documentation in the Web?"
+msgstr "Вы хотите прочитать справку в Сети?"
+
+#: source/ubl-strings.h:25
+msgid ""
+"You will be redirected to documentation website where documentation is\n"
+"translated and supported by community."
+msgstr ""
+"Вы будете перенаправлены на сайт с документацией, где страницы помощи\n"
+"переводятся и поддерживаются сообществом."
+
+#: source/ubl-strings.h:26
+msgid "Always redirect to online documentation"
+msgstr "Всегда перенаправлять"
+
+#: source/ubl-strings.h:27
+msgid "Open documentation"
+msgstr "Прочитать справку"
+
+#: source/ubl-strings.h:28
+msgid "Project Home Page"
+msgstr "Домашняя страница проекта"
+
+#: source/ubl-strings.h:29
+msgid "Nothing were chosen"
+msgstr "Ничего не было выбрано"
+
+#: source/ubl-strings.h:32
+msgid "Global configuration loading succseeded."
+msgstr "Успешно загружена глобальная конфигурация"
+
+#: source/ubl-strings.h:33
+msgid "Local configuration loading succseeded."
+msgstr "Успешно загружена локальная конфигурация"
+
+#: source/ubl-strings.h:34
+msgid "Config loading failed"
+msgstr "Ошибка загрузки конфигурации"
+
+#: source/ubl-strings.h:36
+msgid "Local and global configuration saving succseeded."
+msgstr "Успешно записаны локальная и глобальная конфигурация"
+
+#: source/ubl-strings.h:37
+msgid "Global configuration saving succseeded."
+msgstr "Успешно записана глобальная конфигурация"
+
+#: source/ubl-strings.h:38
+msgid "Local configuration saving succseeded."
+msgstr "Успешно записана локальная конфигурация"
+
+#: source/ubl-strings.h:40
+msgid "Hostname:"
+msgstr "Имя хоста:"
+
+#: source/ubl-strings.h:41
+msgid "Work station ID:"
+msgstr "ID рабочей станции:"
+
+#: source/ubl-strings.h:42
+msgid "System"
+msgstr "Система"
+
+#: source/ubl-strings.h:43
+msgid "Random"
+msgstr "Случайный"
+
+#: source/ubl-strings.h:44
+msgid "Hardware"
+msgstr "Системный"
+
+#: source/ubl-strings.h:45
+msgid "Manual"
+msgstr "Вручную"
+
+#: source/ubl-strings.h:46
+msgid "Console"
+msgstr "Консоль"
+
+#: source/ubl-strings.h:47
+msgid "Console font:"
+msgstr "Шрифт в консоли"
+
+#: source/ubl-strings.h:48
+msgid "Locale"
+msgstr "Локаль"
+
+#: source/ubl-strings.h:49
+msgid "Language:"
+msgstr "Язык"
+
+#: source/ubl-strings.h:51
+msgid "Default"
+msgstr "По умолчанию"
+
+#: source/ubl-strings.h:53
+msgid "Machine ID has been copied"
+msgstr "ID рабочей станции скопирован"
+
+msgid "Afrikaans, South Africa"
+msgstr "Африканский, Южная Африка"
+
+msgid "Arabic, United Arab Emirates"
+msgstr "Арабский, ЮАР"
+
+msgid "Arabic, Bahrain"
+msgstr "Арабский, Бахрейн"
+
+msgid "Arabic, Algeria"
+msgstr "Арабский, Алжир"
+
+msgid "Arabic, Egypt"
+msgstr "Арабский, Египт"
+
+msgid "Arabic, Iraq"
+msgstr "Арабский, Ирак"
+
+msgid "Arabic, Jordan"
+msgstr "Арабский, Иордания"
+
+msgid "Arabic, Kuwait"
+msgstr "Арабский, Кувейт"
+
+msgid "Arabic, Libya"
+msgstr "Арабский, Ливия"
+
+msgid "Arabic, Morocco"
+msgstr "Арабский, Морокко"
+
+msgid "Arabic, Oman"
+msgstr "Арабский, Оман"
+
+msgid "Arabic, Qatar"
+msgstr "Арабский, Катар"
+
+msgid "Arabic, Saudi Arabia"
+msgstr "Арабский, Саудовская Аравия"
+
+msgid "Arabic, Tunisia"
+msgstr "Арабский, Тунис"
+
+msgid "Arabic, Yemen"
+msgstr "Арабский, Йемен"
+
+msgid "Assamese, India"
+msgstr "Ассамский, Индия"
+
+msgid "Azerbaijani, Azerbaijan"
+msgstr "Азербайджанский,Азербайджан"
+
+msgid "Belarusian, Belarus"
+msgstr "Беларусский, Беларусь"
+
+msgid "Bulgarian, Bulgaria"
+msgstr "Болгарский, Болгария"
+
+msgid "Bengali, India"
+msgstr "Бенгальский, Индия"
+
+msgid "Bosnian, Bosnia and Herzegovina"
+msgstr "Боснийский, Босния и Герцеговина"
+
+msgid "Catalan, Spain"
+msgstr "Каталонский, Испания"
+
+msgid "Czech, Czech Republic"
+msgstr "Чешский, Чехия"
+
+msgid "Danish, Denmark"
+msgstr "Датский, Дания"
+
+msgid "German, Austria"
+msgstr "Немецкий, Австрия"
+
+msgid "German, Belgium"
+msgstr "Немецкий, Бельгия"
+
+msgid "German, Switzerland"
+msgstr "Немецкий, Швейцария"
+
+msgid "German, Germany"
+msgstr "Немецкий, Германия"
+
+msgid "German, Liechtenstein"
+msgstr "Немецкий, Лихтенштейн"
+
+msgid "German, Luxembourg"
+msgstr "Немецкий, Люксембург"
+
+msgid "Greek, Cyprus"
+msgstr "Греческий, Кипр"
+
+msgid "Greek, Greece"
+msgstr "Греческий, Греция"
+
+msgid "English, Australia"
+msgstr "Английский, Австралия"
+
+msgid "English, Botswana"
+msgstr "Английский, ботсвана"
+
+msgid "English, Canada"
+msgstr "Английский, Канада"
+
+msgid "English, United Kingdom"
+msgstr "Английский, Великобритания"
+
+msgid "English, Hong Kong SAR China"
+msgstr "Английский, Гонконг"
+
+msgid "English, Ireland"
+msgstr "Английский, Ирландия"
+
+msgid "English, India"
+msgstr "Английский, Индия"
+
+msgid "English, Malta"
+msgstr "Английский, Мальта"
+
+msgid "English, New Zealand"
+msgstr "Английский, Новая Зеландия"
+
+msgid "English, Philippines"
+msgstr "Английский, Филиппины"
+
+msgid "English, Singapore"
+msgstr "Английский, Сингапур"
+
+msgid "English, U.S.A."
+msgstr "Английский, США"
+
+msgid "English, Zimbabwe"
+msgstr "Английский, Зимбабве"
+
+msgid "Spanish, Argentina"
+msgstr "Испанский, Аргентина"
+
+msgid "Spanish, Bolivia"
+msgstr "Испанский, Боливия"
+
+msgid "Spanish, Chile"
+msgstr "Испанский, Чили"
+
+msgid "Spanish, Colombia"
+msgstr "Испанский, Колумбия"
+
+msgid "Spanish, Costa Rica"
+msgstr "Испанский, Коста-Рика"
+
+msgid "Spanish, Dominican Republic"
+msgstr "Испанский, Доминиканская республика"
+
+msgid "Spanish, Ecuador"
+msgstr "Испанский, Эквадор"
+
+msgid "Spanish, Spain"
+msgstr "Испанский, Испания"
+
+msgid "Spanish, Guatemala"
+msgstr "Испанский, Гватемала"
+
+msgid "Spanish, Honduras"
+msgstr "Испанский, Гондурас"
+
+msgid "Spanish, Mexico"
+msgstr "Испанский, Мексика"
+
+msgid "Spanish, Nicaragua"
+msgstr "Испанский, Никарагуа"
+
+msgid "Spanish, Panama"
+msgstr "Испанский, Панама"
+
+msgid "Spanish, Peru"
+msgstr "Испанский, Перу"
+
+msgid "Spanish, Puerto Rico"
+msgstr "Испанский, Пуэрто-Рико"
+
+msgid "Spanish, Paraguay"
+msgstr "Испанский, Парагвай"
+
+msgid "Spanish, El Salvador"
+msgstr "Испанский, Сальвадор"
+
+msgid "Spanish, U.S.A."
+msgstr "Испанский, США"
+
+msgid "Spanish, Uruguay"
+msgstr "Испанский, Уругвай"
+
+msgid "Spanish, Venezuela"
+msgstr "Испанский, Венесуэла"
+
+msgid "Estonian, Estonia"
+msgstr "Эстонский, Эстония"
+
+msgid "Finnish, Finland"
+msgstr "Финский, Финляндия"
+
+msgid "French, Belgium"
+msgstr "Французский, Бельгия"
+
+msgid "French, Canada"
+msgstr "Французский, Канада"
+
+msgid "French, Switzerland"
+msgstr "Французский, Швейцария"
+
+msgid "French, France"
+msgstr "Французский, Франция"
+
+msgid "French, Luxembourg"
+msgstr "Французский, Люксембург"
+
+msgid "Gujarati, India"
+msgstr "Гуджаратский, Индия"
+
+msgid "Hebrew, Israel"
+msgstr "Иврит, Израиль"
+
+msgid "Hindi, India"
+msgstr "Хинди, Индия"
+
+msgid "Croatian, Croatia"
+msgstr "Хорватский, Хорватия"
+
+msgid "Hungarian, Hungary"
+msgstr "Венгерский, Венгрия"
+
+msgid "Armenian, Armenia"
+msgstr "Армянский, Армения"
+
+msgid "Indonesian, Indonesia"
+msgstr "Индонезийский, Индонезия"
+
+msgid "Icelandic, Iceland"
+msgstr "Исландский, Исландия"
+
+msgid "Italian, Switzerla"
+msgstr "Итальянский, Швейцария"
+
+msgid "Italian, Italy"
+msgstr "Итальянский, Италия"
+
+msgid "Japanese, Japan"
+msgstr "Японский, Япония"
+
+msgid "Georgian, Georgia"
+msgstr "Грузинский, Грузия"
+
+msgid "Kazakh, Kazakhstan"
+msgstr "Казахский, Казахстан"
+
+msgid "Kannada, India"
+msgstr "Каннада, Индия"
+
+msgid "Korean, Korea"
+msgstr "орейский, Корея"
+
+msgid "Kashmiri, India"
+msgstr "Кашмирский, Индия"
+
+msgid "Kurdish, Turkey"
+msgstr "Курдский, Турция"
+
+msgid "Kurdish (Sorani), Turkey"
+msgstr "Курдский (Сорани), Турция"
+
+msgid "Kirghiz, Kyrgyzstan"
+msgstr "Киргизский, Кыргызстан"
+
+msgid "Lithuanian, Lithuania"
+msgstr "Литовский, Литва"
+
+msgid "Latvian, Latvia"
+msgstr "Латышский, Латвия"
+
+msgid "Macedonian, Macedonia"
+msgstr "Македонский, Северная Македония"
+
+msgid "Malayalam, India"
+msgstr "Малаялам, Индия"
+
+msgid "Marathi, India"
+msgstr "Маратхи, Индия"
+
+msgid "Malay, Malaysia"
+msgstr "Малайский, Малайзия"
+
+msgid "Maltese, Malta"
+msgstr "Мальтийский, Мальта"
+
+msgid "Bokmal, Norway"
+msgstr "Букмол, Норвегия"
+
+msgid "Dutch, Belgium"
+msgstr "Нидерландский, Бельгия"
+
+msgid "Dutch, Netherlands"
+msgstr "Нидерландский, Нидерланды"
+
+msgid "Nynorsk, Norway"
+msgstr "Норвежский, Норвегия"
+
+msgid "Oriya, India"
+msgstr "Ория, Индия"
+
+msgid "Punjabi, India"
+msgstr "Панджаби"
+
+msgid "Polish, Poland"
+msgstr "Польский, Польша"
+
+msgid "Portuguese, Brazil"
+msgstr "Португальский, Бразилия"
+
+msgid "Portuguese, Portugal"
+msgstr "Португальский, Португалия"
+
+msgid "Romanian, Romania"
+msgstr "Румынский, Румыния"
+
+msgid "Russian, Russia"
+msgstr "Русский, Россия"
+
+msgid "Russian, Ukraine"
+msgstr "Русский, Украина"
+
+msgid "Sanskrit, India"
+msgstr "Санскрит, Индия"
+
+msgid "Slovak, Slovakia"
+msgstr "Словацкий, Словакия"
+
+msgid "Slovenian, Slovenia"
+msgstr "Словенский, Словения"
+
+msgid "Albanian, Albania"
+msgstr "Албанский, Албания"
+
+msgid "Serbian, Montenegro"
+msgstr "Сербский, Черногория"
+
+msgid "Serbian, Montenegro (Latin)"
+msgstr "Сербский, Черногория"
+
+msgid "Serbian, Serbia"
+msgstr "Сербский, Сербия"
+
+msgid "Serbian, Serbia (Latin)"
+msgstr "Сербский, Сербия"
+
+msgid "Swedish, Sweden"
+msgstr "Шведский, Швеция"
+
+msgid "Tamil, India"
+msgstr "Тамильский, Индия"
+
+msgid "Telugu, India"
+msgstr "Тулугу, Индия"
+
+msgid "Thai, Thailand"
+msgstr "Тайский, Тайланд"
+
+msgid "Turkish, Turkey"
+msgstr "Турецкий, Турция"
+
+msgid "Ukrainian, Ukraine"
+msgstr "Украинский, Украина"
+
+msgid "Vietnamese, Vietnam"
+msgstr "Вьетнамский, Вьетнам"
+
+msgid "Simplified Chinese, China"
+msgstr "Упрощённый Китайский, Китай"
+
+msgid "Traditional Chinese, Hong Kong SAR China"
+msgstr "Традиционный Китайский, Гонконг"
+
+msgid "Chinese, Singapore"
+msgstr "Китайский, Сингапур"
+
+msgid "Traditional Chinese, Taiwan"
+msgstr "Традиционный Китайский, Тайвань"