diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e7a4bf81481d388375c2e50d0d47efe1f6c086e4..41890c48d4f734b25f0585d8b0d21a459765f34e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -17,7 +17,7 @@ syntax:lint:
     - schedules
     - web
     - merge_requests
-    - /^\d+\.\d+\.\d+(p\d+)?$/
+    - /^\d+\.\d+\.\d+([p|b]\d+)?$/
 
   script:
     - echo "Syntax checking PHP files"
@@ -37,7 +37,7 @@ syntax_diff:lint:
     - schedules
     - web
     - merge_requests
-    - /^\d+\.\d+\.\d+(p\d+)?$/
+    - /^\d+\.\d+\.\d+([p|b]\d+)?$/
 
   script:
     - echo "Syntax checking PHP files"
@@ -81,7 +81,7 @@ build:package:
     image: edbizarro/gitlab-ci-pipeline-php:7.2
     only:
         refs:
-            - /^\d+\.\d+\.\d+(p\d+)?$/
+            - /^\d+\.\d+\.\d+([p|b]\d+)?$/
             - web
 
     script:
@@ -90,7 +90,7 @@ build:package:
         - if [[ "$VER" == "" ]] ; then VER="3.2dev"$(date +%s) ; fi
         - if [[ "$VER" != "" ]] ; then echo "Replacing 3.2dev by $VER" ; sed -i -r 's/3\.2dev/'${VER}'/g' install/tpl/config.inc.php.master install/sql/ispconfig3.sql ; fi
         - RET=0
-        - tar -cpzf ISPConfig-${VER}.tar.gz --exclude "ISPConfig-${VER}.tar.gz" --exclude ".git*" --exclude ".phplint.yml" --transform 's,^\./,ispconfig3_install/,' . || RET=$?
+        - tar -cpzf ISPConfig-${VER}.tar.gz --exclude "ISPConfig-${VER}.tar.gz" --exclude ".git*" --exclude ".phplint.yml" --transform 's,^\./,ispconfig3_install/,' --mode='0775' ./* || RET=$?
         - if [[ $RET > 1 ]] ; then exit $RET ; fi
         - echo "Listing tar contents for verification"
         - tar -tvf ISPConfig-${VER}.tar.gz
@@ -101,4 +101,4 @@ build:package:
         - echo "Download url is https://download.ispconfig.org/ISPConfig-${VER}.tar.gz"
         
     needs: ["syntax:lint"]
-    allow_failure: false
\ No newline at end of file
+    allow_failure: false
diff --git a/install/dist/conf/centos52.conf.php b/install/dist/conf/centos52.conf.php
index 9a7e2d0cadfd8e64cbb6e411f18446812237ea9e..3bca2eba5482cebb1ca5d4f7512b3f78661e2485 100644
--- a/install/dist/conf/centos52.conf.php
+++ b/install/dist/conf/centos52.conf.php
@@ -66,6 +66,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/centos53.conf.php b/install/dist/conf/centos53.conf.php
index 9a7e2d0cadfd8e64cbb6e411f18446812237ea9e..3bca2eba5482cebb1ca5d4f7512b3f78661e2485 100644
--- a/install/dist/conf/centos53.conf.php
+++ b/install/dist/conf/centos53.conf.php
@@ -66,6 +66,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/centos70.conf.php b/install/dist/conf/centos70.conf.php
index efe166e0791214cc26afc6768712a14283c31c2a..ec59c754cb3c93ead89f61738982bd9f4ba5756f 100644
--- a/install/dist/conf/centos70.conf.php
+++ b/install/dist/conf/centos70.conf.php
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "5.4";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -66,6 +67,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/centos72.conf.php b/install/dist/conf/centos72.conf.php
index f4a3c937baf7e1bcb42ae5701605458e1465a2af..d83ac2300b8f284c565363180e26450f054d8edc 100644
--- a/install/dist/conf/centos72.conf.php
+++ b/install/dist/conf/centos72.conf.php
@@ -28,7 +28,7 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-//***  Fedora 9 default settings
+//***  RHEL 7 derivatives default settings
 
 //* Main
 $conf['language'] = 'en';
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "5.4";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -66,6 +67,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/centos80.conf.php b/install/dist/conf/centos80.conf.php
index 1a354d3644f0033739b79a8406ac9a2d188b7c41..dd2abc668a21384b906f987f59da19a9ff24bf06 100644
--- a/install/dist/conf/centos80.conf.php
+++ b/install/dist/conf/centos80.conf.php
@@ -28,7 +28,7 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-//***  Fedora 9 default settings
+//***  RHEL 8 derivatives default settings
 
 //* Main
 $conf['language'] = 'en';
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "7.2";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -66,6 +67,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/centos90.conf.php b/install/dist/conf/centos90.conf.php
new file mode 100644
index 0000000000000000000000000000000000000000..909418dc2ef9d2babed8f0f413c3cfa0a1d9e648
--- /dev/null
+++ b/install/dist/conf/centos90.conf.php
@@ -0,0 +1,232 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+//***  RHEL 9 derivatives default settings
+
+//* Main
+$conf['language'] = 'en';
+$conf['distname'] = 'centos90';
+$conf['hostname'] = 'server1.domain.tld'; // Full hostname
+$conf['ispconfig_install_dir'] = '/usr/local/ispconfig';
+$conf['ispconfig_config_dir'] = '/usr/local/ispconfig';
+$conf['ispconfig_log_priority'] = 2;  // 0 = Debug, 1 = Warning, 2 = Error
+$conf['ispconfig_log_dir'] = '/var/log/ispconfig';
+$conf['server_id'] = 1;
+$conf['init_scripts'] = '/etc/init.d';
+$conf['runlevel'] = '/etc';
+$conf['shells'] = '/etc/shells';
+$conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "8.0";
+
+//* Services provided by this server, this selection will be overridden by the expert mode
+$conf['services']['mail'] = true;
+$conf['services']['web'] = true;
+$conf['services']['dns'] = true;
+$conf['services']['file'] = true;
+$conf['services']['db'] = true;
+$conf['services']['vserver'] = true;
+
+//* MySQL
+$conf['mysql']['installed'] = false; // will be detected automatically during installation
+$conf['mysql']['init_script'] = 'mariadb';
+$conf['mysql']['host'] = 'localhost';
+$conf['mysql']['ip'] = '127.0.0.1';
+$conf['mysql']['port'] = '3306';
+$conf['mysql']['database'] = 'dbispconfig';
+$conf['mysql']['admin_user'] = 'root';
+$conf['mysql']['admin_password'] = '';
+$conf['mysql']['charset'] = 'utf8';
+$conf['mysql']['ispconfig_user'] = 'ispconfig';
+$conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
+$conf['mysql']['master_slave_setup'] = 'n';
+$conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
+$conf['mysql']['master_database'] = 'dbispconfig';
+$conf['mysql']['master_admin_user'] = 'root';
+$conf['mysql']['master_admin_password'] = '';
+$conf['mysql']['master_ispconfig_user'] = '';
+$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20));
+
+//* Apache
+$conf['apache']['installed'] = false; // will be detected automatically during installation
+$conf['apache']['user'] = 'apache';
+$conf['apache']['group'] = 'apache';
+$conf['apache']['init_script'] = 'httpd';
+$conf['apache']['version'] = '2.2';
+$conf['apache']['vhost_conf_dir'] = '/etc/httpd/conf/sites-available';
+$conf['apache']['vhost_conf_enabled_dir'] = '/etc/httpd/conf/sites-enabled';
+$conf['apache']['vhost_port'] = '8080';
+$conf['apache']['php_ini_path_apache'] = '/etc/php.ini';
+$conf['apache']['php_ini_path_cgi'] = '/etc/php.ini';
+
+//* Website base settings
+$conf['web']['website_basedir'] = '/var/www';
+$conf['web']['website_path'] = '/var/www/clients/client[client_id]/web[website_id]';
+$conf['web']['website_symlinks'] = '/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/';
+
+//* Apps base settings
+$conf['web']['apps_vhost_ip'] = '_default_';
+$conf['web']['apps_vhost_port'] = '8081';
+$conf['web']['apps_vhost_servername'] = '';
+$conf['web']['apps_vhost_user'] = 'ispapps';
+$conf['web']['apps_vhost_group'] = 'ispapps';
+
+//* AWStats settings
+$conf['awstats']['pl'] = '/usr/share/awstats/wwwroot/cgi-bin/awstats.pl';
+
+//* Fastcgi
+$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/';
+$conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/';
+$conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi';
+
+//* Postfix
+$conf['postfix']['installed'] = false; // will be detected automatically during installation
+$conf['postfix']['config_dir'] = '/etc/postfix';
+$conf['postfix']['init_script'] = 'postfix';
+$conf['postfix']['user'] = 'postfix';
+$conf['postfix']['group'] = 'postfix';
+$conf['postfix']['vmail_userid'] = '5000';
+$conf['postfix']['vmail_username'] = 'vmail';
+$conf['postfix']['vmail_groupid'] = '5000';
+$conf['postfix']['vmail_groupname'] = 'vmail';
+$conf['postfix']['vmail_mailbox_base'] = '/var/vmail';
+
+//* Mailman
+$conf['mailman']['installed'] = false; // will be detected automatically during installation
+$conf['mailman']['config_dir'] = '/etc/mailman';
+$conf['mailman']['init_script'] = 'mailman';
+
+//* Getmail
+$conf['getmail']['installed'] = false; // will be detected automatically during installation
+$conf['getmail']['config_dir'] = '/etc/getmail';
+$conf['getmail']['program'] = '/usr/bin/getmail';
+
+//* Courier
+$conf['courier']['installed'] = false; // will be detected automatically during installation
+$conf['courier']['config_dir'] = '/etc/authlib';
+$conf['courier']['courier-authdaemon'] = 'courier-authlib';
+$conf['courier']['courier-imap'] = 'courier-imap';
+$conf['courier']['courier-imap-ssl'] = '';
+$conf['courier']['courier-pop'] = '';
+$conf['courier']['courier-pop-ssl'] = '';
+
+//* Dovecot
+$conf['dovecot']['installed'] = false; // will be detected automatically during installation
+$conf['dovecot']['config_dir'] = '/etc/dovecot';
+$conf['dovecot']['init_script'] = 'dovecot';
+
+//* SASL
+$conf['saslauthd']['installed'] = false; // will be detected automatically during installation
+$conf['saslauthd']['config'] = '/etc/sysconfig/saslauthd';
+$conf['saslauthd']['init_script'] = 'saslauthd';
+
+//* Amavisd
+$conf['amavis']['installed'] = false; // will be detected automatically during installation
+$conf['amavis']['config_dir'] = '/etc/amavisd';
+$conf['amavis']['init_script'] = 'amavisd';
+
+//* Rspamd
+$conf['rspamd']['installed'] = false; // will be detected automatically during installation
+$conf['rspamd']['config_dir'] = '/etc/rspamd';
+$conf['rspamd']['init_script'] = 'rspamd';
+
+//* ClamAV
+$conf['clamav']['installed'] = false; // will be detected automatically during installation
+$conf['clamav']['init_script'] = 'clamd@amavisd';
+
+//* Pureftpd
+$conf['pureftpd']['installed'] = false; // will be detected automatically during installation
+$conf['pureftpd']['config_dir'] = '/etc/pure-ftpd';
+$conf['pureftpd']['init_script'] = 'pure-ftpd';
+
+//* MyDNS
+$conf['mydns']['installed'] = false; // will be detected automatically during installation
+$conf['mydns']['config_dir'] = '/etc';
+$conf['mydns']['init_script'] = 'mydns';
+
+//* PowerDNS
+$conf['powerdns']['installed'] = false; // will be detected automatically during installation
+$conf['powerdns']['database'] = 'powerdns';
+$conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
+$conf['powerdns']['init_script'] = 'pdns';
+
+//* BIND DNS Server
+$conf['bind']['installed'] = false; // will be detected automatically during installation
+$conf['bind']['bind_user'] = 'named';
+$conf['bind']['bind_group'] = 'named';
+$conf['bind']['bind_zonefiles_dir'] = '/var/named';
+$conf['bind']['named_conf_path'] = '/etc/named.conf';
+$conf['bind']['named_conf_local_path'] = '/etc/named.conf.local';
+$conf['bind']['init_script'] = 'named';
+
+//* Jailkit
+$conf['jailkit']['installed'] = false; // will be detected automatically during installation
+$conf['jailkit']['config_dir'] = '/etc/jailkit';
+$conf['jailkit']['jk_init'] = 'jk_init.ini';
+$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
+$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+
+//* Squid
+$conf['squid']['installed'] = false; // will be detected automatically during installation
+$conf['squid']['config_dir'] = '/etc/squid';
+$conf['squid']['init_script'] = 'squid';
+
+//* Nginx
+$conf['nginx']['installed'] = false; // will be detected automatically during installation
+$conf['nginx']['user'] = 'nginx';
+$conf['nginx']['group'] = 'nginx';
+$conf['nginx']['config_dir'] = '/etc/nginx';
+$conf['nginx']['vhost_conf_dir'] = '/etc/nginx/sites-available';
+$conf['nginx']['vhost_conf_enabled_dir'] = '/etc/nginx/sites-enabled';
+$conf['nginx']['init_script'] = 'nginx';
+$conf['nginx']['vhost_port'] = '8080';
+$conf['nginx']['cgi_socket'] = '/var/run/fcgiwrap.socket';
+$conf['nginx']['php_fpm_init_script'] = 'php-fpm';
+$conf['nginx']['php_fpm_ini_path'] = '/etc/php.ini';
+$conf['nginx']['php_fpm_pool_dir'] = '/etc/php-fpm.d';
+$conf['nginx']['php_fpm_start_port'] = 9010;
+$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php5-fpm';
+
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'crond';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
+
+//* OpenVZ
+$conf['openvz']['installed'] = false;
+
+// AppArmor
+$conf['apparmor']['installed'] = false;
+
+?>
diff --git a/install/dist/conf/debian100.conf.php b/install/dist/conf/debian100.conf.php
index 30f483980aad9cf651d70f2ca507085ece7d2814..b23bbbf32c3a64a8fc949e4a347ee5c8555b1b7d 100644
--- a/install/dist/conf/debian100.conf.php
+++ b/install/dist/conf/debian100.conf.php
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "7.3";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -68,6 +69,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/debian110.conf.php b/install/dist/conf/debian110.conf.php
index ce5bda7170aae2a3db322c9dd43650d67c462ef0..a1754722e56f773f20dbd3cb61391bc74e7be659 100644
--- a/install/dist/conf/debian110.conf.php
+++ b/install/dist/conf/debian110.conf.php
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "7.4";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -68,6 +69,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/debian40.conf.php b/install/dist/conf/debian40.conf.php
index 653b979a6735aef6823fc5a8ad0af603ec65e90c..861585fe3c4f5ff6d1188b145772ec65e6f9003c 100644
--- a/install/dist/conf/debian40.conf.php
+++ b/install/dist/conf/debian40.conf.php
@@ -68,6 +68,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/debian60.conf.php b/install/dist/conf/debian60.conf.php
index 3577869bcd908616b54c7d4eb67756e01008f526..6c7c4403014487261f69009cad8e881e6d15ffa5 100644
--- a/install/dist/conf/debian60.conf.php
+++ b/install/dist/conf/debian60.conf.php
@@ -68,6 +68,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/debian90.conf.php b/install/dist/conf/debian90.conf.php
index 1abbf732a1201da6d2ef036bc5c60f8affdb7d83..64e22fea285a6a014027c531cdc9ca9b152d97ee 100644
--- a/install/dist/conf/debian90.conf.php
+++ b/install/dist/conf/debian90.conf.php
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "7.0";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -68,6 +69,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/debiantesting.conf.php b/install/dist/conf/debiantesting.conf.php
index 6564be0dab1be4dc5924ce9157a15496459b65c5..e2fa04f8ab9bf5b6b63ce234d941b65af3e32c91 100644
--- a/install/dist/conf/debiantesting.conf.php
+++ b/install/dist/conf/debiantesting.conf.php
@@ -32,7 +32,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 //* Main
 $conf['language'] = 'en';
-$conf['distname'] = 'debian110';
+$conf['distname'] = 'debian120';
 $conf['hostname'] = 'server1.domain.tld'; // Full hostname
 $conf['ispconfig_install_dir'] = '/usr/local/ispconfig';
 $conf['ispconfig_config_dir'] = '/usr/local/ispconfig';
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "8.1";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -68,6 +69,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/fedora32.conf.php b/install/dist/conf/fedora32.conf.php
index 0280959988e0a2a8ef4ad57d354580dd350aba17..8e05e8f732618bea8704bc408ddc96f189f22d31 100644
--- a/install/dist/conf/fedora32.conf.php
+++ b/install/dist/conf/fedora32.conf.php
@@ -68,6 +68,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/fedora33.conf.php b/install/dist/conf/fedora33.conf.php
index 677731c01e20c4c184218777e3c6e55f1b303b5e..05b0795afa9998faf0ef59aa67481202e4758a98 100644
--- a/install/dist/conf/fedora33.conf.php
+++ b/install/dist/conf/fedora33.conf.php
@@ -68,6 +68,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/fedora9.conf.php b/install/dist/conf/fedora9.conf.php
index c05d21a155ee3545dafab4fb647b62d81bada6d8..49802db9d6e59beb1ba6527b2f8557e505e798a6 100644
--- a/install/dist/conf/fedora9.conf.php
+++ b/install/dist/conf/fedora9.conf.php
@@ -66,6 +66,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/gentoo.conf.php b/install/dist/conf/gentoo.conf.php
index 057d397796d931fe54a7a962227be66fe03a95e0..fbd169752a84b129eccb44800d6749f88b2b3d99 100644
--- a/install/dist/conf/gentoo.conf.php
+++ b/install/dist/conf/gentoo.conf.php
@@ -51,6 +51,8 @@ $conf['services']['dns'] = true;
 $conf['services']['file'] = true;
 $conf['services']['db'] = true;
 $conf['services']['vserver'] = true;
+$conf['services']['proxy'] = false;
+$conf['services']['firewall'] = false;
 
 //* MySQL
 $conf['mysql']['installed'] = false; // will be detected automatically during installation
@@ -66,6 +68,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
@@ -80,7 +83,7 @@ $conf['apache']['installed'] = false; // will be detected automatically during i
 $conf['apache']['user'] = 'apache';
 $conf['apache']['group'] = 'apache';
 $conf['apache']['init_script'] = 'apache2';
-$conf['apache']['version'] = '2.2';
+$conf['apache']['version'] = '2.4';
 $conf['apache']['config_dir'] = '/etc/apache2';
 $conf['apache']['config_file'] = $conf['apache']['config_dir'] .'/httpd.conf';
 $conf['apache']['ssl_dir'] = '/etc/ssl/apache2';
@@ -88,8 +91,8 @@ $conf['apache']['vhost_conf_dir'] = $conf['apache']['config_dir'] . '/vhosts.d';
 $conf['apache']['vhost_conf_enabled_dir'] = $conf['apache']['vhost_conf_dir'];
 $conf['apache']['vhost_default'] = '00_default_vhost.conf';
 $conf['apache']['vhost_port'] = '8080';
-$conf['apache']['php_ini_path_apache'] = '/etc/php/apache2-php5/php.ini';
-$conf['apache']['php_ini_path_cgi'] = '/etc/php/cgi-php5/php.ini';
+$conf['apache']['php_ini_path_apache'] = '/etc/php/apache2-php7.4/php.ini';
+$conf['apache']['php_ini_path_cgi'] = '/etc/php/cgi-php7.4/php.ini';
 
 //* Website base settings
 $conf['web']['website_basedir'] = '/var/www';
@@ -110,7 +113,7 @@ $conf['awstats']['pl'] = '/usr/bin/awstats.pl';
 $conf['awstats']['buildstaticpages_pl'] = '/usr/bin/awstats_buildstaticpages.pl';
 
 //* Fastcgi
-$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/cgi-php5';
+$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/cgi-php7.4';
 $conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/';
 $conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi';
 
@@ -131,6 +134,10 @@ $conf['mailman']['installed'] = false; // will be detected automatically during
 $conf['mailman']['config_dir'] = '/etc/mailman';
 $conf['mailman']['init_script'] = 'mailman';
 
+//* mlmmj
+$conf['mlmmj']['installed'] = false; // will be detected automatically during installation
+$conf['mlmmj']['config_dir'] = '/etc/mlmmj';
+
 //* Getmail
 $conf['getmail']['installed'] = false; // will be detected automatically during installation
 $conf['getmail']['user'] = 'getmail';
@@ -176,6 +183,7 @@ $conf['pureftpd']['installed'] = false; // will be detected automatically during
 $conf['pureftpd']['config_file'] = '/etc/conf.d/pure-ftpd';
 $conf['pureftpd']['mysql_config_file'] = '/etc/pureftpd-mysql.conf';
 $conf['pureftpd']['init_script'] = 'pure-ftpd';
+$conf['pureftpd']['main_config_file'] = '/etc/pure-ftpd.conf';
 
 //* MyDNS
 $conf['mydns']['installed'] = false; // will be detected automatically during installation
@@ -226,6 +234,13 @@ $conf['nginx']['php_fpm_pool_dir'] = '/etc/php5/fpm/pool.d';
 $conf['nginx']['php_fpm_start_port'] = 9010;
 $conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php5-fpm';
 
+//* OpenVZ
+$conf['openvz']['installed'] = false;
+
+//*Bastille-Firwall
+$conf['bastille']['installed'] = false;
+$conf['bastille']['config_dir'] = '/etc/Bastille';
+
 //* vlogger
 $conf['vlogger']['config_dir'] = '/etc/vlogger';
 
@@ -235,10 +250,12 @@ $conf['cron']['crontab_dir'] = '/etc/cron.d';
 $conf['cron']['group'] = 'cron';
 $conf['cron']['wget'] = '/usr/bin/wget';
 
-//* OpenVZ
-$conf['openvz']['installed'] = false;
+//* Metronome XMPP
+$conf['xmpp']['installed'] = false;
+$conf['xmpp']['init_script'] = 'metronome';
 
 // AppArmor
 $conf['apparmor']['installed'] = false;
 
+
 ?>
diff --git a/install/dist/conf/opensuse110.conf.php b/install/dist/conf/opensuse110.conf.php
index ac4f5a3e1850cf708199050e80d8c2bbdee2916d..0bdb1e4772df276ab098e8ee79696dfed11da3a6 100644
--- a/install/dist/conf/opensuse110.conf.php
+++ b/install/dist/conf/opensuse110.conf.php
@@ -66,6 +66,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/opensuse112.conf.php b/install/dist/conf/opensuse112.conf.php
index eda4879004b23af81d6c9db6127b6c1b94697ba6..58cc77c4f23e85509faf7f9ccdf4b68954dc0791 100644
--- a/install/dist/conf/opensuse112.conf.php
+++ b/install/dist/conf/opensuse112.conf.php
@@ -66,6 +66,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(uniqid(rand()));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/ubuntu1604.conf.php b/install/dist/conf/ubuntu1604.conf.php
index 1893a93fbf09516e25b3e2cc0f2cbc6f22f7c187..3758eeff30619b46dfdaef8eb8ae1e152a695238 100644
--- a/install/dist/conf/ubuntu1604.conf.php
+++ b/install/dist/conf/ubuntu1604.conf.php
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "7.0";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -68,6 +69,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/ubuntu1710.conf.php b/install/dist/conf/ubuntu1710.conf.php
index b37c91291f2182fd4cc7b506f4b657cc8c3608fd..26b575888f3dccf2d1b284281013b82cb20020b8 100644
--- a/install/dist/conf/ubuntu1710.conf.php
+++ b/install/dist/conf/ubuntu1710.conf.php
@@ -68,6 +68,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/ubuntu1804.conf.php b/install/dist/conf/ubuntu1804.conf.php
index 9c2721141329f762368f14003efd67243b6f3c14..6dc51a13c77a776389002b1ed4485372b462eb31 100644
--- a/install/dist/conf/ubuntu1804.conf.php
+++ b/install/dist/conf/ubuntu1804.conf.php
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "7.2";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -68,6 +69,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/ubuntu2004.conf.php b/install/dist/conf/ubuntu2004.conf.php
index 72bf90d45eefb06f65a54ff05c28057f4e5c12f7..a55c9a004be57ee4ca99f61ce8a6025ae64736bf 100644
--- a/install/dist/conf/ubuntu2004.conf.php
+++ b/install/dist/conf/ubuntu2004.conf.php
@@ -28,7 +28,7 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-//***  Ubuntu 18.04 default settings
+//***  Ubuntu 20.04 default settings
 
 //* Main
 $conf['language'] = 'en';
@@ -43,6 +43,7 @@ $conf['init_scripts'] = '/etc/init.d';
 $conf['runlevel'] = '/etc';
 $conf['shells'] = '/etc/shells';
 $conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "7.4";
 
 //* Services provided by this server, this selection will be overridden by the expert mode
 $conf['services']['mail'] = true;
@@ -68,6 +69,7 @@ $conf['mysql']['ispconfig_user'] = 'ispconfig';
 $conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
 $conf['mysql']['master_slave_setup'] = 'n';
 $conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
 $conf['mysql']['master_database'] = 'dbispconfig';
 $conf['mysql']['master_admin_user'] = 'root';
 $conf['mysql']['master_admin_password'] = '';
diff --git a/install/dist/conf/ubuntu2204.conf.php b/install/dist/conf/ubuntu2204.conf.php
new file mode 100644
index 0000000000000000000000000000000000000000..050f58f69d479acffc8dd72b038946de4fa929af
--- /dev/null
+++ b/install/dist/conf/ubuntu2204.conf.php
@@ -0,0 +1,240 @@
+<?php
+
+/*
+Copyright (c) 2022, Till Brehm, ISPConfig UG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+//***  Ubuntu 22.04 default settings
+
+//* Main
+$conf['language'] = 'en';
+$conf['distname'] = 'ubuntu2204';
+$conf['hostname'] = 'server1.domain.tld'; // Full hostname
+$conf['ispconfig_install_dir'] = '/usr/local/ispconfig';
+$conf['ispconfig_config_dir'] = '/usr/local/ispconfig';
+$conf['ispconfig_log_priority'] = 2;  // 0 = Debug, 1 = Warning, 2 = Error
+$conf['ispconfig_log_dir'] = '/var/log/ispconfig';
+$conf['server_id'] = 1;
+$conf['init_scripts'] = '/etc/init.d';
+$conf['runlevel'] = '/etc';
+$conf['shells'] = '/etc/shells';
+$conf['pam'] = '/etc/pam.d';
+$conf['default_php'] = "8.1";
+
+//* Services provided by this server, this selection will be overridden by the expert mode
+$conf['services']['mail'] = true;
+$conf['services']['web'] = true;
+$conf['services']['dns'] = true;
+$conf['services']['file'] = true;
+$conf['services']['db'] = true;
+$conf['services']['vserver'] = true;
+$conf['services']['proxy'] = false;
+$conf['services']['firewall'] = false;
+
+//* MySQL
+$conf['mysql']['installed'] = false; // will be detected automatically during installation
+$conf['mysql']['init_script'] = 'mysql';
+$conf['mysql']['host'] = 'localhost';
+$conf['mysql']['ip'] = '127.0.0.1';
+$conf['mysql']['port'] = '3306';
+$conf['mysql']['database'] = 'dbispconfig';
+$conf['mysql']['admin_user'] = 'root';
+$conf['mysql']['admin_password'] = '';
+$conf['mysql']['charset'] = 'utf8';
+$conf['mysql']['ispconfig_user'] = 'ispconfig';
+$conf['mysql']['ispconfig_password'] = md5(random_bytes(20));
+$conf['mysql']['master_slave_setup'] = 'n';
+$conf['mysql']['master_host'] = '';
+$conf['mysql']['master_port'] = '3306';
+$conf['mysql']['master_database'] = 'dbispconfig';
+$conf['mysql']['master_admin_user'] = 'root';
+$conf['mysql']['master_admin_password'] = '';
+$conf['mysql']['master_ispconfig_user'] = '';
+$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20));
+
+//* Apache
+$conf['apache']['installed'] = false; // will be detected automatically during installation
+$conf['apache']['user'] = 'www-data';
+$conf['apache']['group'] = 'www-data';
+$conf['apache']['init_script'] = 'apache2';
+$conf['apache']['version'] = '2.4';
+$conf['apache']['vhost_conf_dir'] = '/etc/apache2/sites-available';
+$conf['apache']['vhost_conf_enabled_dir'] = '/etc/apache2/sites-enabled';
+$conf['apache']['vhost_port'] = '8080';
+$conf['apache']['php_ini_path_apache'] = '/etc/php/8.1/apache2/php.ini';
+$conf['apache']['php_ini_path_cgi'] = '/etc/php/8.1/cgi/php.ini';
+
+//* Website base settings
+$conf['web']['website_basedir'] = '/var/www';
+$conf['web']['website_path'] = '/var/www/clients/client[client_id]/web[website_id]';
+$conf['web']['website_symlinks'] = '/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/';
+
+//* Apps base settings
+$conf['web']['apps_vhost_ip'] = '_default_';
+$conf['web']['apps_vhost_port'] = '8081';
+$conf['web']['apps_vhost_servername'] = '';
+$conf['web']['apps_vhost_user'] = 'ispapps';
+$conf['web']['apps_vhost_group'] = 'ispapps';
+
+//* Fastcgi
+$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/8.1/cgi/';
+$conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/';
+$conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi';
+
+//* Postfix
+$conf['postfix']['installed'] = false; // will be detected automatically during installation
+$conf['postfix']['config_dir'] = '/etc/postfix';
+$conf['postfix']['init_script'] = 'postfix';
+$conf['postfix']['user'] = 'postfix';
+$conf['postfix']['group'] = 'postfix';
+$conf['postfix']['vmail_userid'] = '5000';
+$conf['postfix']['vmail_username'] = 'vmail';
+$conf['postfix']['vmail_groupid'] = '5000';
+$conf['postfix']['vmail_groupname'] = 'vmail';
+$conf['postfix']['vmail_mailbox_base'] = '/var/vmail';
+
+//* Mailman
+$conf['mailman']['installed'] = false; // will be detected automatically during installation
+$conf['mailman']['config_dir'] = '/etc/mailman';
+$conf['mailman']['init_script'] = 'mailman';
+
+//* Getmail
+$conf['getmail']['installed'] = false; // will be detected automatically during installation
+$conf['getmail']['config_dir'] = '/etc/getmail';
+$conf['getmail']['program'] = '/usr/bin/getmail';
+
+//* Courier
+$conf['courier']['installed'] = false; // will be detected automatically during installation
+$conf['courier']['config_dir'] = '/etc/courier';
+$conf['courier']['courier-authdaemon'] = 'courier-authdaemon';
+$conf['courier']['courier-imap'] = 'courier-imap';
+$conf['courier']['courier-imap-ssl'] = 'courier-imap-ssl';
+$conf['courier']['courier-pop'] = 'courier-pop';
+$conf['courier']['courier-pop-ssl'] = 'courier-pop-ssl';
+
+//* Dovecot
+$conf['dovecot']['installed'] = false; // will be detected automatically during installation
+$conf['dovecot']['config_dir'] = '/etc/dovecot';
+$conf['dovecot']['init_script'] = 'dovecot';
+
+//* SASL
+$conf['saslauthd']['installed'] = false; // will be detected automatically during installation
+$conf['saslauthd']['config'] = '/etc/default/saslauthd';
+$conf['saslauthd']['init_script'] = 'saslauthd';
+
+//* Amavisd
+$conf['amavis']['installed'] = false; // will be detected automatically during installation
+$conf['amavis']['config_dir'] = '/etc/amavis';
+$conf['amavis']['init_script'] = 'amavis';
+
+//* Rspamd
+$conf['rspamd']['installed'] = false; // will be detected automatically during installation
+$conf['rspamd']['config_dir'] = '/etc/rspamd';
+$conf['rspamd']['init_script'] = 'rspamd';
+
+//* ClamAV
+$conf['clamav']['installed'] = false; // will be detected automatically during installation
+$conf['clamav']['init_script'] = 'clamav-daemon';
+
+//* Pureftpd
+$conf['pureftpd']['installed'] = false; // will be detected automatically during installation
+$conf['pureftpd']['config_dir'] = '/etc/pure-ftpd';
+$conf['pureftpd']['init_script'] = 'pure-ftpd-mysql';
+
+//* MyDNS
+$conf['mydns']['installed'] = false; // will be detected automatically during installation
+$conf['mydns']['config_dir'] = '/etc';
+$conf['mydns']['init_script'] = 'mydns';
+
+//* PowerDNS
+$conf['powerdns']['installed'] = false; // will be detected automatically during installation
+$conf['powerdns']['database'] = 'powerdns';
+$conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
+$conf['powerdns']['init_script'] = 'pdns';
+
+//* BIND DNS Server
+$conf['bind']['installed'] = false; // will be detected automatically during installation
+$conf['bind']['bind_user'] = 'root';
+$conf['bind']['bind_group'] = 'bind';
+$conf['bind']['bind_zonefiles_dir'] = '/etc/bind';
+$conf['bind']['named_conf_path'] = '/etc/bind/named.conf';
+$conf['bind']['named_conf_local_path'] = '/etc/bind/named.conf.local';
+$conf['bind']['init_script'] = 'bind9';
+
+//* Jailkit
+$conf['jailkit']['installed'] = false; // will be detected automatically during installation
+$conf['jailkit']['config_dir'] = '/etc/jailkit';
+$conf['jailkit']['jk_init'] = 'jk_init.ini';
+$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
+$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico /usr/bin/mysql /usr/bin/mysqldump /usr/bin/git /usr/bin/git-receive-pack /usr/bin/git-upload-pack /usr/bin/unzip /usr/bin/zip /bin/tar /bin/rm /usr/bin/patch /etc/localtime';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+
+//* Squid
+$conf['squid']['installed'] = false; // will be detected automatically during installation
+$conf['squid']['config_dir'] = '/etc/squid';
+$conf['squid']['init_script'] = 'squid';
+
+//* Nginx
+$conf['nginx']['installed'] = false; // will be detected automatically during installation
+$conf['nginx']['user'] = 'www-data';
+$conf['nginx']['group'] = 'www-data';
+$conf['nginx']['config_dir'] = '/etc/nginx';
+$conf['nginx']['vhost_conf_dir'] = '/etc/nginx/sites-available';
+$conf['nginx']['vhost_conf_enabled_dir'] = '/etc/nginx/sites-enabled';
+$conf['nginx']['init_script'] = 'nginx';
+$conf['nginx']['vhost_port'] = '8080';
+$conf['nginx']['cgi_socket'] = '/var/run/fcgiwrap.socket';
+$conf['nginx']['php_fpm_init_script'] = 'php8.1-fpm';
+$conf['nginx']['php_fpm_ini_path'] = '/etc/php/8.1/fpm/php.ini';
+$conf['nginx']['php_fpm_pool_dir'] = '/etc/php/8.1/fpm/pool.d';
+$conf['nginx']['php_fpm_start_port'] = 9010;
+$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php8.1-fpm';
+
+//* OpenVZ
+$conf['openvz']['installed'] = false;
+
+//*Bastille-Firwall
+$conf['bastille']['installed'] = false;
+$conf['bastille']['config_dir'] = '/etc/Bastille';
+
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'cron';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
+
+//* Metronome XMPP
+$conf['xmpp']['installed'] = false;
+$conf['xmpp']['init_script'] = 'metronome';
+
+
+// AppArmor
+$conf['apparmor']['installed'] = false;
+
+?>
\ No newline at end of file
diff --git a/install/dist/lib/centos90.lib.php b/install/dist/lib/centos90.lib.php
new file mode 100644
index 0000000000000000000000000000000000000000..3dcd7494d3326bd3618d229c950518e8c200f3e4
--- /dev/null
+++ b/install/dist/lib/centos90.lib.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+Copyright (c) 2014, Till Brehm, ISPConfig UG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once realpath(dirname(__FILE__)) . '/centos_base.lib.php';
+
+class installer extends installer_centos {
+
+	protected $clamav_socket = '/var/run/clamd.amavisd/clamd.sock';
+	
+	// everything else is inherited from installer_centos class
+}
+
+?>
diff --git a/install/dist/tpl/gentoo/apache_ispconfig.vhost.master b/install/dist/tpl/gentoo/apache_ispconfig.vhost.master
index 01b3b383d572c4de38036ecaeadafcc079cd8e8c..e885b381bc994bfb973572aa3b9a5bc56fcb98b1 100644
--- a/install/dist/tpl/gentoo/apache_ispconfig.vhost.master
+++ b/install/dist/tpl/gentoo/apache_ispconfig.vhost.master
@@ -6,7 +6,7 @@
 
 {vhost_port_listen} Listen {vhost_port}
 <tmpl_if name='apache_version' op='<' value='2.4' format='version'>
-  NameVirtualHost *:{vhost_port}
+  # NameVirtualHost *:{vhost_port}
 </tmpl_if>
 
 <VirtualHost _default_:{vhost_port}>
diff --git a/install/install.php b/install/install.php
index 9cc6bb5fa7db8127355fa62711428fe6bd4fbde3..64d05feecd8093a7df9b42af4ab563b96cfce7b8 100644
--- a/install/install.php
+++ b/install/install.php
@@ -508,6 +508,9 @@ if($conf['apparmor']['installed']){
 
 if($install_mode == 'standard' || strtolower($inst->simple_query('Configure Firewall Server', array('y', 'n'), 'y','configure_firewall')) == 'y') {
 	//* Check for Firewall
+	if(!isset($conf['firewall']['installed'])) {
+		$conf['firewall']['installed'] = false;
+	}
 	if(!$conf['ufw']['installed'] && !$conf['firewall']['installed']) {
 		$conf['ufw']['installed'] = $inst->force_configure_app('Ubuntu Firewall', ($install_mode == 'expert'));
 		$conf['firewall']['installed'] = $inst->force_configure_app('Bastille Firewall', ($install_mode == 'expert'));
@@ -631,12 +634,12 @@ swriteln('Detect IP addresses');
 $inst->detect_ips();
 
 swriteln('Restarting services ...');
-if($conf['mysql']['installed'] == true && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1');
-if($conf['postfix']['installed'] == true && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart'));
-if($conf['saslauthd']['installed'] == true && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart'));
-if($conf['amavis']['installed'] == true && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart'));
-if($conf['rspamd']['installed'] == true && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart'));
-if($conf['clamav']['installed'] == true && $conf['clamav']['init_script'] != '' && $conf['amavis']['installed'] == true) system($inst->getinitcommand($conf['clamav']['init_script'], 'restart'));
+if($conf['mysql']['installed'] == true && isset($conf['mysql']['init_script']) && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1');
+if($conf['postfix']['installed'] == true && isset($conf['postfix']['init_script']) && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart'));
+if($conf['saslauthd']['installed'] == true && isset($conf['saslauthd']['init_script']) && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart'));
+if($conf['amavis']['installed'] == true && isset($conf['amavis']['init_script']) && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart'));
+if($conf['rspamd']['installed'] == true && isset($conf['rspamd']['init_script']) && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart'));
+if($conf['clamav']['installed'] == true && isset($conf['clamav']['init_script']) && $conf['clamav']['init_script'] != '' && $conf['amavis']['installed'] == true) system($inst->getinitcommand($conf['clamav']['init_script'], 'restart'));
 if($conf['courier']['installed'] == true){
 	if($conf['courier']['courier-authdaemon'] != '') system($inst->getinitcommand($conf['courier']['courier-authdaemon'], 'restart'));
 	if($conf['courier']['courier-imap'] != '') system($inst->getinitcommand($conf['courier']['courier-imap'], 'restart'));
@@ -644,22 +647,22 @@ if($conf['courier']['installed'] == true){
 	if($conf['courier']['courier-pop'] != '') system($inst->getinitcommand($conf['courier']['courier-pop'], 'restart'));
 	if($conf['courier']['courier-pop-ssl'] != '') system($inst->getinitcommand($conf['courier']['courier-pop-ssl'], 'restart'));
 }
-if($conf['dovecot']['installed'] == true && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart'));
-if($conf['mailman']['installed'] == true && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &');
-if($conf['apache']['installed'] == true && $conf['apache']['init_script'] != '') system($inst->getinitcommand($conf['apache']['init_script'], 'restart'));
+if($conf['dovecot']['installed'] == true && isset($conf['dovecot']['init_script']) && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart'));
+if($conf['mailman']['installed'] == true && isset($conf['mailman']['init_script']) && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &');
+if($conf['apache']['installed'] == true && isset($conf['apache']['init_script']) && $conf['apache']['init_script'] != '') system($inst->getinitcommand($conf['apache']['init_script'], 'restart'));
 //* Reload is enough for nginx
 if($conf['nginx']['installed'] == true){
 	if($conf['nginx']['php_fpm_init_script'] != '') system($inst->getinitcommand($conf['nginx']['php_fpm_init_script'], 'reload'));
-	if($conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload'));
+	if(isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload'));
 }
-if($conf['pureftpd']['installed'] == true && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart'));
-if($conf['mydns']['installed'] == true && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null');
-if($conf['powerdns']['installed'] == true && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null');
-if($conf['bind']['installed'] == true && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null');
-//if($conf['squid']['installed'] == true && $conf['squid']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['squid']['init_script']))     system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null');
-if($conf['nginx']['installed'] == true && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null');
-if($conf['ufw']['installed'] == true && $conf['ufw']['init_script'] != '') system($inst->getinitcommand($conf['ufw']['init_script'], 'restart').' &> /dev/null');
-if($conf['xmpp']['installed'] == true && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null');
+if($conf['pureftpd']['installed'] == true && isset($conf['pureftpd']['init_script']) && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart'));
+if($conf['mydns']['installed'] == true && isset($conf['mydns']['init_script']) && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null');
+if($conf['powerdns']['installed'] == true && isset($conf['powerdns']['init_script']) && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null');
+if($conf['bind']['installed'] == true && isset($conf['bind']['init_script']) && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null');
+//if($conf['squid']['installed'] == true && isset($conf['squid']['init_script']) && $conf['squid']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['squid']['init_script']))     system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null');
+if($conf['nginx']['installed'] == true && isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null');
+if($conf['ufw']['installed'] == true && isset($conf['ufw']['init_script']) && $conf['ufw']['init_script'] != '') system($inst->getinitcommand($conf['ufw']['init_script'], 'restart').' &> /dev/null');
+if($conf['xmpp']['installed'] == true && isset($conf['xmpp']['init_script']) && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null');
 
 
 $inst->create_mount_script();
diff --git a/install/lib/classes/tpl.inc.php b/install/lib/classes/tpl.inc.php
index 5bd8ded1f8818f2e1bb8b6d473d479facc1a0db0..2bea1e1fd5474a0dcdfcc53da56a67fcf9e031a7 100644
--- a/install/lib/classes/tpl.inc.php
+++ b/install/lib/classes/tpl.inc.php
@@ -931,7 +931,7 @@ if (!defined('vlibTemplateClassLoaded')) {
 		{
 			array_push($this->_namespace, $varname);
 			$tempvar = count($this->_namespace) - 1;
-			$retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars";
+			$retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < \$this->_tpl_count(\$this->_arrvars";
 			for ($i=0; $i < count($this->_namespace); $i++) {
 				$retstr .= "['".$this->_namespace[$i]."']";
 				if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]";
@@ -1170,7 +1170,15 @@ if (!defined('vlibTemplateClassLoaded')) {
 
 			array_push($this->_currentincludedir, dirname($this->_tmplfilename));
 			$this->_includedepth++;
-			$success = @eval($this->_tmplfilep);
+			try {
+				$success = @eval($this->_tmplfilep);
+			} catch(Exception $ex) {
+				print $this->_tmplfilep;
+				throw $ex;
+			} catch(TypeError $ex) {
+				print $this->_tmplfilep;
+				throw $ex;
+			}
 			$this->_includedepth--;
 			array_pop($this->_currentincludedir);
 
@@ -1268,6 +1276,27 @@ if (!defined('vlibTemplateClassLoaded')) {
 			return $return;
 		}
 
+		/**
+		* Used during in evaled code to replace PHP count function for PHP 8 compatibility
+		* @var variable to be counted
+		*/
+		private function _tpl_count($var)
+		{
+			$retvar = 0;
+			if(isset($var)) {
+				if(is_array($var)) {
+					$retvar = count($var);
+				} elseif(is_null($var)) {
+					$retvar = 0;
+				} else {
+					$retvar = 1;
+				}
+			} else {
+				$retvar = 0;
+			}
+			return $retvar;
+		}
+
 		/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     The following functions have no use and are included just so that if the user
     is making use of vlibTemplateCache functions, this doesn't crash when changed to
diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php
index d9b482a842f835cd9feed7e52da9894c06d7fae6..10de1d8fbf585ca698a782dc834e02c035a6444f 100644
--- a/install/lib/install.lib.php
+++ b/install/lib/install.lib.php
@@ -98,6 +98,10 @@ function get_distname() {
 				$mainver = current($mainver).'.'.next($mainver);
 			}
 			switch ($mainver){
+			case "22.04":
+				$relname = "(Jammy Jellyfish)";
+				$distconfid = 'ubuntu2204';
+				break;
 			case "20.04":
 				$relname = "(Focal Fossa)";
 				$distconfid = 'ubuntu2004';
@@ -295,88 +299,93 @@ function get_distname() {
 	}
 
 	//** RHEL (including compatible clones) & Fedora
-        elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) {
-
-		$content = file_get_contents('/etc/os-release');
-
-		preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname);
-		preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name);
-		preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version);
-		preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid);
-
-                if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) {
-                        $distname = 'Fedora';
-                        $distver = '32';
-                        $distid = 'fedora32';
-                        $distbaseid = 'fedora';
-                        swriteln("Operating System: Fedora 32 or compatible\n");
-                } elseif(stristr($prettyname[0], 'Fedora 33 (Thirty Three)')) {
-                        $distname = 'Fedora';
-                        $distver = '33';
-                        $distid = 'fedora33';
-                        $distbaseid = 'fedora';
-                        swriteln("Operating System: Fedora 33 or compatible\n");
-                //** RHEL 7 and compatible clones
-                } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) {
-                        preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version);
-                        $distname = $name[0];
-                        $distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0];
-                        $distid = 'centos72';
-			$distbaseid = 'fedora';
-                        swriteln("Operating System: " . $distname . " " .  $distver . "\n");
-		//** RHEL 8 and compatible clones
-                } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) {
-                        $distname = $name[0];
-                        $distver = $version[0];
-                        $distid = 'centos80';
-                        $distbaseid = 'fedora';
-                        swriteln("Operating System: " . $prettyname[0] . "\n");
-		} else {
-                        $distname = 'Redhat';
-                        $distver = 'Unknown';
-                        $distid = 'fedora9';
-                        $distbaseid = 'fedora';
-                        swriteln("Operating System: Redhat or compatible\n");
-		}
+	elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) {
+
+	$content = file_get_contents('/etc/os-release');
+
+	preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname);
+	preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name);
+	preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version);
+	preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid);
+
+	if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) {
+		$distname = 'Fedora';
+		$distver = '32';
+		$distid = 'fedora32';
+		$distbaseid = 'fedora';
+		swriteln("Operating System: Fedora 32 or compatible\n");
+	} elseif(stristr($prettyname[0], 'Fedora 33 (Thirty Three)')) {
+		$distname = 'Fedora';
+		$distver = '33';
+		$distid = 'fedora33';
+		$distbaseid = 'fedora';
+		swriteln("Operating System: Fedora 33 or compatible\n");
+	//** RHEL 7 and compatible clones
+	} elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) {
+		preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version);
+		$distname = $name[0];
+		$distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0];
+		$distid = 'centos72';
+		$distbaseid = 'fedora';
+		swriteln("Operating System: " . $distname . " " .  $distver . "\n");
+	//** RHEL 8 and compatible clones
+	} elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) {
+		$distname = $name[0];
+		$distver = $version[0];
+		$distid = 'centos80';
+		$distbaseid = 'fedora';
+		swriteln("Operating System: " . $prettyname[0] . "\n");
+	//** RHEL 9 and compatible clones
+	} elseif(preg_match('/^(?:9|9\.[0-9]{1,2})$/', $versionid[0])) {
+		$distname = $name[0];
+		$distver = $version[0];
+		$distid = 'centos90';
+		$distbaseid = 'fedora';
+		swriteln("Operating System: " . $prettyname[0] . "\n");
+	} else {
+		$distname = 'Redhat';
+		$distver = 'Unknown';
+		$distid = 'fedora9';
+		$distbaseid = 'fedora';
+		swriteln("Operating System: Redhat or compatible\n");
+	}
 	//** CentOS 6
-        } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) {
+	} elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) {
 
-                $content = file_get_contents('/etc/redhat-release');
+		$content = file_get_contents('/etc/redhat-release');
 
-                if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
-                        preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version);
-                        $distname = 'CentOS Linux';
+		if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
+			preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version);
+			$distname = 'CentOS Linux';
 			$distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6';
 			$distid = 'centos53';
 			$distbaseid = 'fedora';
-                        swriteln("Operating System: " . $distname . " " .  $distver . "\n");
-
-                } else {
-                        $distname = 'Redhat';
-                        $distver = 'Unknown';
-                        $distid = 'fedora9';
-                        $distbaseid = 'fedora';
-                }
+			swriteln("Operating System: " . $distname . " " .  $distver . "\n");
+        } else {
+			$distname = 'Redhat';
+			$distver = 'Unknown';
+			$distid = 'fedora9';
+			$distbaseid = 'fedora';
+		}
 	//** CentOS 6 Extended Lifecycle Support by CloudLinux
-        } elseif(file_exists('/etc/redhat-release') && file_exists('/etc/els-release') && !file_exists('/etc/os-release')) {
+	} elseif(file_exists('/etc/redhat-release') && file_exists('/etc/els-release') && !file_exists('/etc/os-release')) {
 
-                $content = file_get_contents('/etc/els-release');
+		$content = file_get_contents('/etc/els-release');
 
-                if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
-                        preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version);
-                        $distname = 'CentOS Linux';
-                        $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6';
-                        $distid = 'centos53';
+		if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
+			preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version);
+			$distname = 'CentOS Linux';
+			$distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6';
+			$distid = 'centos53';
 			$distbaseid = 'fedora';
-                        swriteln("Operating System: " . $distname . " " .  $distver . "\n");
-                } else {
-                        $distname = 'Redhat';
-                        $distver = 'Unknown';
-                        $distid = 'fedora9';
-                        $distbaseid = 'fedora';
-                }
-        }
-
+			swriteln("Operating System: " . $distname . " " .  $distver . "\n");
+		} else {
+			$distname = 'Redhat';
+			$distver = 'Unknown';
+			$distid = 'fedora9';
+			$distbaseid = 'fedora';
+		}
+	}
 
 	//** Gentoo
 	elseif(file_exists('/etc/gentoo-release')) {
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 71753a6b3317276d0c936954d346cfb53783b736..3d49c23871ef998815603259fb55932ef16351e6 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -52,7 +52,7 @@ class installer_base {
 	}
 
 	public function update_acme() {
-		$acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh'));
+		$acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh 2> /dev/null'));
 		$acme = reset($acme);
 		$val = 0;
 
@@ -83,13 +83,13 @@ class installer_base {
 		global $autoinstall, $autoupdate;
 		$finished = false;
 		do {
-			if($name != '' && $autoinstall[$name] != '') {
+			if($name != '' && isset($autoinstall[$name]) && $autoinstall[$name] != '') {
 				if($autoinstall[$name] == 'default') {
 					$input = $default;
 				} else {
 					$input = $autoinstall[$name];
 				}
-			} elseif($name != '' && $autoupdate[$name] != '') {
+			} elseif($name != '' && isset($autoupdate[$name]) && $autoupdate[$name] != '') {
 				if($autoupdate[$name] == 'default') {
 					$input = $default;
 				} else {
@@ -126,13 +126,13 @@ class installer_base {
 
 	public function free_query($query, $default, $name = '') {
 		global $autoinstall, $autoupdate;
-		if($name != '' && $autoinstall[$name] != '') {
+		if($name != '' && isset($autoinstall[$name]) && $autoinstall[$name] != '') {
 			if($autoinstall[$name] == 'default') {
 				$input = $default;
 			} else {
 				$input = $autoinstall[$name];
 			}
-		} elseif($name != '' && $autoupdate[$name] != '') {
+		} elseif($name != '' && isset($autoupdate[$name]) && $autoupdate[$name] != '') {
 			if($autoupdate[$name] == 'default') {
 				$input = $default;
 			} else {
@@ -246,10 +246,15 @@ class installer_base {
 
 	//** Check prerequisites
 	public function check_prerequisites() {
+		global $conf;
+		
 		$msg = '';
 
-		if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required. The currently used PHP version is ".phpversion().".\n";
-		if(version_compare(phpversion(), '8.0', '>=')) $msg .= "PHP Version 8 is not supported yet. Change PHP version back to the default version of the OS. The currently used PHP version is ".phpversion().".\n";
+		if ($conf['default_php'] != '') {
+			if(version_compare(phpversion('tidy'), $conf['default_php'], '==')) $msg .= "Your PHP version is not the OS default. Change the PHP version back to the default version of the OS. The currently used PHP version is " . phpversion() . "The default version for your OS is PHP " . $conf['default_php'] . ".\n";
+		}
+		if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required. The currently used PHP version is " . phpversion() . ".\n";
+		//if(version_compare(phpversion(), '8.2', '>=')) $msg .= "PHP Version 8.2+ is not supported yet. Change the PHP version back to the default version of the OS. The currently used PHP version is " . phpversion() . ".\n";
 		if(!function_exists('curl_init')) $msg .= "PHP Curl Module is missing.\n";
 		if(!function_exists('mysqli_connect')) $msg .= "PHP MySQLi Module is nmissing.\n";
 		if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is missing.\n";
@@ -892,6 +897,20 @@ class installer_base {
 	public function configure_mailman($status = 'insert') {
 		global $conf;
 
+		// Fix for #6314: bug on Debian 11 systems where Mailman3 is not available and broken routes exist in the Mailman config
+		$data_dir = '/var/lib/mailman';
+		if (($conf['mailman']['installed'] != true) && is_dir($data_dir)) {
+			rename($data_dir, $data_dir . '-bk');
+			//* Create the mailman files
+			if(!is_dir('/var/lib/mailman/data')) exec('mkdir -p /var/lib/mailman/data');
+			if(!is_file('/var/lib/mailman/data/aliases')) touch('/var/lib/mailman/data/aliases');
+			exec('postmap /var/lib/mailman/data/aliases');
+			if(!is_file('/var/lib/mailman/data/virtual-mailman')) touch('/var/lib/mailman/data/virtual-mailman');
+			exec('postmap /var/lib/mailman/data/virtual-mailman');
+			if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman');
+			exec('postmap /var/lib/mailman/data/transport-mailman');
+		}
+
 		$config_dir = $conf['mailman']['config_dir'].'/';
 		$full_file_name = $config_dir.'mm_cfg.py';
 		//* Backup exiting file
@@ -1054,6 +1073,14 @@ class installer_base {
 		return true;
 	}
 
+	public function get_postfix_version() {
+		//* Get postfix version
+		exec('postconf -d mail_version 2>&1', $out);
+		$postfix_version = preg_replace('/.*=\s*/', '', $out[0]);
+		unset($out);
+		return $postfix_version;
+	}
+
 	public function configure_postfix($options = '') {
 		global $conf,$autoinstall;
 		$cf = $conf['postfix'];
@@ -1063,10 +1090,7 @@ class installer_base {
 			$this->error("The postfix configuration directory '$config_dir' does not exist.");
 		}
 
-		//* Get postfix version
-		exec('postconf -d mail_version 2>&1', $out);
-		$postfix_version = preg_replace('/.*=\s*/', '', $out[0]);
-		unset($out);
+		$postfix_version = $this->get_postfix_version();
 
 		//* Install virtual mappings
 		foreach (glob('tpl/mysql-virtual_*.master') as $filename) {
@@ -1465,8 +1489,7 @@ class installer_base {
 
 		$config_dir = $conf['postfix']['config_dir'];
 		$quoted_config_dir = preg_quote($config_dir, '|');
-		$postfix_version = `postconf -d mail_version 2>/dev/null`;
-		$postfix_version = preg_replace( '/mail_version\s*=\s*(.*)\s*/', '$1', $postfix_version );
+		$postfix_version = $this->get_postfix_version();
 
 		//* Configure master.cf and add a line for deliver
 		if(!$this->get_postfix_service('dovecot', 'unix')) {
@@ -1507,7 +1530,7 @@ class installer_base {
 			}
 			$new_options[] = $value;
 		}
-		if ($configure_lmtp && $conf['mail']['content_filter'] === 'amavisd') {
+		if ($configure_lmtp && (!isset($conf['mail']['content_filter']) || $conf['mail']['content_filter'] === 'amavisd')) {
 			for ($i = 0; isset($new_options[$i]); $i++) {
 				if ($new_options[$i] == 'reject_unlisted_recipient') {
 					array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${config_dir}/mysql-verify_recipients.cf"));
@@ -1577,20 +1600,24 @@ class installer_base {
 
 				// Check if we have a dhparams file and if not, create it
 				if(!file_exists('/etc/dovecot/dh.pem')) {
+					// Create symlink to ISPConfig dhparam file
+					swriteln('Creating symlink /etc/dovecot/dh.pem to ISPConfig DHParam file.');
+					symlink('/usr/local/ispconfig/interface/ssl/dhparam4096.pem', '/etc/dovecot/dh.pem');
+
+					/*
 					swriteln('Creating new DHParams file, this takes several minutes. Do not interrupt the script.');
 					if(file_exists('/var/lib/dovecot/ssl-parameters.dat')) {
 						// convert existing ssl parameters file
 						$command = 'dd if=/var/lib/dovecot/ssl-parameters.dat bs=1 skip=88 | openssl dhparam -inform der > /etc/dovecot/dh.pem';
 						caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
 					} else {
-						/*
-						   Create a new dhparams file. We use 2048 bit only as it simply takes too long
-						   on smaller systems to generate a 4096 bit dh file (> 30 minutes). If you need
-						   a 4096 bit file, create it manually before you install ISPConfig
-						*/
+						//Create a new dhparams file. We use 2048 bit only as it simply takes too long
+						//   on smaller systems to generate a 4096 bit dh file (> 30 minutes). If you need
+						//   a 4096 bit file, create it manually before you install ISPConfig
 						$command = 'openssl dhparam -out /etc/dovecot/dh.pem 2048';
 						caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
 					}
+					*/
 				}
 				//remove #2.3+ comment
 				$content = file_get_contents($config_dir.'/'.$configfile);
@@ -1653,7 +1680,7 @@ class installer_base {
 		//* These postconf commands will be executed on installation and update
 		$server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']);
 		$server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
-		$mail_server = ($server_ini_rec['mail_server']) ? true : false;
+		$mail_server = $conf['services']['mail'];
 		unset($server_ini_rec);
 
 		// amavisd user config file
@@ -1708,6 +1735,7 @@ class installer_base {
 						break;
 					}
 				}
+				$postfix_version = $this->get_postfix_version();
 				# postfix < 3.3 needs this when using reject_unverified_recipient:
 				if(version_compare($postfix_version, 3.3, '<')) {
 					$postconf_commands[] = "enable_original_recipient = yes";
@@ -1777,7 +1805,7 @@ class installer_base {
 		//* These postconf commands will be executed on installation and update
 		$server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']);
 		$server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
-		$mail_server = ($server_ini_rec['mail_server']) ? true : false;
+		$mail_server = $conf['services']['mail'];
 		unset($server_ini_rec);
 
 		$config_dir = $conf['postfix']['config_dir'];
@@ -1914,10 +1942,10 @@ class installer_base {
 			}
 
 			$tpl->setVar('dkim_path', $mail_config['dkim_path']);
-			$tpl->setVar('rspamd_redis_servers', $mail_config['rspamd_redis_servers']);
-			$tpl->setVar('rspamd_redis_password', $mail_config['rspamd_redis_password']);
-			$tpl->setVar('rspamd_redis_bayes_servers', $mail_config['rspamd_redis_bayes_servers']);
-			$tpl->setVar('rspamd_redis_bayes_password', $mail_config['rspamd_redis_bayes_password']);
+			$tpl->setVar('rspamd_redis_servers', (isset($mail_config['rspamd_redis_servers']) ? $mail_config['rspamd_redis_servers'] : ''));
+			$tpl->setVar('rspamd_redis_password', (isset($mail_config['rspamd_redis_password']) ? $mail_config['rspamd_redis_password'] : ''));
+			$tpl->setVar('rspamd_redis_bayes_servers', (isset($mail_config['rspamd_redis_bayes_servers']) ? $mail_config['rspamd_redis_bayes_servers'] : ''));
+			$tpl->setVar('rspamd_redis_bayes_password', (isset($mail_config['rspamd_redis_bayes_password']) ? $mail_config['rspamd_redis_bayes_password'] : ''));
 			if(count($local_addrs) > 0) {
 				$tpl->setLoop('local_addrs', $local_addrs);
 			}
@@ -1981,8 +2009,13 @@ class installer_base {
 
 		exec('chmod a+r /etc/rspamd/local.d/* /etc/rspamd/local.d/maps.d/* /etc/rspamd/override.d/*');
 		# protect passwords in these files
-		exec('chgrp _rspamd /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf /etc/rspamd/local.d/worker-controller.inc');
-		exec('chmod 640 /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf /etc/rspamd/local.d/worker-controller.inc');
+		exec('chgrp _rspamd /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf');
+		exec('chmod 640 /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf');
+
+		if(file_exists('/etc/rspamd/local.d/worker-controller.inc')) {
+			exec('chgrp _rspamd /etc/rspamd/local.d/worker-controller.inc');
+			exec('chmod 640 /etc/rspamd/local.d/worker-controller.inc');
+		}
 
 		# unneccesary, since this was done above?
 		$command = 'usermod -a -G amavis _rspamd';
@@ -2168,7 +2201,7 @@ class installer_base {
 
 		//* Backup exiting file
 		if(is_file($full_file_name)) {
-			copy($full_file_name, $config_dir.$configfile.'~');
+			copy($full_file_name, $full_file_name.'~');
 		}
 		$content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
 		$content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
@@ -3012,12 +3045,15 @@ class installer_base {
 				$hook = $pre_hook . $renew_hook;
 			}
 
+			$which_certbot = shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt');
+
 			// Get the default LE client name and version
-			$le_client = explode("\n", shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt'));
+			$le_client = explode("\n", $which_certbot ? $which_certbot : '');
 			$le_client = reset($le_client);
 
+			$which_acme = shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh');
 			// Check for Neilpang acme.sh as well
-			$acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh'));
+			$acme = explode("\n", $which_acme ? $which_acme : '');
 			$acme = reset($acme);
 
 			if((!$acme || !is_executable($acme)) && (!$le_client || !is_executable($le_client))) {
@@ -3287,7 +3323,8 @@ class installer_base {
 				// Create symlink to ISPConfig SSL files
 				symlink($ssl_pem_file, $pureftpd_pem);
 				if (!file_exists("$pureftpd_dir/pure-ftpd-dhparams.pem"))
-					exec("cd $pureftpd_dir; openssl dhparam -out dhparam2048.pem 2048; ln -sf dhparam2048.pem pure-ftpd-dhparams.pem");
+					symlink('/usr/local/ispconfig/interface/ssl/dhparam4096.pem', $pureftpd_dir.'/pure-ftpd-dhparams.pem');
+					//exec("cd $pureftpd_dir; openssl dhparam -out dhparam2048.pem 2048; ln -sf dhparam2048.pem pure-ftpd-dhparams.pem");
 			}
 		}
 
diff --git a/install/lib/mysql.lib.php b/install/lib/mysql.lib.php
index 1085ed0d5b2c04cd97bcc5968f371afec5e0dc35..4d9e71f44a1a8c62758b70915562287964d95000 100644
--- a/install/lib/mysql.lib.php
+++ b/install/lib/mysql.lib.php
@@ -64,9 +64,11 @@ class db
 	public function __destruct() {
 		if($this->_iConnId) mysqli_close($this->_iConnId);
 	}
-	
+
 	private function do_connect() {
 		global $conf;
+
+		mysqli_report(MYSQLI_REPORT_OFF);
 		
 		if($this->_iConnId) return true;
 		$this->dbHost = $conf['mysql']['host'];
@@ -77,7 +79,7 @@ class db
 		$this->dbCharset = $conf["mysql"]["charset"];
 		$this->dbNewLink = false;
 		$this->dbClientFlags = null;
-		
+
 		$this->_iConnId = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort);
 		$try = 0;
 		while((!is_object($this->_iConnId) || mysqli_connect_error()) && $try < 5) {
@@ -92,19 +94,19 @@ class db
 			$this->_sqlerror('Zugriff auf Datenbankserver fehlgeschlagen! / Database server not accessible!');
 			return false;
 		}
-		
+
 		if($this->dbName) $this->setDBName($this->dbName);
 
 		$this->_setCharset();
 	}
-	
+
 	public function setDBData($host, $user, $password, $port) {
 		$this->dbHost = $host;
 		$this->dbUser = $user;
 		$this->dbPass = $password;
 		$this->dbPort = $port;
 	}
-	
+
 	public function setDBName($name) {
 		$this->dbName = $name;
 		$this->_iConnId = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort);
@@ -114,7 +116,7 @@ class db
 			return false;
 		}
 	}
-	
+
 	public function close() {
 		if($this->_iConnId) mysqli_close($this->_iConnId);
 		$this->_iConnId = null;
@@ -192,7 +194,7 @@ class db
 	}
 
 	private function _query($sQuery = '') {
-		
+
 		$aArgs = func_get_args();
 		$this->do_connect();
 
@@ -284,7 +286,7 @@ class db
 	 * @return array result row or NULL if none found
 	 */
 	public function queryOneRecord($sQuery = '') {
-		
+
 		$aArgs = func_get_args();
 		if(!empty($aArgs)) {
 			$sQuery = array_shift($aArgs);
@@ -293,7 +295,7 @@ class db
 		}
 		array_unshift($aArgs, $sQuery);
 		}
-  
+
 		$oResult = call_user_func_array([&$this, 'query'], $aArgs);
 		if(!$oResult) return null;
 
@@ -534,7 +536,7 @@ class db
 			if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage;
 		}
 	}
-	
+
 	/* TODO: rewrite SQL */
 	function update($tablename, $form, $bedingung, $debug = 0)
 	{
@@ -761,14 +763,14 @@ class db
 			break;
 		}
 	}
-	
+
 	/**
 	 * Get the database type (mariadb or mysql)
 	 *
 	 * @access public
 	 * @return string 'mariadb' or string 'mysql'
 	 */
-	
+
 	public function getDatabaseType() {
 		$tmp = $this->queryOneRecord('SELECT VERSION() as version');
 		if(stristr($tmp['version'],'mariadb')) {
@@ -777,7 +779,7 @@ class db
 			return 'mysql';
 		}
 	}
-	
+
 	/**
 	 * Get the database version
 	 *
@@ -785,7 +787,7 @@ class db
 	 * @param bool   $major_version_only = true will return the major version only, e.g. 8 for MySQL 8
 	 * @return string version number
 	 */
-	
+
 	public function getDatabaseVersion($major_version_only = false) {
 		$tmp = $this->queryOneRecord('SELECT VERSION() as version');
 		$version = explode('-', $tmp['version']);
diff --git a/install/sql/incremental/upd_0097.sql b/install/sql/incremental/upd_0097.sql
new file mode 100644
index 0000000000000000000000000000000000000000..c99596926b399b22291c617dc1479211de493ea7
--- /dev/null
+++ b/install/sql/incremental/upd_0097.sql
@@ -0,0 +1 @@
+ALTER TABLE `sys_user` ADD `otp_type` SET('none', 'email') NOT NULL DEFAULT 'none' AFTER `lost_password_reqtime`, ADD `otp_data` VARCHAR(255) NULL AFTER `otp_type`, ADD `otp_recovery` VARCHAR(64) NULL AFTER `otp_data`, ADD `otp_attempts` TINYINT NOT NULL DEFAULT '0' AFTER `otp_recovery`;
diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql
index c99596926b399b22291c617dc1479211de493ea7..c3d8c5b210d5df66bb4e02a69368c334b69e6e58 100644
--- a/install/sql/incremental/upd_dev_collection.sql
+++ b/install/sql/incremental/upd_dev_collection.sql
@@ -1 +1,2 @@
-ALTER TABLE `sys_user` ADD `otp_type` SET('none', 'email') NOT NULL DEFAULT 'none' AFTER `lost_password_reqtime`, ADD `otp_data` VARCHAR(255) NULL AFTER `otp_type`, ADD `otp_recovery` VARCHAR(64) NULL AFTER `otp_data`, ADD `otp_attempts` TINYINT NOT NULL DEFAULT '0' AFTER `otp_recovery`;
+
+ALTER TABLE `mail_user` CHANGE `quota` `quota` BIGINT(20) NOT NULL DEFAULT '0';
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index cf340bda0170cb77039941455303d76ee28066ca..e9ed67c86a441cca00f6bcd898eaa92b58361725 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -1070,7 +1070,7 @@ CREATE TABLE `mail_user` (
   `gid` int(11) NOT NULL default '5000',
   `maildir` varchar(255) NOT NULL default '',
   `maildir_format` varchar(255) NOT NULL default 'maildir',
-  `quota` bigint(20) NOT NULL default '-1',
+  `quota` bigint(20) NOT NULL default '0',
   `cc` text,
   `forward_in_lda` enum('n','y') NOT NULL default 'n',
   `sender_cc` varchar(255) NOT NULL default '',
diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master
deleted file mode 100644
index 6957ed5eb8062dc8f65021710ebb637c5e22dc7d..0000000000000000000000000000000000000000
--- a/install/tpl/apache_apps.vhost.master
+++ /dev/null
@@ -1,134 +0,0 @@
-######################################################
-# This virtual host contains the configuration
-# for the ISPConfig apps vhost
-######################################################
-
-{tmpl_var name='vhost_port_listen'} Listen {tmpl_var name='apps_vhost_port'}
-# NameVirtualHost *:{tmpl_var name='apps_vhost_port'}
-
-<VirtualHost {tmpl_var name='apps_vhost_ip'}:{tmpl_var name='apps_vhost_port'}>
-  ServerAdmin webmaster@localhost
-  {tmpl_var name='apps_vhost_servername'}
-  
-  <Directory {tmpl_var name='apps_vhost_dir'}>
-    <FilesMatch "\.ph(p3?|tml)$">
-      SetHandler None
-    </FilesMatch>
-  </Directory>
-
-  # SSL Configuration
-  <tmpl_var name="ssl_comment">SSLEngine On
-  <tmpl_if name='apache_version' op='>=' value='2.3.16' format='version'>
-  <tmpl_var name="ssl_comment">SSLProtocol All -SSLv3 -TLSv1 -TLSv1.1
-  <tmpl_else>
-  <tmpl_var name="ssl_comment">SSLProtocol All -SSLv2 -SSLv3
-  </tmpl_if>
-  <tmpl_var name="ssl_comment">SSLCertificateFile /usr/local/ispconfig/interface/ssl/ispserver.crt
-  <tmpl_var name="ssl_comment">SSLCertificateKeyFile /usr/local/ispconfig/interface/ssl/ispserver.key
-  <tmpl_var name="ssl_bundle_comment">SSLCACertificateFile /usr/local/ispconfig/interface/ssl/ispserver.bundle
-
-  <tmpl_var name="ssl_comment">SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
-  <tmpl_var name="ssl_comment">SSLHonorCipherOrder On
-  <tmpl_if name='apache_version' op='>=' value='2.4.3' format='version'>
-  <tmpl_var name="ssl_comment">SSLCompression Off
-  </tmpl_if>
-  <tmpl_if name='apache_version' op='>=' value='2.4.11' format='version'>
-  <tmpl_var name="ssl_comment">SSLSessionTickets Off
-  </tmpl_if>
-
-  <IfModule mod_headers.c>
-    # ISPConfig 3.1 currently requires unsafe-line for both scripts and styles, as well as unsafe-eval
-    Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'"
-    <tmpl_var name="ssl_comment">Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'; upgrade-insecure-requests"
-    Header set X-Content-Type-Options: nosniff
-    Header set X-Frame-Options: SAMEORIGIN
-    Header set X-XSS-Protection: "1; mode=block"
-    Header always edit Set-Cookie (.*) "$1; HTTPOnly"
-    <tmpl_var name="ssl_comment">Header always edit Set-Cookie (.*) "$1; Secure"
-    <IfVersion >= 2.4.7>
-        Header setifempty Strict-Transport-Security "max-age=15768000"
-    </IfVersion>
-    <IfVersion < 2.4.7>
-        Header set Strict-Transport-Security "max-age=15768000"
-    </IfVersion>
-    RequestHeader unset Proxy early
-  </IfModule>
-
-  <tmpl_if name='apache_version' op='>=' value='2.3.3' format='version'>
-  <tmpl_var name="ssl_comment">SSLUseStapling On
-  <tmpl_var name="ssl_comment">SSLStaplingResponderTimeout 5
-  <tmpl_var name="ssl_comment">SSLStaplingReturnResponderErrors Off
-  </tmpl_if>
-
-  <IfModule mod_headers.c>
-	RequestHeader unset Proxy early
-  </IfModule>
-
-  <IfModule mod_php5.c>
-    DocumentRoot {tmpl_var name='apps_vhost_dir'}
-    AddType application/x-httpd-php .php
-    <Directory {tmpl_var name='apps_vhost_dir'}>
-		Options FollowSymLinks
-		AllowOverride None
-		<tmpl_if name='apache_version' op='>' value='2.2' format='version'>
-		Require all granted
-		<tmpl_else>
-		Order allow,deny
-		Allow from all
-		</tmpl_if>
-    </Directory>
-  </IfModule>
-
-  <IfModule mod_php7.c>
-    DocumentRoot {tmpl_var name='apps_vhost_dir'}
-    AddType application/x-httpd-php .php
-    <Directory {tmpl_var name='apps_vhost_dir'}>
-		Options FollowSymLinks
-		AllowOverride None
-		<tmpl_if name='apache_version' op='>' value='2.2' format='version'>
-		Require all granted
-		<tmpl_else>
-		Order allow,deny
-		Allow from all
-		</tmpl_if>
-    </Directory>
-  </IfModule>
-
-  <IfModule mod_fcgid.c>
-    DocumentRoot {tmpl_var name='apps_vhost_dir'}
-    SuexecUserGroup ispapps ispapps
-    <Directory {tmpl_var name='apps_vhost_dir'}>
-		Options -Indexes +FollowSymLinks +MultiViews +ExecCGI
-		AllowOverride AuthConfig Indexes Limit Options FileInfo
-	    <FilesMatch "\.php$">
-		  SetHandler fcgid-script
-	    </FilesMatch>
-		FCGIWrapper {tmpl_var name='apps_vhost_basedir'}/php-fcgi-scripts/apps/.php-fcgi-starter .php
-		<tmpl_if name='apache_version' op='>' value='2.2' format='version'>
-		Require all granted
-		<tmpl_else>
-		Order allow,deny
-		Allow from all
-		</tmpl_if>
-    </Directory>
-    IPCCommTimeout  7200
-    MaxRequestLen 15728640 
-  </IfModule>
-
-{tmpl_if name="use_rspamd"}
-  <Location /rspamd>
-        Order allow,deny
-        Allow from all
-  </Location>
-  RewriteEngine On
-  RewriteRule ^/rspamd$ /rspamd/ [R,L]
-  RewriteRule ^/rspamd/(.*) http://127.0.0.1:11334/$1 [P]
-{/tmpl_if}
-
-</VirtualHost>
-
-<tmpl_if name='apache_version' op='>=' value='2.3.3' format='version'>
-<IfModule mod_ssl.c>
-  <tmpl_var name="ssl_comment">SSLStaplingCache shmcb:/var/run/ocsp(128000)
-</IfModule>
-</tmpl_if>
diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master
new file mode 120000
index 0000000000000000000000000000000000000000..098d52b9f134ebddcaaa86ecbb832d2d8f8aac4c
--- /dev/null
+++ b/install/tpl/apache_apps.vhost.master
@@ -0,0 +1 @@
+../../server/conf/apache_apps.vhost.master
\ No newline at end of file
diff --git a/install/tpl/config.inc.php.master b/install/tpl/config.inc.php.master
index bd5cc8f47fb0206e122361c6d60cb520e2e60bcf..aa9329fb7b2a6625fe1fbcf76dce81922c8eaf5e 100644
--- a/install/tpl/config.inc.php.master
+++ b/install/tpl/config.inc.php.master
@@ -56,7 +56,7 @@ $revision = str_replace(array('Revision:','$',' '), '', $svn_revision);
 //** Application
 define('ISPC_APP_TITLE', 'ISPConfig');
 define('ISPC_APP_VERSION', '3.2dev');
-define('DEVSYSTEM', 0);
+define('DEVSYSTEM', false);
 
 
 //** Database
diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master
index a0faf66908b60766650b1e1ff0632ad669b559df..8c2efefa1b876fd7dee3811b9b301ac89eca78b1 100644
--- a/install/tpl/server.ini.master
+++ b/install/tpl/server.ini.master
@@ -78,6 +78,7 @@ website_path=/var/www/clients/client[client_id]/web[website_id]
 website_symlinks=/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/
 website_symlinks_rel=n
 network_filesystem=n
+vhost_rewrite_v6=n
 vhost_conf_dir=/etc/apache2/sites-available
 vhost_conf_enabled_dir=/etc/apache2/sites-enabled
 apache_init_script=
diff --git a/install/tpl/system.ini.master b/install/tpl/system.ini.master
index 6ea6f4f9705818712067a9a6d5ac49b419d284f2..07110c736ff6e3c1cc0b17f2a5ab3ef00d0837f6 100644
--- a/install/tpl/system.ini.master
+++ b/install/tpl/system.ini.master
@@ -13,7 +13,7 @@ mailbox_show_autoresponder_tab=y
 mailbox_show_mail_filter_tab=y
 mailbox_show_custom_rules_tab=y
 mailboxlist_webmail_link=y
-webmail_url=/webmail
+webmail_url=https://[SERVERNAME]:8081/webmail
 dkim_path=/var/lib/amavis/dkim
 smtp_enabled=y
 smtp_host=localhost
@@ -28,7 +28,7 @@ ftpuser_prefix=[CLIENTNAME]
 shelluser_prefix=[CLIENTNAME]
 webdavuser_prefix=[CLIENTNAME]
 dblist_phpmyadmin_link=y
-phpmyadmin_url=/phpmyadmin
+phpmyadmin_url=https://[SERVERNAME]:8081/phpmyadmin
 webftp_url=
 vhost_subdomains=n
 vhost_aliasdomains=n
diff --git a/install/uninstall.php b/install/uninstall.php
index 37cbe05f866a8cce939551f2f290c5cbb965cb91..01543a64ffb222dbf8e4904d1dbcacb359719d2d 100644
--- a/install/uninstall.php
+++ b/install/uninstall.php
@@ -98,6 +98,7 @@ if($do_uninstall == 'yes') {
 	@exec('chattr -i /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter');
 	@unlink("/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter");
 	@unlink("/var/www/php-fcgi-scripts/ispconfig");
+	@unlink("/etc/ssl/private/pure-ftpd.pem");
 
 	echo "Backups in /var/backup/ and log files in /var/log/ispconfig are not deleted.";
 	echo "Finished uninstalling.\n";
diff --git a/install/update.php b/install/update.php
index 56316546ac34ae3bdf568c1c3554e35cbd2f59d3..37a0919999ed6dc4e398d94335f4fc1ce4122520 100644
--- a/install/update.php
+++ b/install/update.php
@@ -369,7 +369,7 @@ $conf['services']['db'] = check_service_config_state('db_server', true); /* Will
 unset($current_svc_config);
 
 //** Write new decisions into DB
-$sql = "UPDATE ?? SET mail_server = '{$conf['services']['mail']}', web_server = '{$conf['services']['web']}', dns_server = '{$conf['services']['dns']}', file_server = '{$conf['services']['file']}', db_server = '{$conf['services']['db']}', vserver_server = '{$conf['services']['vserver']}', proxy_server = '{$conf['services']['proxy']}', firewall_server = '$firewall_server_enabled', xmpp_server = '$xmpp_server_enabled' WHERE server_id = ?";
+$sql = "UPDATE ?? SET mail_server = '{$conf['services']['mail']}', web_server = '{$conf['services']['web']}', dns_server = '{$conf['services']['dns']}', file_server = '{$conf['services']['file']}', db_server = '{$conf['services']['db']}', vserver_server = '{$conf['services']['vserver']}', proxy_server = '{$conf['services']['proxy']}', firewall_server = '{$conf['services']['firewall']}', xmpp_server = '{$conf['services']['xmpp']}' WHERE server_id = ?";
 $inst->db->query($sql, $conf['mysql']['database'].'.server', $conf['server_id']);
 if($conf['mysql']['master_slave_setup'] == 'y') {
 	$inst->dbmaster->query($sql, $conf['mysql']['master_database'].'.server', $conf['server_id']);
@@ -562,7 +562,7 @@ if($conf['apache']['installed'] == true) {
 if ($inst->install_ispconfig_interface) {
 	//** Customise the port ISPConfig runs on
 	$ispconfig_port_number = get_ispconfig_port_number();
-	if($autoupdate['ispconfig_port'] == 'default') $autoupdate['ispconfig_port'] = $ispconfig_port_number;
+	if(isset($autoupdate['ispconfig_port']) && $autoupdate['ispconfig_port'] == 'default') $autoupdate['ispconfig_port'] = $ispconfig_port_number;
 	if($conf['webserver']['server_type'] == 'nginx'){
 		$conf['nginx']['vhost_port'] = $inst->free_query('ISPConfig Port', $ispconfig_port_number,'ispconfig_port');
 	} else {
@@ -607,13 +607,13 @@ if($update_crontab_answer == 'yes') {
 //** Restart services:
 if($reconfigure_services_answer == 'yes') {
 	swriteln('Restarting services ...');
-	if($conf['mysql']['installed'] == true && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1');
+	if($conf['mysql']['installed'] == true && isset($conf['mysql']['init_script']) && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1');
 	if($conf['services']['mail']) {
-		if($conf['postfix']['installed'] == true && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart'));
-		if($conf['saslauthd']['installed'] == true && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart'));
-		if($conf['amavis']['installed'] == true && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart'));
-		if($conf['rspamd']['installed'] == true && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart'));
-		if($conf['clamav']['installed'] == true && $conf['clamav']['init_script'] != '' && $conf['amavis']['installed'] == true) system($inst->getinitcommand($conf['clamav']['init_script'], 'restart'));
+		if($conf['postfix']['installed'] == true && isset($conf['postfix']['init_script']) && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart'));
+		if($conf['saslauthd']['installed'] == true && isset($conf['saslauthd']['init_script']) && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart'));
+		if($conf['amavis']['installed'] == true && isset($conf['amavis']['init_script']) && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart'));
+		if($conf['rspamd']['installed'] == true && isset($conf['rspamd']['init_script']) && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart'));
+		if($conf['clamav']['installed'] == true && isset($conf['clamav']['init_script']) && $conf['clamav']['init_script'] != '' && $conf['amavis']['installed'] == true) system($inst->getinitcommand($conf['clamav']['init_script'], 'restart'));
 		if($conf['courier']['installed'] == true){
 			if($conf['courier']['courier-authdaemon'] != '') system($inst->getinitcommand($conf['courier']['courier-authdaemon'], 'restart'));
 			if($conf['courier']['courier-imap'] != '') system($inst->getinitcommand($conf['courier']['courier-imap'], 'restart'));
@@ -621,8 +621,8 @@ if($reconfigure_services_answer == 'yes') {
 			if($conf['courier']['courier-pop'] != '') system($inst->getinitcommand($conf['courier']['courier-pop'], 'restart'));
 			if($conf['courier']['courier-pop-ssl'] != '') system($inst->getinitcommand($conf['courier']['courier-pop-ssl'], 'restart'));
 		}
-		if($conf['dovecot']['installed'] == true && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart'));
-		if($conf['mailman']['installed'] == true && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &');
+		if($conf['dovecot']['installed'] == true && isset($conf['dovecot']['init_script']) && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart'));
+		if($conf['mailman']['installed'] == true && isset($conf['mailman']['init_script']) && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &');
 	}
 	if($conf['services']['web'] || $inst->install_ispconfig_interface) {
 		if($conf['webserver']['server_type'] == 'apache') {
@@ -636,27 +636,27 @@ if($reconfigure_services_answer == 'yes') {
 		//* Reload is enough for nginx
 		if($conf['webserver']['server_type'] == 'nginx'){
 			if($conf['nginx']['php_fpm_init_script'] != '') system($inst->getinitcommand($conf['nginx']['php_fpm_init_script'], 'reload'));
-			if($conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload'));
+			if(isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload'));
 		}
-		if($conf['pureftpd']['installed'] == true && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart'));
+		if($conf['pureftpd']['installed'] == true && isset($conf['pureftpd']['init_script']) && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart'));
 	}
 	if($conf['services']['dns']) {
-		if($conf['mydns']['installed'] == true && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null');
-		if($conf['powerdns']['installed'] == true && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null');
-		if($conf['bind']['installed'] == true && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null');
+		if($conf['mydns']['installed'] == true && isset($conf['mydns']['init_script']) && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null');
+		if($conf['powerdns']['installed'] == true && isset($conf['powerdns']['init_script']) && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null');
+		if($conf['bind']['installed'] == true && isset($conf['bind']['init_script']) && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null');
 	}
 
     if($conf['services']['xmpp']) {
-        if($conf['xmpp']['installed'] == true && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null');
+        if($conf['xmpp']['installed'] == true && isset($conf['xmpp']['init_script']) && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null');
     }
 
 	if($conf['services']['proxy']) {
-		// if($conf['squid']['installed'] == true && $conf['squid']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['squid']['init_script']))     system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null');
-		if($conf['nginx']['installed'] == true && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null');
+		// if($conf['squid']['installed'] == true && isset($conf['squid']['init_script']) && $conf['squid']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['squid']['init_script']))     system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null');
+		if($conf['nginx']['installed'] == true && isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null');
 	}
 
 	if($conf['services']['firewall']) {
-		if($conf['ufw']['installed'] == true && $conf['ufw']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['ufw']['init_script']))     system($conf['init_scripts'].'/'.$conf['ufw']['init_script'].' restart &> /dev/null');
+		if($conf['ufw']['installed'] == true && isset($conf['ufw']['init_script']) && $conf['ufw']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['ufw']['init_script']))     system($conf['init_scripts'].'/'.$conf['ufw']['init_script'].' restart &> /dev/null');
 	}
 }
 
diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php
index 6a8e563d80fade4e9ccb9482004017b8e6149c5e..0350e28051af0ed1f70a057fad759d7c0806632f 100644
--- a/interface/lib/app.inc.php
+++ b/interface/lib/app.inc.php
@@ -39,8 +39,8 @@ ob_start('ob_gzhandler');
 if(isset($conf['timezone']) && $conf['timezone'] != '') date_default_timezone_set($conf['timezone']);
 
 //* Set error reporting level when we are not on a developer system
-if(DEVSYSTEM == 0) {
-	@ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_DEPRECATED);
+if(DEVSYSTEM !== true) {
+	@ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_WARNING);
 }
 
 /*
diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php
index cd9c333b22040081932c4d8a70902c2809ef1e48..78eee8c9971a7353cb0517889b16f7b2cba247ac 100644
--- a/interface/lib/classes/db_mysql.inc.php
+++ b/interface/lib/classes/db_mysql.inc.php
@@ -82,6 +82,8 @@ class db
 		$this->dbClientFlags = ($flags !== NULL) ? $flags : $conf['db_client_flags'];
 		$this->_iConnId = mysqli_init();
 
+		mysqli_report(MYSQLI_REPORT_OFF);
+
 		mysqli_real_connect($this->_iConnId, $this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort, NULL, $this->dbClientFlags);
 		for($try=0;(!is_object($this->_iConnId) || mysqli_connect_errno()) && $try < 5;++$try) {
 			sleep($try);
@@ -524,7 +526,7 @@ class db
 			$sString = '';
 		}
 
-		$cur_encoding = mb_detect_encoding($sString);
+		$cur_encoding = mb_detect_encoding($sString, "auto");
 		if($cur_encoding != "UTF-8") {
 			if($cur_encoding != 'ASCII') {
 				if(is_object($app) && method_exists($app, 'log')) $app->log('String ' . substr($sString, 0, 25) . '... is ' . $cur_encoding . '.', LOGLEVEL_DEBUG);
diff --git a/interface/lib/classes/ids.inc.php b/interface/lib/classes/ids.inc.php
index 6d197264178f05c533a5e5dfa1049e95e39ddcc4..ffa24a294e75ca7d1988bc822f387bdc79273340 100644
--- a/interface/lib/classes/ids.inc.php
+++ b/interface/lib/classes/ids.inc.php
@@ -77,7 +77,7 @@ class ids {
 				$line = trim($line);
 				if(substr($line,0,1) != '#') {
 					list($user,$path,$varname) = explode(':',$line);
-					if($current_script_name == $path) {
+					if($current_script_name == $path || $path == '*') {
 						if($user = 'any' 
 							|| ($user == 'user' && ($_SESSION['s']['user']['typ'] == 'user' || $_SESSION['s']['user']['typ'] == 'admin')) 
 							|| ($user == 'admin' && $_SESSION['s']['user']['typ'] == 'admin')) {
@@ -100,7 +100,7 @@ class ids {
 				$line = trim($line);
 				if(substr($line,0,1) != '#') {
 					list($user,$path,$varname) = explode(':',$line);
-					if($current_script_name == $path) {
+					if($current_script_name == $path || $path == '*') {
 						if($user = 'any' 
 							|| ($user == 'user' && ($_SESSION['s']['user']['typ'] == 'user' || $_SESSION['s']['user']['typ'] == 'admin')) 
 							|| ($user == 'admin' && $_SESSION['s']['user']['typ'] == 'admin')) {
diff --git a/interface/lib/classes/listform.inc.php b/interface/lib/classes/listform.inc.php
index 4b92daa73c2cba5cc8b7ec01ee170a452e20a3c8..1206e3668a88bc3cc7133ac194188e1c07caa277 100644
--- a/interface/lib/classes/listform.inc.php
+++ b/interface/lib/classes/listform.inc.php
@@ -80,7 +80,7 @@ class listform {
 
 	private function getDatasourceData($field)
 	{
-		global $app;
+		global $app, $api;
 		$values = array();
 
 		if($field['datasource']['type'] == 'SQL') {
@@ -97,7 +97,8 @@ class listform {
 			$querystring = str_replace("{AUTHSQL}", $app->tform->getAuthSQL('r'), $querystring);
 			$querystring = str_replace("{AUTHSQL-A}", $app->tform->getAuthSQL('r', 'a'), $querystring);
 			$querystring = str_replace("{AUTHSQL-B}", $app->tform->getAuthSQL('r', 'b'), $querystring);
-			$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring);
+			//$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring);
+			$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', function($matches) {global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;}, $querystring);
 
 			//* Getting the records
 			$tmp_records = $app->db->queryAllRecords($querystring);
@@ -195,9 +196,9 @@ class listform {
 		if(@is_array($this->listDef['item'])) {
 			foreach($this->listDef['item'] as $i) {
 				$field = $i['field'];
-				$table = $i['table'];
+				$table = (isset($i['table']))?$i['table']:'';
 
-				$searchval = $_SESSION['search'][$list_name][$search_prefix.$field];
+				$searchval = (isset($_SESSION['search'][$list_name][$search_prefix.$field]))?$_SESSION['search'][$list_name][$search_prefix.$field]:'';
 				// IDN
 				if($searchval != ''){
 					if(is_array($i['filters'])) {
@@ -325,7 +326,7 @@ class listform {
 		if($this->searchChanged == 1) $_SESSION['search'][$list_name]['page'] = 0;
 
 		$sql_von = $app->functions->intval($_SESSION['search'][$list_name]['page'] * $records_per_page);
-		$record_count = $app->db->queryOneRecord("SELECT count(*) AS anzahl FROM ??".($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')." WHERE $sql_where", $table);
+		$record_count = $app->db->queryOneRecord("SELECT count(*) AS anzahl FROM ??".(isset($app->listform->listDef['additional_tables']) && $app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')." WHERE $sql_where", $table);
 		$pages = $app->functions->intval(($record_count['anzahl'] - 1) / $records_per_page);
 
 
diff --git a/interface/lib/classes/listform_actions.inc.php b/interface/lib/classes/listform_actions.inc.php
index 86eebd3d6465922cca3f236e2dd5123209674b80..7ffc84c32b90f36d8c4e71df9890aefbc5140f4e 100644
--- a/interface/lib/classes/listform_actions.inc.php
+++ b/interface/lib/classes/listform_actions.inc.php
@@ -135,7 +135,7 @@ class listform_actions {
 			}
 		}
 
-		if($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order_in_php']) $php_sort = true;
+		if(@$_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order_in_php']) $php_sort = true;
 
 		// Getting Datasets from DB
 		$records = $app->db->queryAllRecords($this->getQueryString($php_sort));
@@ -189,7 +189,7 @@ class listform_actions {
 		//* substitute value for select fields
 		if(is_array($app->listform->listDef['item']) && count($app->listform->listDef['item']) > 0) {
 			foreach($app->listform->listDef['item'] as $field) {
-				if($rec['active'] == 'n') $rec['warn_inactive'] = 'y';
+				if(isset($rec['active']) && $rec['active'] == 'n') $rec['warn_inactive'] = 'y';
 				$key = $field['field'];
 				if(isset($field['formtype']) && $field['formtype'] == 'SELECT') {
 					if(strtolower($rec[$key]) == 'y' or strtolower($rec[$key]) == 'n') {
@@ -226,7 +226,7 @@ class listform_actions {
 		}
 
 		$sql_where = $app->listform->getSearchSQL($sql_where);
-		if($app->listform->listDef['join_sql']) $sql_where .= ' AND '.$app->listform->listDef['join_sql'];
+		if(isset($app->listform->listDef['join_sql'])) $sql_where .= ' AND '.$app->listform->listDef['join_sql'];
 		$app->tpl->setVar($app->listform->searchValues);
 
 		$order_by_sql = $this->SQLOrderBy;
@@ -245,8 +245,9 @@ class listform_actions {
 
 		$table_selects = array();
 		$table_selects[] = trim($app->listform->listDef['table']).'.*';
-		$app->listform->listDef['additional_tables'] = trim($app->listform->listDef['additional_tables']);
-		if($app->listform->listDef['additional_tables'] != ''){
+
+		if(isset($app->listform->listDef['additional_tables']) && trim($app->listform->listDef['additional_tables']) != ''){
+			$app->listform->listDef['additional_tables'] = trim($app->listform->listDef['additional_tables']);
 			$additional_tables = explode(',', $app->listform->listDef['additional_tables']);
 			foreach($additional_tables as $additional_table){
 				$table_selects[] = trim($additional_table).'.*';
@@ -254,7 +255,7 @@ class listform_actions {
 		}
 		$select = implode(', ', $table_selects);
 
-		$sql = 'SELECT '.$select.$extselect.' FROM '.$app->listform->listDef['table'].($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')."$join WHERE $sql_where $order_by_sql";
+		$sql = 'SELECT '.$select.$extselect.' FROM '.$app->listform->listDef['table'].(isset($app->listform->listDef['additional_tables']) && $app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')."$join WHERE $sql_where $order_by_sql";
 		if($no_limit == false) $sql .= " $limit_sql";
 		//echo $sql;
 		return $sql;
diff --git a/interface/lib/classes/quota_lib.inc.php b/interface/lib/classes/quota_lib.inc.php
index b02cdea9949fb92c23451a18f49b2377a3d23d4c..7c5b388536ec9d0a672d9a3e283d2a5d6b7adc97 100644
--- a/interface/lib/classes/quota_lib.inc.php
+++ b/interface/lib/classes/quota_lib.inc.php
@@ -326,7 +326,7 @@ class quota_lib {
 					if($used_ratio >= 0.8) $databases[$i]['display_colour'] = '#fd934f';
 					if($used_ratio >= 1) $databases[$i]['display_colour'] = '#cc0000';
 
-					if($databases[$i]['database_quota'] == 0){
+					if($databases[$i]['database_quota'] == -1) {
 						$databases[$i]['database_quota'] = $app->lng('unlimited_txt');
 					} else {
 						$databases[$i]['database_quota'] = $databases[$i]['database_quota'] . ' MB';
diff --git a/interface/lib/classes/remote.d/mail.inc.php b/interface/lib/classes/remote.d/mail.inc.php
index dfbad2759581518228cdd5f3805c6421ace0e652..2d26b1969f95227916efca86e6a341ae27c896a1 100644
--- a/interface/lib/classes/remote.d/mail.inc.php
+++ b/interface/lib/classes/remote.d/mail.inc.php
@@ -223,7 +223,7 @@ class remoting_mail extends remoting {
 			throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
 			return false;
 		}
-		
+
 		// Email addresses must always be lower case
 		$params['email'] = strtolower($params['email']);
 
@@ -331,17 +331,17 @@ class remoting_mail extends remoting {
 		// $app->plugin->raiseEvent('mail:mail_user_filter:on_after_delete',$this);
 		return $affected_rows;
 	}
-	
+
 	// Mail backup list function by Dominik Müller, info@profi-webdesign.net
 	public function mail_user_backup_list($session_id, $primary_id = null)
 	{
 		global $app;
-	
+
 		if(!$this->checkPerm($session_id, 'mail_user_backup')) {
 			throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
 			return false;
 		}
-	
+
 		$params = array();
 		if ($site_id != null) {
 			$params[] = $site_id;
@@ -350,47 +350,47 @@ class remoting_mail extends remoting {
 		else {
 			$sql  = "SELECT * FROM mail_backup";
 		}
-	
+
 		$result = $app->db->queryAllRecords($sql, true, $params);
 		return $result;
 	}
-	
+
 	// Mail backup restore/download functions by Dominik Müller, info@profi-webdesign.net
 	public function mail_user_backup($session_id, $primary_id, $action_type)
 	{
 		global $app;
-	
+
 		if(!$this->checkPerm($session_id, 'mail_user_backup')) {
 			throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
 			return false;
 		}
-	
+
 		//*Set variables
 		$backup_record  =       $app->db->queryOneRecord("SELECT * FROM `mail_backup` WHERE `backup_id`=?", $primary_id);
 		$server_id      =       $backup_record['server_id'];
-	
+
 		//*Set default action state
 		$action_state   =       "pending";
 		$tstamp         =       time();
-	
+
 		//* Basic validation of variables
 		if ($server_id <= 0) {
 			throw new SoapFault('invalid_backup_id', "Invalid or non existant backup_id $primary_id");
 			return false;
 		}
-	
+
 		if (/*$action_type != 'backup_download_mail' and*/ $action_type != 'backup_restore_mail' and $action_type != 'backup_delete_mail') {
 			throw new SoapFault('invalid_action', "Invalid action_type $action_type");
 			return false;
 		}
-	
+
 		//* Validate instance
 		$instance_record        =       $app->db->queryOneRecord("SELECT * FROM `sys_remoteaction` WHERE `action_param`=? and `action_type`=? and `action_state`='pending'", $primary_id, $action_type);
 		if ($instance_record['action_id'] >= 1) {
 			throw new SoapFault('duplicate_action', "There is already a pending $action_type action");
 			return false;
 		}
-	
+
 		//* Save the record
 		if ($app->db->query("INSERT INTO `sys_remoteaction` SET `server_id` = ?, `tstamp` = ?, `action_type` = ?, `action_param` = ?, `action_state` = ?", $server_id, $tstamp, $action_type, $primary_id, $action_state)) {
 			return true;
@@ -666,7 +666,55 @@ class remoting_mail extends remoting {
 		$affected_rows = $this->deleteQuery('../mail/form/mail_relay_recipient.tform.php', $primary_id);
 		return $affected_rows;
 	}
-	
+
+    //* add relay domain
+    public function mail_relay_domain_add($session_id, $client_id, $params)
+	{
+    	if(!$this->checkPerm($session_id, 'mail_relay_add'))
+		{
+            throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
+            return false;
+    	}
+    	$affected_rows = $this->insertQuery('../mail/form/mail_relay_domain.tform.php', $client_id, $params);
+    	return $affected_rows;
+	}
+
+    public function mail_relay_domain_delete($session_id, $primary_id)
+    {
+        if(!$this->checkPerm($session_id, 'mail_relay_delete'))
+        {
+            throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
+            return false;
+        }
+        $affected_rows = $this->deleteQuery('../mail/form/mail_relay_domain.tform.php', $primary_id);
+        return $affected_rows;
+    }
+
+    public function mail_relay_domain_get($session_id, $primary_id)
+    {
+        global $app;
+
+        if(!$this->checkPerm($session_id, 'mail_relay_get'))
+        {
+            throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
+            return false;
+        }
+        $app->uses('remoting_lib');
+		$app->remoting_lib->loadFormDef('../mail/form/mail_relay_domain.tform.php');
+		return $app->remoting_lib->getDataRecord($primary_id);
+    }
+
+    public function mail_relay_domain_update($session_id, $client_id, $primary_id, $params)
+    {
+        if(!$this->checkPerm($session_id, 'mail_relay_update'))
+        {
+            throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
+            return false;
+        }
+        $affected_rows = $this->updateQuery('../mail/form/mail_relay_domain.tform.php', $client_id, $primary_id, $params);
+		return $affected_rows;
+    }
+
 	//* Get spamfilter whitelist details
 	public function mail_spamfilter_whitelist_get($session_id, $primary_id)
 	{
@@ -1117,12 +1165,12 @@ class remoting_mail extends remoting {
 	{
 		global $app;
 		$app->uses('quota_lib');
-		
+
 		if(!$this->checkPerm($session_id, 'mailquota_get_by_user')) {
 			throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
 			return false;
 		}
-		
+
 		return $app->quota_lib->get_mailquota_data($client_id, false);
 	}
 
diff --git a/interface/lib/classes/simplepie.inc.php b/interface/lib/classes/simplepie.inc.php
index a2b80ed25b71755c81e56722f453d85d95207630..64f4d946f9ae58e8a4d358ce0b246264ab7efd16 100644
--- a/interface/lib/classes/simplepie.inc.php
+++ b/interface/lib/classes/simplepie.inc.php
@@ -13186,8 +13186,8 @@ class SimplePie_Parse_Date
 	 */
 	function __construct()
 	{
-		$this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
-		$this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
+		$this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')';
+		$this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')';
 
 		static $cache;
 		if (!isset($cache[get_class($this)]))
@@ -13338,9 +13338,9 @@ class SimplePie_Parse_Date
 			}
 
 			// Convert the number of seconds to an integer, taking decimals into account
-			$second = @round($match[6] + $match[7] / @pow(10, strlen($match[7])));
+			$second = @round((int)$match[6] + (int)$match[7] / @pow(10, strlen($match[7])));
 
-			return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
+			return gmmktime((int)$match[4], (int)$match[5], (int)$second, (int)$match[2], (int)$match[3], (int)$match[1]) - $timezone;
 		}
 		else
 		{
diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php
index 9cb171cae5d2f230ede4b117bc1b6900625f1d69..c33137d6c1791fc3b9a77344ffed0b0fb3a0e8fa 100644
--- a/interface/lib/classes/system.inc.php
+++ b/interface/lib/classes/system.inc.php
@@ -33,6 +33,7 @@ class system {
 	var $client_service = null;
 	private $_last_exec_out = null;
 	private $_last_exec_retcode = null;
+	private $server_count = null;
 
 	public function has_service($userid, $service) {
 		global $app;
diff --git a/interface/lib/classes/tform_base.inc.php b/interface/lib/classes/tform_base.inc.php
index cfaf0958d5f5ed39f4d90147501fc871807bec9d..3b35a722d291a7a99246540e6c02b219c8748fb5 100644
--- a/interface/lib/classes/tform_base.inc.php
+++ b/interface/lib/classes/tform_base.inc.php
@@ -276,7 +276,8 @@ class tform_base {
 			unset($tmp_recordid);
 
 			$querystring = str_replace("{AUTHSQL}", $this->getAuthSQL('r'), $querystring);
-			$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring);
+			//$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring);
+			$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', function($matches) {global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;}, $querystring);
 
 			// Getting the records
 			$tmp_records = $app->db->queryAllRecords($querystring);
@@ -1584,7 +1585,7 @@ class tform_base {
 
 		// Set form title
 		$form_hint = $this->lng($this->formDef["title"]);
-		if($this->formDef["description"] != '') $form_hint .= '<div class="pageForm_description">'.$this->lng($this->formDef["description"]).'</div>';
+		if(isset($this->formDef["description"]) && $this->formDef["description"] != '') $form_hint .= '<div class="pageForm_description">'.$this->lng($this->formDef["description"]).'</div>';
 		$app->tpl->setVar('form_hint', $form_hint);
 
 		// Set Wordbook for this form
diff --git a/interface/lib/classes/tpl.inc.php b/interface/lib/classes/tpl.inc.php
index efaf4c072a8ceac226b9fb5d243fdadb4fa0d9f7..977ed0901d1d5c0573cc736208d2f05cc339cc00 100644
--- a/interface/lib/classes/tpl.inc.php
+++ b/interface/lib/classes/tpl.inc.php
@@ -1121,7 +1121,7 @@ if (!defined('vlibTemplateClassLoaded')) {
 		{
 			array_push($this->_namespace, $varname);
 			$tempvar = count($this->_namespace) - 1;
-			$retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars";
+			$retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < \$this->_tpl_count(\$this->_arrvars";
 			for ($i=0; $i < count($this->_namespace); $i++) {
 				$retstr .= "['".$this->_namespace[$i]."']";
 				if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]";
@@ -1461,6 +1461,27 @@ if (!defined('vlibTemplateClassLoaded')) {
 			return $return;
 		}
 
+		/**
+		* Used during in evaled code to replace PHP count function for PHP 8 compatibility
+		* @var variable to be counted
+		*/
+		private function _tpl_count($var)
+		{
+			$retvar = 0;
+			if(isset($var)) {
+				if(is_array($var)) {
+					$retvar = count($var);
+				} elseif(is_null($var)) {
+					$retvar = 0;
+				} else {
+					$retvar = 1;
+				}
+			} else {
+				$retvar = 0;
+			}
+			return $retvar;
+		}
+
 		/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     The following functions have no use and are included just so that if the user
     is making use of vlibTemplateCache functions, this doesn't crash when changed to
diff --git a/interface/lib/classes/validate_datetime.inc.php b/interface/lib/classes/validate_datetime.inc.php
index 2cb35f44e99385d5ecdf0ca0cebd1a94d0fff1b7..055c0e25a089d33a4f741a7253bcaf70db2052b9 100755
--- a/interface/lib/classes/validate_datetime.inc.php
+++ b/interface/lib/classes/validate_datetime.inc.php
@@ -42,7 +42,7 @@ class validate_datetime
 	{
 		if (is_array($field_value) && count($field_value) >= 5)
 		{
-			$result = array_filter($field_value, create_function('$dt_unit', 'return ($dt_unit > 0);'));
+			$result = array_filter($field_value, function($dt_unit) {return ($dt_unit > 0);});
 			return count($result) !== 0;
 		}
 
@@ -86,7 +86,7 @@ class validate_datetime
 	{
 		if(!is_array($field_value)) return 0;
 		$second = 0;
-		$filtered_values = array_map(create_function('$item', 'return (int)$item;'), $field_value);
+		$filtered_values = array_map(function($item) {return (int)$item;}, $field_value);
 		extract($filtered_values, EXTR_OVERWRITE);
 
 		return mktime($hour, $minute, $second, $month, $day, $year);
diff --git a/interface/lib/config.inc.php b/interface/lib/config.inc.php
index c492680513e0553fe00499adf670725a714d6fc7..73e8273cbf042ae8565377c4e0790e0662609bbd 100644
--- a/interface/lib/config.inc.php
+++ b/interface/lib/config.inc.php
@@ -46,7 +46,7 @@ $revision = str_replace(array('Revision:', '$', ' '), '', $svn_revision);
 //** Application
 define('ISPC_APP_TITLE', 'ISPConfig');
 define('ISPC_APP_VERSION', '3.2dev');
-define('DEVSYSTEM', 0);
+define('DEVSYSTEM', false);
 
 
 //** Database
diff --git a/interface/ssl/dhparam4096.pem b/interface/ssl/dhparam4096.pem
new file mode 100644
index 0000000000000000000000000000000000000000..eed4c41e2183ba5e8f573c7dc80726146207d834
--- /dev/null
+++ b/interface/ssl/dhparam4096.pem
@@ -0,0 +1,13 @@
+-----BEGIN DH PARAMETERS-----
+MIICCAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
++8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
+87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
+YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
+7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
+ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3
+7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32
+nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e
+8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx
+iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K
+zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CAQI=
+-----END DH PARAMETERS-----
\ No newline at end of file
diff --git a/interface/web/admin/form/users.tform.php b/interface/web/admin/form/users.tform.php
index bc77087e2852c71d10f416e559b23291ab86b243..05e88e2e2bd11d7d311eab32fe4c307435a67913 100644
--- a/interface/web/admin/form/users.tform.php
+++ b/interface/web/admin/form/users.tform.php
@@ -251,7 +251,7 @@ $form['tabs']['users'] = array (
 			'formtype' => 'CHECKBOX',
 			'regex'  => '',
 			'errmsg' => '',
-			'default' => '',
+                       'default' => '1',
 			'value'  => array(0 => 0, 1 => 1),
 			'separator' => '',
 			'width'  => '30',
diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng
index b9da516a503bde03b1ff1e7253a976c73e5f7f9c..f6a89c702be68b2217235f48b0599aea75bedc5f 100644
--- a/interface/web/admin/lib/lang/de_server_config.lng
+++ b/interface/web/admin/lib/lang/de_server_config.lng
@@ -1,6 +1,6 @@
 <?php
 $wb['server_config'] = 'Server Config';
-$wb['config_for_txt'] = 'Configuration for';
+$wb['config_for_txt'] = 'Konfiguration für';
 $wb['server_config_error_not_updated'] = 'Error in Server Config: not updated';
 $wb['server_config_error_section_not_updated'] = 'Error in Server Config: %s section not updated';
 $wb['jailkit_chroot_home_txt'] = 'Jailkit Chroot home';
@@ -190,8 +190,8 @@ $wb['awstats_settings_txt'] = 'AWStats Einstellungen';
 $wb['backup_mode_txt'] = 'Backupmodus';
 $wb['backup_mode_userzip'] = 'Backup Dateien gehören dem Web Benutzer (.zip Datei)';
 $wb['backup_mode_rootgz'] = 'Backup aller Dateien des Webverzeichnisses als Root Benutzer';
-$wb['backup_mode_borg_txt'] = 'BorgBackup: Maak een back-up van alle bestanden in de vhost-directory en databases in incrementele repositories';
-$wb['backup_missing_utils_txt'] = 'De volgende back-upmodus kan niet worden gebruikt omdat de vereiste tools niet zijn geïnstalleerd:';
+$wb['backup_mode_borg_txt'] = 'BorgBackup: Sichere alle Dateien im Webspace-Verzeichnis und die Datenbanken in inkrementellen Repositories';
+$wb['backup_missing_utils_txt'] = 'Der folgende Backup-Modus kann nicht verwendet werden, da das erforderliche Tool nicht installiert ist:';
 $wb['backup_time_txt'] = 'Backupzeit';
 $wb['firewall_txt'] = 'Firewall';
 $wb['mailbox_quota_stats_txt'] = 'E-Mailkonto Beschränkung Statistiken';
@@ -224,7 +224,7 @@ $wb['munin_url_error_regex'] = 'Ungültige Munin-URL';
 $wb['munin_url_note_txt'] = 'Platzhalter:';
 $wb['backup_dir_is_mount_txt'] = 'Backupverzeichnis ist ein eigener Mount?';
 $wb['backup_dir_mount_cmd_txt'] = 'Mount-Befehl, falls Backupverzeichnis nicht gemountet';
-$wb['backup_delete_txt'] = 'Backups loeschen wenn eine Domain / Webseite geloescht wird';
+$wb['backup_delete_txt'] = 'Backups löschen wenn eine Domain / Webseite gelöscht wird';
 $wb['v6_prefix_txt'] = 'IPv6 Prefix';
 $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror';
 $wb['v6_prefix_length'] = 'Prefix zu lang fuer angegebene IPv6-Adresse ';
@@ -313,9 +313,9 @@ $wb['migration_mode_txt'] = 'Server Migration Mode';
 $wb['nginx_enable_pagespeed_txt'] = 'Makes Pagespeed available';
 $wb['logging_txt'] = 'Store website access and error logs';
 $wb['logging_desc_txt'] = 'Use Tools > Resync to apply changes to existing sites. For Apache, access and error log can be anonymized. For nginx, only the access log is anonymized, the error log will contain IP addresses.';
-$wb['log_retention_txt'] = 'Log retention (days)';
-$wb['log_retention_error_ispositive'] = 'Log retention must be a number > 0';
-$wb['php_default_hide_txt'] = 'Hide Default PHP-Version in selectbox';
+$wb['log_retention_txt'] = 'Aufbewahrungsdauer der ISPConfig Log-Dateien (Tage)';
+$wb['log_retention_error_ispositive'] = 'Die Aufbewahrungsdauer des Protokolls muss eine Zahl und > 0 sein.';
+$wb['php_default_hide_txt'] = 'Biete die standardmäßig installierte PHP-Version des Servers nicht zur Auswahl an';
 $wb['php_default_name_txt'] = 'Beschreibung Standard PHP';
 $wb['php_default_name_error_empty'] = 'Beschreibung Standard PHP ist leer.';
 $wb['error_mailbox_message_size_txt'] = 'Mailboxgröße muss gleich oder größer als max. Nachrichtengröße sein.';
@@ -335,13 +335,15 @@ $wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Serve
 $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol';
 $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port';
 $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port';
-$wb['jailkit_chroot_authorized_keys_template_txt'] = 'Jailkit authorized_keys template';
-$wb['jailkit_chroot_authorized_keys_template_error_regex'] = 'Invalid jaikit chroot authorized_keys template file.';
-$wb['jailkit_hardlinks_txt'] = 'Hardlinks within Jailkit chroot';
-$wb['tooltip_jailkit_hardlinks_txt'] = 'Using hardlinks is insecure, but saves disk space.';
-$wb['jailkit_hardlinks_allow_txt'] = 'Allow hardlinks within the jail';
-$wb['jailkit_hardlinks_no_txt'] = 'No, remove hardlinked files';
-$wb['jailkit_hardlinks_yes_txt'] = 'Yes, use hardlinks if possible';
+$wb['jailkit_chroot_authorized_keys_template_txt'] = 'Jailkit authorized_keys Template';
+$wb['jailkit_chroot_authorized_keys_template_error_regex'] = 'Ungültige Jailkit chroot authorized_keys Template-Datei.';
+$wb['jailkit_hardlinks_txt'] = 'Hardlinks innerhalb des Jailkit chroot';
+$wb['tooltip_jailkit_hardlinks_txt'] = 'Die Benutzung von  hardlinks ist unsicher, spart aber Speicherplatz.';
+$wb['jailkit_hardlinks_allow_txt'] = 'Erlaube hardlinks innerhalb des Jails';
+$wb['jailkit_hardlinks_no_txt'] = 'Nein, entferne hardgelinkte Dateien';
+$wb['jailkit_hardlinks_yes_txt'] = 'Ja, benutze hardlinks wenn möglich';
+$wb['mailbox_soft_delete_txt'] = 'Postfach Soft-Löschung';
+$wb['mailbox_soft_delete_info_txt'] = 'wird standardmäßig nach 7 Tagen gelöscht.';
 $wb['bind_zonefiles_masterprefix_txt'] = 'BIND master zonefiles prefix';
 $wb['bind_zonefiles_slaveprefix_txt'] = 'BIND slave zonefiles prefix';
 $wb['bind_keyfiles_dir_txt'] = 'BIND keyfiles directory';
@@ -349,5 +351,3 @@ $wb['bind_keyfiles_dir_error_empty'] = 'BIND keyfiles directory is empty.';
 $wb['bind_zonefiles_masterprefix_error_regex'] = 'Invalid BIND zonefiles master prefix.';
 $wb['bind_zonefiles_slaveprefix_error_regex'] = 'Invalid BIND zonefiles slave prefix.';
 $wb['bind_keyfiles_dir_error_regex'] = 'Invalid BIND keyfiles directory.';
-$wb['mailbox_soft_delete_txt'] = 'Mailbox soft delete';
-$wb['mailbox_soft_delete_info_txt'] = 'by default cleaned up after 7 days.';
diff --git a/interface/web/admin/list/server_php.list.php b/interface/web/admin/list/server_php.list.php
index a4a38901ab4565bf9f704265e240b280f2c5bacb..4ea40bdae1727c859392544946f5eab7390461d3 100644
--- a/interface/web/admin/list/server_php.list.php
+++ b/interface/web/admin/list/server_php.list.php
@@ -39,6 +39,9 @@ $liste['paging_tpl']  = 'templates/paging.tpl.htm';
 //* Enable auth
 $liste['auth']    = 'no';
 
+// mark columns for php sorting (no real mySQL columns)
+$liste["phpsort"] = array('usage');
+
 
 /*****************************************************
 * Suchfelder
diff --git a/interface/web/client/client_edit.php b/interface/web/client/client_edit.php
index f1964d7eff567a3ef7bd5d93d859a7c8ebb3c519..e0b74595fcc51016d6d66a5f7fdaa021a8894581 100644
--- a/interface/web/client/client_edit.php
+++ b/interface/web/client/client_edit.php
@@ -61,7 +61,7 @@ class page_action extends tform_actions {
 			$client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]);
 			$client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 
-			// Check if the user may add another website.
+			// Check if the user may add another.
 			if($client["limit_client"] >= 0) {
 				$tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = ?", $client_group_id);
 				if($tmp["number"] >= $client["limit_client"]) {
@@ -84,7 +84,7 @@ class page_action extends tform_actions {
 			$client_group_id = $_SESSION["s"]["user"]["default_group"];
 			$client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 
-			// Check if the user may add another website.
+			// Check if the user may add another.
 			if($client["limit_client"] >= 0) {
 				$tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = ?", $client_group_id);
 				if($tmp["number"] >= $client["limit_client"]) {
@@ -119,7 +119,7 @@ class page_action extends tform_actions {
 			$this->oldTemplatesAssigned = array();
 		}
 
-		$this->_template_additional = explode('/', $this->dataRecord['template_additional']);
+		$this->_template_additional = (isset($this->dataRecord['template_additional']) && $this->dataRecord['template_additional'] != '')?explode('/', $this->dataRecord['template_additional']):array();
 		$this->dataRecord['template_additional'] = '';
 
 		parent::onSubmit();
@@ -169,7 +169,7 @@ class page_action extends tform_actions {
 			// old style
 			$sql = "SELECT template_additional FROM client WHERE client_id = ?";
 			$result = $app->db->queryOneRecord($sql, $this->id);
-			$tplAdd = explode("/", $result['template_additional']);
+			$tplAdd = (isset($result['template_additional']) && $result['template_additional'] != '')?explode("/", $result['template_additional']):array();
 			$text = '';
 			foreach($tplAdd as $item){
 				if (trim($item) != ''){
@@ -293,7 +293,7 @@ class page_action extends tform_actions {
 			$app->auth->add_group_to_user($_SESSION['s']['user']['userid'], $groupid);
 			$app->db->query("UPDATE client SET parent_client_id = ? WHERE client_id = ?", $_SESSION['s']['user']['client_id'], $this->id);
 		} else {
-			if($this->dataRecord['parent_client_id'] > 0) {
+			if(isset($this->dataRecord['parent_client_id']) && $this->dataRecord['parent_client_id'] > 0) {
 				//* get userid of the reseller and add it to the group of the client
 				$tmp = $app->db->queryOneRecord("SELECT sys_user.userid FROM sys_user,sys_group WHERE sys_user.default_group = sys_group.groupid AND sys_group.client_id = ?", $this->dataRecord['parent_client_id']);
 				$app->auth->add_group_to_user($tmp['userid'], $groupid);
@@ -304,14 +304,14 @@ class page_action extends tform_actions {
 
 		//* Set the default servers
 		$tmp = $app->getconf->get_global_config('mail');
-		$default_mailserver = $app->functions->intval($tmp['default_mailserver']);
+		$default_mailserver = (isset($tmp['default_mailserver']))?$app->functions->intval($tmp['default_mailserver']):0;
 		if (!$default_mailserver) {
 			$tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE mail_server = 1 AND mirror_server_id = 0 LIMIT 0,1');
 			$default_mailserver = $app->functions->intval($tmp['server_id']);
 		}
 		$tmp = $app->getconf->get_global_config('sites');
-		$default_webserver = $app->functions->intval($tmp['default_webserver']);
-		$default_dbserver = $app->functions->intval($tmp['default_dbserver']);
+		$default_webserver = (isset($tmp['default_webserver']))?$app->functions->intval($tmp['default_webserver']):0;
+		$default_dbserver = (isset($tmp['default_dbserver']))?$app->functions->intval($tmp['default_dbserver']):0;
 		if (!$default_webserver) {
 			$tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE web_server = 1 AND mirror_server_id = 0 LIMIT 0,1');
 			$default_webserver = $app->functions->intval($tmp['server_id']);
@@ -321,7 +321,7 @@ class page_action extends tform_actions {
 			$default_dbserver = $app->functions->intval($tmp['server_id']);
 		}
 		$tmp = $app->getconf->get_global_config('dns');
-		$default_dnsserver = $app->functions->intval($tmp['default_dnsserver']);
+		$default_dnsserver = (isset($tmp['default_dnsserver']))?$app->functions->intval($tmp['default_dnsserver']):0;
 		if (!$default_dnsserver) {
 			$tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE dns_server = 1 AND mirror_server_id = 0 LIMIT 0,1');
 			$default_dnsserver = $app->functions->intval($tmp['server_id']);
diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php
index 1f60ffe1b4ca4955a2b74dda44dbf4c307a1a1fc..c6d05f9eb32b92f792cf43bed278df262fb6631b 100644
--- a/interface/web/client/form/client.tform.php
+++ b/interface/web/client/form/client.tform.php
@@ -318,7 +318,7 @@ $form["tabs"]['address'] = array (
 		'country' => array (
 			'datatype' => 'VARCHAR',
 			'formtype' => 'SELECT',
-			'default' => (isset($conf['language']) ? strtoupper($conf['language']) : ''),
+                       'default' => (isset($conf['default_country'])) ? strtoupper($conf['default_country']) : ((isset($conf['language'])) ? strtoupper($conf['language']) : ''),
 			'datasource' => array (  'type'          => 'SQL',
 				'querystring'   => 'SELECT iso,printable_name FROM country ORDER BY printable_name ASC',
 				'keyfield'      => 'iso',
diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng
index c75f3263a02360a77b8d144b11a49e220eb98e2e..34328a17f870c45030202c39cce4c0d4c03f3951 100644
--- a/interface/web/client/lib/lang/de_client.lng
+++ b/interface/web/client/lib/lang/de_client.lng
@@ -151,7 +151,7 @@ $wb['aps_limits_txt'] = 'APS Installationsassistent Limits';
 $wb['limit_aps_txt'] = 'Max. Anzahl an APS-Instanzen';
 $wb['limit_aps_error_notint'] = 'Das APS Instanzen Limit muss eine Zahl sein.';
 $wb['default_slave_dnsserver_txt'] = 'Standard Secondary DNS Server';
-$wb['locked_txt'] = 'Locked (disables everything except DNS)';
+$wb['locked_txt'] = 'Gesperrt (deaktiviert alles außer DNS)';
 $wb['canceled_txt'] = 'Gek&uuml;ndigt (verhindert Kundenlogin)';
 $wb['gender_txt'] = 'Anrede';
 $wb['gender_m_txt'] = 'Herr';
@@ -172,8 +172,8 @@ $wb['mail_servers_txt'] = 'Mailserver';
 $wb['mail_servers_placeholder'] = 'Mailserver wählen';
 $wb['no_mail_server_error'] = 'Bitte wählen Sie mind. einen Mailserver aus.';
 $wb['mail_servers_used'] = 'Der Server, den Sie entfernen möchten, wird als Mailserver verwendet. Bitte stellen Sie sicher, daß dieser Server nicht von diesem Kunden benutzt wird, bevor Sie ihn entfernen.';
-$wb['added_by_txt'] = 'Added by';
-$wb['added_date_txt'] = 'Added date';
+$wb['added_by_txt'] = 'Hinzugefügt durch';
+$wb['added_date_txt'] = 'Hinzugefügt am';
 $wb['parent_client_id_txt'] = 'Kunde von Reseller';
 $wb['none_txt'] = 'keiner';
 $wb['limit_database_quota_txt'] = 'Datenbank-Quota';
diff --git a/interface/web/client/lib/lang/de_reseller.lng b/interface/web/client/lib/lang/de_reseller.lng
index 108cf7cd95100009633196d244341a47983109e2..c45422280134e2618d186f111a72d97582cffc37 100644
--- a/interface/web/client/lib/lang/de_reseller.lng
+++ b/interface/web/client/lib/lang/de_reseller.lng
@@ -159,8 +159,8 @@ $wb['customer_no_template_txt'] = 'Customer No. template';
 $wb['customer_no_template_error_regex_txt'] = 'The customer No. template contains invalid characters';
 $wb['customer_no_start_txt'] = 'Customer No. start value';
 $wb['customer_no_counter_txt'] = 'Customer No. counter';
-$wb['added_by_txt'] = 'Added by';
-$wb['added_date_txt'] = 'Added date';
+$wb['added_by_txt'] = 'Hinzugefügt durch';
+$wb['added_date_txt'] = 'Hinzugefügt am';
 $wb['limit_domainmodule_error_notint'] = 'Domainmodule limit must be a number.';
 $wb['limit_domainmodule_txt'] = 'Domainmodule Limit';
 $wb['client_limits_txt'] = 'Client Limits';
diff --git a/interface/web/client/reseller_edit.php b/interface/web/client/reseller_edit.php
index 7cbd6687bc40eefad4f0beaf174cad996595ea17..10da3b78e152a20b8c4dd973790f42d2f4e6b80c 100644
--- a/interface/web/client/reseller_edit.php
+++ b/interface/web/client/reseller_edit.php
@@ -63,7 +63,7 @@ class page_action extends tform_actions {
 			$client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]);
 			$client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 
-			// Check if the user may add another website.
+			// Check if the user may add another.
 			if($client["limit_client"] >= 0) {
 				$tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = ?", $client_group_id);
 				if($tmp["number"] >= $client["limit_client"]) {
@@ -86,7 +86,7 @@ class page_action extends tform_actions {
 			$client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]);
 			$client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 
-			// Check if the user may add another website.
+			// Check if the user may add another.
 			if($client["limit_client"] >= 0) {
 				$tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = ?", $client_group_id);
 				if($tmp["number"] >= $client["limit_client"]) {
diff --git a/interface/web/dashboard/dashlets/limits.php b/interface/web/dashboard/dashlets/limits.php
index a649fef0f7fdfe9a28a1244e257b0ec780732976..50bcad91222b13b1405cd0e85ae336051af1fb0c 100644
--- a/interface/web/dashboard/dashlets/limits.php
+++ b/interface/web/dashboard/dashlets/limits.php
@@ -169,13 +169,13 @@ class dashlet_limits
             }
             if ($value != 0 || $value == $wb['unlimited_txt']) {
                 $value_formatted = ($value == '-1')?$wb['unlimited_txt']:$value;
-                if ($limit['q_type']!='') {
+                if (isset($limit['q_type']) && $limit['q_type'] != '') {
                     $usage = $this->_get_assigned_quota($limit) . " MB";
                     $value_formatted = ($value == '-1')?$wb['unlimited_txt']:$value . " MB";
                 } else {
                     $usage = $this->_get_limit_usage($limit);
                 }
-                $percentage = ($value == '-1' || $value == 0 ? -1 : round(100 * $usage / $value));
+                $percentage = ($value == '-1' || intval($value) == 0 || trim($value) == '' ? -1 : round(100 * (int)$usage / (int)$value));
                 $progressbar = $percentage > 100 ? 100 : $percentage;
                 $rows[] = array('field' => $field,
                     'field_txt' => $wb[$field.'_txt'],
diff --git a/interface/web/dashboard/dashlets/templates/databasequota.htm b/interface/web/dashboard/dashlets/templates/databasequota.htm
index 082dd1f8c0dfdbdba890de2471098a540f34cfc1..4e8db908bd137575b08fcc386ac821fee57e09b8 100644
--- a/interface/web/dashboard/dashlets/templates/databasequota.htm
+++ b/interface/web/dashboard/dashlets/templates/databasequota.htm
@@ -14,7 +14,7 @@
 			  <td>{tmpl_var name='database_name'}</td>
 			  <td>{tmpl_var name='used'}</td>
 			  <td>{tmpl_var name='database_quota'}</td>
-			  {tmpl_if name="quota_raw" op="!=" value="0"}<td>
+			  {tmpl_if name="quota_raw" op="!=" value="-1"}<td>
 			  <div class='progress'>
 				  <div class='progress-bar-striped progress-bar progress-bar-{tmpl_if name="used_percentage" op="<" value="50"}success{tmpl_elseif name="used_percentage" op="<" value="75"}warning{tmpl_else}danger{/tmpl_if}' role='progressbar' aria-valuemin='0' aria-valuemax='100' aria-valuenow='{tmpl_var name="used_percentage"}' style='width: {tmpl_var name="used_percentage"}%'><span>{tmpl_var name="used_percentage"}%</span>
 				  <span class='sr-only'>{tmpl_var name='used'} {tmpl_var name='of_txt'} {tmpl_var name='database_quota'}</span>
diff --git a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng
index 68f5e262c2e44fbe53011e264a8b3c5b88cb2c74..07a84bef10e5493dc1090433c70913615aa72da8 100644
--- a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng
+++ b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng
@@ -27,8 +27,8 @@ $wb['limit_client_txt'] = 'Anzahl der Kunden';
 $wb['limit_database_txt'] = 'Anzahl der Datenbanken';
 $wb['limit_mailmailinglist_txt'] = 'Anzahl der Mailinglisten';
 $wb['limit_domain_txt'] = 'Anzahl der Domains';
-$wb['limit_mailquota_txt'] = 'Assigned mailbox quota';
-$wb['limit_web_quota_txt'] = 'Assigned web quota';
-$wb['limit_database_quota_txt'] = 'Assigned database quota';
-$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries';
-?>
+$wb['limit_mailquota_txt'] = 'Zugewiesenes Postfach-Speicherkontingent';
+$wb['limit_web_quota_txt'] = 'Zugewiesenes Webspace-Speicherkontingent';
+$wb['limit_database_quota_txt'] = 'Zugewiesenes Datenbank-Speicherkontingent';
+$wb['limit_mail_wblist_txt'] = 'Anzahl der Email white / blacklist Einträge';
+
diff --git a/interface/web/dns/dns_edit_base.php b/interface/web/dns/dns_edit_base.php
index 61c08f6576a9f6eff032b249728d2a0e2210d56e..3d15ec1d8636402fef136de05394826f618b531f 100644
--- a/interface/web/dns/dns_edit_base.php
+++ b/interface/web/dns/dns_edit_base.php
@@ -41,6 +41,10 @@ $app->load('tform_actions');
 class dns_page_action extends tform_actions {
 
 	protected function checkDuplicate() {
+                global $app;
+		// If a CNAME RR is present at a node, no other data should be present
+                $tmp = $app->db->queryOneRecord("SELECT count(dns_rr.id) as number FROM dns_rr LEFT JOIN dns_soa ON dns_rr.zone = dns_soa.id WHERE (type = 'CNAME' AND ( name = replace(?, concat('.', dns_soa.origin), '') or name = ? or name = concat(?,'.',dns_soa.origin) ) AND zone = ? and dns_rr.id != ?)", $this->dataRecord["name"], $this->dataRecord["name"], $this->dataRecord["name"], $this->dataRecord["zone"], $this->id);
+                if($tmp['number'] > 0) return true;
 		return false;
 	}
 
diff --git a/interface/web/dns/dns_soa_edit.php b/interface/web/dns/dns_soa_edit.php
index e17571e73612e8db511c303479aa3c87aed0ae8c..309a84236abc9dffa8b6943a3da54aeec5dae2ba 100644
--- a/interface/web/dns/dns_soa_edit.php
+++ b/interface/web/dns/dns_soa_edit.php
@@ -79,6 +79,16 @@ class page_action extends tform_actions {
 		parent::onShowNew();
 	}
 
+	function onShowEdit() {
+		global $app, $conf;
+
+		parent::onShowEdit();
+
+		if(isset($this->dataRecord)) {
+			$app->tform->formDef['title'] = $app->lng('DNS Zone') . ' ' . $this->dataRecord['origin'];
+		}
+	}
+
 	function onShowEnd() {
 		global $app, $conf;
 
diff --git a/interface/web/dns/lib/lang/nl_dns_slave.lng b/interface/web/dns/lib/lang/nl_dns_slave.lng
index 2cf4d13922dd5bb9ac1d36942c318e478b79fb53..f2f944042f5962785cd41d6c414f2aee73864d5e 100644
--- a/interface/web/dns/lib/lang/nl_dns_slave.lng
+++ b/interface/web/dns/lib/lang/nl_dns_slave.lng
@@ -3,7 +3,7 @@ $wb['server_id_txt'] = 'Server';
 $wb['origin_txt'] = 'DNS Zone';
 $wb['ns_txt'] = 'NS';
 $wb['active_txt'] = 'Actief';
-$wb['limit_dns_slave_zone_txt'] = 'Het max. aan secundary DNS records voor uw account is bereikt.';
+$wb['limit_dns_slave_zone_txt'] = 'Het max. aan secundary DNS zones voor uw account is bereikt.';
 $wb['client_txt'] = 'Klant';
 $wb['xfer_txt'] = 'Sta zone transfers toe naar <br />deze IPs (komma gescheiden waarden)';
 $wb['server_id_error_empty'] = 'Geen server geselecteerd';
@@ -11,7 +11,7 @@ $wb['origin_error_empty'] = 'Zone is niet ingvuld.';
 $wb['origin_error_unique'] = 'Er is al een record for deze zone.';
 $wb['origin_error_regex'] = 'Zone heeft een ongeldig formaat.';
 $wb['ns_error_regex'] = 'NS heeft een ongeldig formaat.';
-$wb['eg_domain_tld'] = 'e.g. domain.tld.';
-$wb['ipv4_form_txt'] = 'Separate multiple IPs with commas';
+$wb['eg_domain_tld'] = 'bijvoorbeeld domein.tld.';
+$wb['ipv4_form_txt'] = 'Scheid meerdere IPs met een komma';
 $wb['secondary_zone_txt'] = 'Secondary DNS Zone';
 ?>
diff --git a/interface/web/login/index.php b/interface/web/login/index.php
index c4643f4ed2f9f7c076df06a15106b40c1ba93cb8..e85faff8d4ad2d2aa461e2944a296e844f22b944 100644
--- a/interface/web/login/index.php
+++ b/interface/web/login/index.php
@@ -140,7 +140,7 @@ function process_login_request(app $app, &$error, $conf, $module)
 		} else {
 
 			//* Do 2FA authentication
-			if($user['otp_type'] != 'none') {
+			if(isset($user['otp_type']) && $user['otp_type'] != 'none') {
 
 				//* Save session in pending state and destroy original session
 				$_SESSION['s_pending'] = $_SESSION['s'];
diff --git a/interface/web/login/lib/lang/de.lng b/interface/web/login/lib/lang/de.lng
index dcb94af7168cafcdd4af58137fd246fe8933bb1f..445f3da169bebc83242a810526a14612751eea63 100644
--- a/interface/web/login/lib/lang/de.lng
+++ b/interface/web/login/lib/lang/de.lng
@@ -27,18 +27,18 @@ $wb['error_maintenance_mode'] = 'Diese ISPConfig Installation wird gerade gewart
 $wb['theme_not_compatible'] = 'Das gewählte Design ist mit dieser ISPConfig Version nicht kompatibel. Bitte prüfen Sie, ob ein Update des Themes verfügbar ist.<br />Es wurde nun automatisch das Standard Design aktiviert.';
 $wb['back_txt'] = 'Zur&uuml;ck';
 $wb['stay_logged_in_txt'] = 'Dauerhaft eingeloggt bleiben';
-$wb['email_error'] = 'Email contains unallowed characters or has a invalid format.';
+$wb['email_error'] = 'Die E-Mail-Adresse enthält unzulässige Zeichen oder hat ein ungültiges Format.';
 $wb['lost_password_function_disabled_txt'] = 'Die Passwort vergessen Funktion steht für diesen Benutzer nicht zur Verfügung.';
 $wb['lost_password_function_wait_txt'] = 'Sie können im Moment kein neues Passwort anfordern. Bitte warten Sie einige Minuten.';
 $wb['lost_password_function_expired_txt'] = 'Der Passwortlink ist abgelaufen. Bitte fordern Sie einen neuen an.';
 $wb['lost_password_function_denied_txt'] = 'Dieser Passwortlink ist ungültig.';
-$wb['otp_code_txt'] = 'Two Factor Authentication';
-$wb['otp_code_desc_txt'] = 'Enter the code you got from your authenticator app or via email.';
-$wb['otp_code_placeholder_txt'] = 'OTP code';
-$wb['otp_code_email_sent_txt'] = 'An email was sent to';
-$wb['otp_code_email_subject_txt'] = 'ISPConfig Login authentication';
-$wb['otp_code_email_template_txt'] = 'Your One time login code is %s' . PHP_EOL . 'This code is valid for 10 minutes.' . PHP_EOL;
-$wb['otp_code_resend_txt'] = 'Request new code';
-$wb['otp_code_email_sent_failed_txt'] = 'Failed sending an email to %s';
-$wb['otp_code_email_sent_wait_txt'] = 'Please wait, re-sending the code is only possible after %s seconds.';
-?>
+$wb['otp_code_txt'] = 'Zwei-Faktor-Authentifizierung';
+$wb['otp_code_desc_txt'] = 'Geben Sie den Code ein, den Sie von Ihrer Authentifizierungs-App oder per E-Mail erhalten haben.';
+$wb['otp_code_placeholder_txt'] = 'OTP Code';
+$wb['otp_code_email_sent_txt'] = 'Eine E-Mail wurde versandt an';
+$wb['otp_code_email_subject_txt'] = 'ISPConfig Login Authentifizierung';
+$wb['otp_code_email_template_txt'] = 'Ihr einmaliger Anmeldecode lautet %s' . PHP_EOL . 'Dieser Code ist 10 Minuten lang gültig.' . PHP_EOL;
+$wb['otp_code_resend_txt'] = 'Neuen Code anfordern';
+$wb['otp_code_email_sent_failed_txt'] = 'Senden einer E-Mail an %s fehlgeschlagen';
+$wb['otp_code_email_sent_wait_txt'] = 'Bitte warten Sie, das erneute Senden des Codes ist erst nach %s Sekunden möglich';
+
diff --git a/interface/web/login/lib/lang/nl.lng b/interface/web/login/lib/lang/nl.lng
index 453aae6fac9bdc7ef6646a2fcd9e6db23c2f67f7..638ccc2313e085b216202b12531a96a1268d470f 100644
--- a/interface/web/login/lib/lang/nl.lng
+++ b/interface/web/login/lib/lang/nl.lng
@@ -7,7 +7,7 @@ $wb['pass_reset_txt'] = 'Een nieuw wachtwoord zal worden gegenereerd en per e-ma
 $wb['pw_reset'] = 'Het wachtwoord is gereset en is verzonden naar uw e-mailadres.';
 $wb['pw_error'] = 'Gebruikersnaam of e-mailadres komt niet overeen.';
 $wb['pw_error_noinput'] = 'Voer a.u.b. een e-mailadres en gebruikersnaam in.';
-$wb['pw_reset_error_smtp_connection'] = 'There was a connection problem when trying to send an email pertaining to your password reset request.';
+$wb['pw_reset_error_smtp_connection'] = 'Het versturen van een email met uw nieuwe wachtwoord is mislukt.';
 $wb['pw_reset_mail_msg'] = 'Het wachtwoord  dat toegang biedt tot uw ISPConfig 3 control panel account is gereset. Het nieuwe wachtwoord is: ';
 $wb['pw_reset_mail_title'] = 'ISPConfig 3 Control panel wachtwoord is gereset.';
 $wb['user_regex_error'] = 'Gebruikersnaam bevat karakters die niet zijn toegestaan of is langer dan 64 karakters.';
@@ -21,17 +21,17 @@ $wb['login_txt'] = 'Inloggen';
 $wb['pw_reset_txt'] = 'Wachtwoord herstellen';
 $wb['pw_button_txt'] = 'Wachtwoord versturen';
 $wb['email_txt'] = 'Email';
-$wb['theme_not_compatible'] = 'The chosen theme is not compatible with the current ISPConfig version. Please check for a new version of the theme.<br />The default theme as been activated automatically.';
-$wb['back_txt'] = 'Back';
-$wb['email_error'] = 'Email contains unallowed characters or has a invalid format.';
-$wb['stay_logged_in_txt'] = 'Keep me logged in';
-$wb['lost_password_function_disabled_txt'] = 'The lost password function is not available for this user.';
-$wb['pw_reset_act'] = 'You have been sent an activation link. Please visit the link to confirm your password request.';
-$wb['pw_reset_act_mail_title'] = 'Confirm ISPConfig 3 Control panel password reset';
-$wb['pw_reset_act_mail_msg'] = 'Please confirm that your want to reset your ISPConfig 3 control panel account password by visiting the following activation link: ';
-$wb['lost_password_function_wait_txt'] = 'You cannot request a new password, yet. Please wait a few minutes.';
-$wb['lost_password_function_expired_txt'] = 'This activation link has expired. Please request a new one.';
-$wb['lost_password_function_denied_txt'] = 'This activation link is not valid.';
+$wb['theme_not_compatible'] = 'De gekozen vormgeving is niet geschikt voor de huidige ISPConfig versie. Controleer of er een update beschikbaar is.<br />De standaard vormgeving is automatisch geactiveerd.';
+$wb['back_txt'] = 'Terug';
+$wb['email_error'] = 'Email bevat ongeldige tekens of heeft een vereerde opbouw.';
+$wb['stay_logged_in_txt'] = 'Blijf ingelogd';
+$wb['lost_password_function_disabled_txt'] = 'De Wachtwoord vergeten functie is niet beschikbaar voor deze gebruiker.';
+$wb['pw_reset_act'] = 'Er is een wachtwoord reset link verstuurd. Volg de link in die mail om uw verzoek te bevestigen.';
+$wb['pw_reset_act_mail_title'] = 'ISPConfig 3 Control panel wachtwoord herstel';
+$wb['pw_reset_act_mail_msg'] = 'Er is een nieuw wachtwoord aangevraag voor uw account. Bevestig via de volgende link dat dit de bedoeling is. Als u dit niet was kunt u dit beter niet doen. ';
+$wb['lost_password_function_wait_txt'] = 'U kunt op dit moment geen nieuw wachtwoord aanvragen, probeer het later nog eens.';
+$wb['lost_password_function_expired_txt'] = 'De wachtwoordherstel link is verlopen. U kunt een nieuwe aanvragen.';
+$wb['lost_password_function_denied_txt'] = 'Deze link is niet (meer) geldig.';
 $wb['otp_code_txt'] = 'Twee-factor authenticatie';
 $wb['otp_code_desc_txt'] = 'Enter the code you got from your authenticator app or via email.';
 $wb['otp_code_placeholder_txt'] = 'OTP code';
@@ -41,4 +41,5 @@ $wb['otp_code_email_template_txt'] = 'Uw eenmalige login code is %s' . PHP_EOL .
 $wb['otp_code_resend_txt'] = 'Aanvragen nieuwe code';
 $wb['otp_code_email_sent_failed_txt'] = 'Verzenden van email naar %s is mislukt.';
 $wb['otp_code_email_sent_wait_txt'] = 'Please wait, re-sending the code is only possible after %s seconds.';
+
 ?>
diff --git a/interface/web/mail/form/mail_mailinglist.tform.php b/interface/web/mail/form/mail_mailinglist.tform.php
index 295bd8d5710fc33c1736656500ef322eeee6186f..7834b005de880427ddf883e204c2b74d99b57aee 100644
--- a/interface/web/mail/form/mail_mailinglist.tform.php
+++ b/interface/web/mail/form/mail_mailinglist.tform.php
@@ -103,6 +103,10 @@ $form["tabs"]['mailinglist'] = array (
 					'errmsg'=> 'listname_error_empty'),
 				1 => array ( 'type' => 'UNIQUE',
 					'errmsg'=> 'listname_error_unique'),
+				2 => array (
+					'type'	=> 'REGEX',
+					'regex' => '/^[_a-z0-9][\w\.\-_\+@]{1,255}$/',
+					'errmsg'=> 'listname_error_regex'),
 			),
 			'filters'   => array(
 					0 => array( 'event' => 'SAVE',
diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php
index 32e58686e28a16d312fd2884e3d3d0d1bc6e34cc..f513aeb9d3e4763f3f9947f91c9f00cba6e2d53b 100644
--- a/interface/web/mail/form/mail_user.tform.php
+++ b/interface/web/mail/form/mail_user.tform.php
@@ -166,7 +166,7 @@ $form["tabs"]['mailuser'] = array(
 					'regex' => '/^([0-9]{1,})$/',
 					'errmsg'=> 'quota_error_value'),
 			),
-			'default' => '-1',
+			'default' => '0',
 			'value'  => '',
 			'width'  => '30',
 			'maxlength' => '255'
diff --git a/interface/web/mail/lib/lang/ar_mail_mailinglist.lng b/interface/web/mail/lib/lang/ar_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..4b11277e1f240e04267b90287198950e7f28de50 100644
--- a/interface/web/mail/lib/lang/ar_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/ar_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
diff --git a/interface/web/mail/lib/lang/bg_mail_mailinglist.lng b/interface/web/mail/lib/lang/bg_mail_mailinglist.lng
index 74db3ed6f22d1626ab953d7325ac73c3d5faa28a..a2ccf282c7515c0eff891e42d8e5e8bc03d0cc8d 100644
--- a/interface/web/mail/lib/lang/bg_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/bg_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Достигнат лимит';
 $wb['domain_error_empty'] = 'Полето с домейн е празно.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Имейла се изполва';
 $wb['no_domain_perm'] = 'Ти нямаш права за този домейн.';
diff --git a/interface/web/mail/lib/lang/br_mail_mailinglist.lng b/interface/web/mail/lib/lang/br_mail_mailinglist.lng
index 035eb6456bfaf3e2cdde946d994895749adf405f..6a113f4e63d0663b8c0fefe9acc426c6846ca592 100644
--- a/interface/web/mail/lib/lang/br_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/br_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['mailinglist_txt'] = 'Lista de email';
 $wb['limit_mailmailinglist_txt'] = 'O limite foi alcançado.';
 $wb['domain_error_empty'] = 'O domínio está vazio.';
 $wb['listname_error_empty'] = 'O nome da lista está vazio.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'O domínio é inválido.';
 $wb['email_in_use_txt'] = 'O email já está em uso.';
 $wb['no_domain_perm'] = 'Você não tem permissão para este domínio.';
diff --git a/interface/web/mail/lib/lang/ca_mail_mailinglist.lng b/interface/web/mail/lib/lang/ca_mail_mailinglist.lng
index 919e7079e579bb97da3af9f10d2a9700baf25e92..fbdc5307a6afc6080c981825986aebcb04945c94 100644
--- a/interface/web/mail/lib/lang/ca_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/ca_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limite atteinte';
 $wb['domain_error_empty'] = 'Le domain est vide.';
 $wb['listname_error_empty'] = 'Le nom de la liste est vide.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Nom de domaine invalide.';
 $wb['email_in_use_txt'] = 'L\'email est en cours d\'utilisation';
 $wb['no_domain_perm'] = 'Vous n\'avez pas la permission pour ce domain.';
diff --git a/interface/web/mail/lib/lang/cz_mail_mailinglist.lng b/interface/web/mail/lib/lang/cz_mail_mailinglist.lng
index e553c95bdea6d47f38f44890c478b2e0e8337fe6..f67d11251bfadbda8a95e476ae5a5cfd22791049 100644
--- a/interface/web/mail/lib/lang/cz_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/cz_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Omezení limitu dosaženo';
 $wb['domain_error_empty'] = 'Doména je prázdná.';
 $wb['listname_error_empty'] = 'Název seznamu je prázdný.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Neplatný název domény.';
 $wb['email_in_use_txt'] = 'E-mail je již používán';
 $wb['no_domain_perm'] = 'Nemáte oprávnění pro tuto doménu.';
diff --git a/interface/web/mail/lib/lang/de_mail_mailinglist.lng b/interface/web/mail/lib/lang/de_mail_mailinglist.lng
index 1d143b690c4197d8cd370d638eecc5c4103259be..e09153f44b4d386cf600eb83623c5a5b5e2df126 100644
--- a/interface/web/mail/lib/lang/de_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/de_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['limit_mailmailinglist_txt'] = 'Limit erreicht';
 $wb['domain_error_empty'] = 'Domain ist leer.';
 $wb['listname_error_empty'] = 'Listenname ist leer.';
 $wb['domain_error_regex'] = 'Domain Name ist nicht gültig.';
+$wb['listname_error_regex'] = 'Der Listenname ist ungültig. Die Mindestlänge beträgt 2 Zeichen (erlaubt sind: [a-z 1-9 - _])';
 $wb['email_in_use_txt'] = 'E-Mail Adresse ist bereits in Benutzung';
 $wb['no_domain_perm'] = 'Sie haben keine Rechte für diese Domain.';
 $wb['password_strength_txt'] = 'Passwortkomplexität';
diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng
index 8e607b80f19598a3d6e07a8b11ef529cf0dffcc1..2c49f352ff12b599aa7229dcd5f30396d9887c5a 100644
--- a/interface/web/mail/lib/lang/de_mail_user.lng
+++ b/interface/web/mail/lib/lang/de_mail_user.lng
@@ -17,7 +17,7 @@ $wb['server_id_txt'] = 'Server ID';
 $wb['password_txt'] = 'Passwort';
 $wb['maildir_txt'] = 'E-Mail Verzeichnis';
 $wb['postfix_txt'] = 'Aktiviere Empfang';
-$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.';
+$wb['tooltip_postfix_txt'] = 'Lässt eingehende E-Mails an diese E-Mail-Adresse zu.';
 $wb['greylisting_txt'] = 'Aktiviere Greylisting';
 $wb['access_txt'] = 'Aktiviere Zugriff';
 $wb['policy_txt'] = 'Spamfilter';
@@ -25,9 +25,9 @@ $wb['inherit_policy'] = '- Inherit domain setting -';
 $wb['limit_mailbox_txt'] = 'Die maximale Anzahl an E-Mailkonten für Ihr Konto wurde erreicht.';
 $wb['limit_mailquota_txt'] = 'Der maximale Speicherplatz für Ihr E-Mail Konto wurde erreicht. Der maximal verfügbare Speicher in MB ist';
 $wb['disablesmtp_txt'] = 'SMTP (Mailversand) deaktivieren';
-$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.';
-$wb['disabledeliver_txt'] = 'Disable (local) delivering';
-$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts.  Mail forwards to \'Send copy to\' address.';
+$wb['tooltip_disablesmtp_txt'] = 'Deaktiviert den Versand von E-Mails von diesem E-Mail-Konto.';
+$wb['disabledeliver_txt'] = 'Deaktiviere lokale Zustellung';
+$wb['tooltip_disabledeliver_txt'] = 'Deaktiviert die Zustellung in den Posteingang und die Verarbeitung durch Mailfilter und Sieve-Skripte. Mails werden an die Adresse \"Kopie senden an\" weitergeleitet.';
 $wb['disableimap_txt'] = 'IMAP deaktivieren';
 $wb['disablepop3_txt'] = 'POP3 deaktivieren';
 $wb['password_strength_txt'] = 'Passwortkomplexität';
@@ -37,17 +37,17 @@ $wb['autoresponder_start_date_txt'] = 'Startet am';
 $wb['autoresponder_start_date_ispast'] = 'Startdatum kann nicht in der Vergangenheit liegen.';
 $wb['autoresponder_end_date_txt'] = 'Endet am';
 $wb['autoresponder_end_date_isgreater'] = 'Enddatum muss angegeben werden und muss später als das Startdatum sein.';
-$wb['move_junk_txt'] = 'Spam E-Mails in das Junk Verzeichnis verschieben';
-$wb['move_junk_y_txt'] = 'Move first, before custom filters.';
-$wb['move_junk_a_txt'] = 'Move last, after custom filters.';
-$wb['move_junk_n_txt'] = 'Do not move Spam Emails to Junk folder.';
+$wb['move_junk_txt'] = 'Spam E-Mails in den Junk-Ordner verschieben';
+$wb['move_junk_y_txt'] = 'Zuerst verschieben, vor benutzerdefinierten Filtern.';
+$wb['move_junk_a_txt'] = 'Als Letztes verschieben, nach benutzerdefinierten Filtern.';
+$wb['move_junk_n_txt'] = 'Spam-E-Mails nicht in den Junk-Ordner verschieben.';
 $wb['name_txt'] = 'Name';
 $wb['name_optional_txt'] = '(optional)';
 $wb['autoresponder_active'] = 'Autoresponder aktivieren';
 $wb['cc_txt'] = 'Eingehende Mails in Kopie senden an';
 $wb['cc_error_isemail'] = 'Das Feld "Kopie senden an" enthält keine gültige E-Mail Adresse';
-$wb['forward_in_lda_txt'] = 'Copy during delivery';
-$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.';
+$wb['forward_in_lda_txt'] = 'Kopiere E-Mail während der Zustellung';
+$wb['tooltip_forward_in_lda_txt'] = 'Legt fest, ob die E-Mail-Kopie vor oder während der Zustellung an die Mailbox weitergeleitet werden soll.';
 $wb['login_error_unique'] = 'Benutzername wird bereits verwendet.';
 $wb['login_error_regex'] = 'Zulässige Zeichen sind A-Z, a-z, 0-9, ., _ und -.';
 $wb['login_txt'] = 'Anmelden';
@@ -70,8 +70,8 @@ $wb['sender_cc_txt'] = 'Kopie ausgehender Emails senden an (BCC)';
 $wb['sender_cc_error_isemail'] = '-Kopie ausgehender Emails senden an- Feld enthält keine gültige Emailadresse';
 $wb['sender_cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)';
 $wb['password_click_to_set_txt'] = 'Passwort erzeugen';
-$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days';
-$wb['tooltip_purge_trash_days_txt'] = '0 = disabled';
-$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days';
-$wb['tooltip_purge_junk_days_txt'] = '0 = disabled';
-?>
+$wb['purge_trash_days_txt'] = 'Papierkorb automatisch nach X Tagen leeren';
+$wb['tooltip_purge_trash_days_txt'] = '0 = deaktiviert';
+$wb['purge_junk_days_txt'] = 'Junk-Ordner automatisch nach X Tagen leeren';
+$wb['tooltip_purge_junk_days_txt'] = '0 = deaktiviert';
+
diff --git a/interface/web/mail/lib/lang/dk_mail_mailinglist.lng b/interface/web/mail/lib/lang/dk_mail_mailinglist.lng
index 0868d38e6ead51467bb6ca1f055e8e1d07793f71..4c69c44617cfc67e143186532fb2e0163f726a5d 100644
--- a/interface/web/mail/lib/lang/dk_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/dk_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['mailinglist_txt'] = 'Mailing list';
 $wb['limit_mailmailinglist_txt'] = 'Begrænsninger nået';
 $wb['domain_error_empty'] = 'Domæne er tom.';
 $wb['listname_error_empty'] = 'Listenavn er tom.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Ugyldigt domæne name.';
 $wb['email_in_use_txt'] = 'E-mail er i brug';
 $wb['no_domain_perm'] = 'Du har ikke tilladelse til dette domæne.';
diff --git a/interface/web/mail/lib/lang/el_mail_mailinglist.lng b/interface/web/mail/lib/lang/el_mail_mailinglist.lng
index 5f5e0ffc7b9daf54edaa8473af3fd4000cf67e17..ec7e96afba41293a48cf4b1f6cee739ceea04a01 100644
--- a/interface/web/mail/lib/lang/el_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/el_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Το όριο ξεπεράστηκε.';
 $wb['domain_error_empty'] = 'Το Domain είναι άδειο.';
 $wb['listname_error_empty'] = 'Η λίστα είναι άδεια.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Το όνομα domain δεν είναι έγκυρο/';
 $wb['email_in_use_txt'] = 'Το email χρησιμοποιείται ήδη.';
 $wb['no_domain_perm'] = 'Δεν έχετε δικαιώματα σε αυτό το domain.';
diff --git a/interface/web/mail/lib/lang/en_mail_mailinglist.lng b/interface/web/mail/lib/lang/en_mail_mailinglist.lng
index c21a6a8cbcd3197052b5a5045ab63e188c0303af..47be58d1dbad615b0a6288a34729aeb960fe150c 100644
--- a/interface/web/mail/lib/lang/en_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/en_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['mailinglist_txt'] = 'Mailing list';
 $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
@@ -19,4 +20,4 @@ $wb['password_mismatch_txt'] = 'The passwords do not match.';
 $wb['password_match_txt'] = 'The passwords do match.';
 $wb['listname_error_unique'] = 'There is already a mailinglist with name on the server. Please choose a different listname.';
 $wb['email_error_isemail'] = 'Email address is invalid.';
-?>
\ No newline at end of file
+?>
diff --git a/interface/web/mail/lib/lang/es_mail_mailinglist.lng b/interface/web/mail/lib/lang/es_mail_mailinglist.lng
index 5a41780dfaa597f845300e374b36f8e2f025c81b..9bdb29fccde206c89d12d78bd2357516cfd248dd 100644
--- a/interface/web/mail/lib/lang/es_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/es_mail_mailinglist.lng
@@ -9,6 +9,7 @@ $wb['email_txt'] = 'Correo';
 $wb['generate_password_txt'] = 'Generar contraseña';
 $wb['limit_mailmailinglist_txt'] = 'Límite alcanzado';
 $wb['listname_error_empty'] = 'Nombre de la lista vacío.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['listname_error_unique'] = 'Ya existe en el servidor un lista de correos con ese nombre. Por favor elija otro.';
 $wb['listname_txt'] = 'Nombre de lista';
 $wb['mailinglist_txt'] = 'Lista de correo';
diff --git a/interface/web/mail/lib/lang/fi_mail_mailinglist.lng b/interface/web/mail/lib/lang/fi_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..4b11277e1f240e04267b90287198950e7f28de50 100644
--- a/interface/web/mail/lib/lang/fi_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/fi_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
diff --git a/interface/web/mail/lib/lang/fr_mail_mailinglist.lng b/interface/web/mail/lib/lang/fr_mail_mailinglist.lng
index 107b39817f9c456ac861d3a46a0089d25b572c82..69f824a75f367f2ee9945a73f2a37531a85e7ef7 100644
--- a/interface/web/mail/lib/lang/fr_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/fr_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limite atteinte';
 $wb['domain_error_empty'] = 'Le domain est vide.';
 $wb['listname_error_empty'] = 'Le nom de la liste est vide.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Nom de domaine invalide.';
 $wb['email_in_use_txt'] = 'L’email est en cours d’utilisation';
 $wb['no_domain_perm'] = 'Vous n’avez pas la permission pour ce domain.';
diff --git a/interface/web/mail/lib/lang/hr_mail_mailinglist.lng b/interface/web/mail/lib/lang/hr_mail_mailinglist.lng
index 04d3095e72343be61389646cdfe6f48f23fb031e..b8759689d893a55c3881b01ec8b6ec06a757763b 100644
--- a/interface/web/mail/lib/lang/hr_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/hr_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Iskorišten je maksimalan broj email lista.';
 $wb['domain_error_empty'] = 'Domena je prazna.';
 $wb['listname_error_empty'] = 'Naziv liste je prazan.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Neispravan naziv domene.';
 $wb['email_in_use_txt'] = 'Email je u upotrebi';
 $wb['no_domain_perm'] = 'Nemate dozvole za ovu domenu.';
diff --git a/interface/web/mail/lib/lang/hu_mail_mailinglist.lng b/interface/web/mail/lib/lang/hu_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..4b11277e1f240e04267b90287198950e7f28de50 100644
--- a/interface/web/mail/lib/lang/hu_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/hu_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
diff --git a/interface/web/mail/lib/lang/id_mail_mailinglist.lng b/interface/web/mail/lib/lang/id_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..4b11277e1f240e04267b90287198950e7f28de50 100644
--- a/interface/web/mail/lib/lang/id_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/id_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
diff --git a/interface/web/mail/lib/lang/it_mail_mailinglist.lng b/interface/web/mail/lib/lang/it_mail_mailinglist.lng
index 37835237d865b5ab075906add885fa92dcecacba..d57101fcd4b17a29237295e1404cbbe3ef616835 100644
--- a/interface/web/mail/lib/lang/it_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/it_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limite raggiunto';
 $wb['domain_error_empty'] = 'Dominio vuoto.';
 $wb['listname_error_empty'] = 'Listname vuoto.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Nome dominio non valido.';
 $wb['email_in_use_txt'] = 'Email è già in uso';
 $wb['no_domain_perm'] = 'Non hai i diritti per questo dominio.';
diff --git a/interface/web/mail/lib/lang/ja_mail_mailinglist.lng b/interface/web/mail/lib/lang/ja_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..4b11277e1f240e04267b90287198950e7f28de50 100644
--- a/interface/web/mail/lib/lang/ja_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/ja_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
diff --git a/interface/web/mail/lib/lang/nl_mail_mailinglist.lng b/interface/web/mail/lib/lang/nl_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..4b11277e1f240e04267b90287198950e7f28de50 100644
--- a/interface/web/mail/lib/lang/nl_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/nl_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Invalid domain name.';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
diff --git a/interface/web/mail/lib/lang/pl_mail_mailinglist.lng b/interface/web/mail/lib/lang/pl_mail_mailinglist.lng
index f285b1eaea9164178d4092601d30d4390f27abd2..b6a7a6c693e397d219a99f526446cb80abb8a9c5 100644
--- a/interface/web/mail/lib/lang/pl_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/pl_mail_mailinglist.lng
@@ -2,6 +2,7 @@
 $wb['limit_mailmailinglist_txt'] = 'Limit przekroczony';
 $wb['domain_error_empty'] = 'Domena jest pusta.';
 $wb['listname_error_empty'] = 'Nazwa listy jest pusta.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Nieprawidłowa nazwa domeny.';
 $wb['email_in_use_txt'] = 'Email jest już w użyciu';
 $wb['no_domain_perm'] = 'Nie masz uprawnień dla tej domeny.';
diff --git a/interface/web/mail/lib/lang/pt_mail_mailinglist.lng b/interface/web/mail/lib/lang/pt_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..60b64a89297b5a2db282dd72d4c9b2826b5c8dec 100644
--- a/interface/web/mail/lib/lang/pt_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/pt_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
 $wb['domain_error_regex'] = 'Invalid domain name.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
 $wb['password_strength_txt'] = 'Password strength';
diff --git a/interface/web/mail/lib/lang/ro_mail_mailinglist.lng b/interface/web/mail/lib/lang/ro_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..60b64a89297b5a2db282dd72d4c9b2826b5c8dec 100644
--- a/interface/web/mail/lib/lang/ro_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/ro_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
 $wb['domain_error_regex'] = 'Invalid domain name.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
 $wb['password_strength_txt'] = 'Password strength';
diff --git a/interface/web/mail/lib/lang/ru_mail_mailinglist.lng b/interface/web/mail/lib/lang/ru_mail_mailinglist.lng
index 30b78ff3cd6f5e63a01b8228b73853d3c22237d8..b615dfef05c8f6e5c546186755cb716e7619b4ff 100644
--- a/interface/web/mail/lib/lang/ru_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/ru_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['limit_mailmailinglist_txt'] = 'Лимит достигнут';
 $wb['domain_error_empty'] = 'Домен пустой.';
 $wb['listname_error_empty'] = 'Имя списка пустое.';
 $wb['domain_error_regex'] = 'Некорректное имя домена.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['email_in_use_txt'] = 'Этот адрес эл. почты уже используется';
 $wb['no_domain_perm'] = 'У вас нет прав доступа к этому домену.';
 $wb['password_strength_txt'] = 'Стойкость пароля';
diff --git a/interface/web/mail/lib/lang/se_mail_mailinglist.lng b/interface/web/mail/lib/lang/se_mail_mailinglist.lng
index ef65e449dd9ff200a8c0fa09da77f47757fbc8c2..a32e1935f09a90568c5ff1e4594cdaeb26629c2e 100644
--- a/interface/web/mail/lib/lang/se_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/se_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['limit_mailmailinglist_txt'] = 'Gränsen nådd';
 $wb['domain_error_empty'] = 'Domänfältet är tomt.';
 $wb['listname_error_empty'] = 'Listnamnfältet är tomt.';
 $wb['domain_error_regex'] = 'Ogiltigt domännamn.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['email_in_use_txt'] = 'Epostadressen används redan';
 $wb['no_domain_perm'] = 'Du har inte rättigheter för denna domän.';
 $wb['password_strength_txt'] = 'Lösenordsstyrka';
diff --git a/interface/web/mail/lib/lang/sk_mail_mailinglist.lng b/interface/web/mail/lib/lang/sk_mail_mailinglist.lng
index 5e16270b9c996ddc5ad888c4ddac693c924fe1fc..60b64a89297b5a2db282dd72d4c9b2826b5c8dec 100644
--- a/interface/web/mail/lib/lang/sk_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/sk_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['limit_mailmailinglist_txt'] = 'Limit reached';
 $wb['domain_error_empty'] = 'Domain is empty.';
 $wb['listname_error_empty'] = 'Listname is empty.';
 $wb['domain_error_regex'] = 'Invalid domain name.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['email_in_use_txt'] = 'Email is in use';
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
 $wb['password_strength_txt'] = 'Password strength';
diff --git a/interface/web/mail/lib/lang/tr_mail_mailinglist.lng b/interface/web/mail/lib/lang/tr_mail_mailinglist.lng
index 4bd52db75e65b96c2fa8320e8408ee60e215e288..7c701b14db6b8afe4393a4d793063fe3936e29ee 100644
--- a/interface/web/mail/lib/lang/tr_mail_mailinglist.lng
+++ b/interface/web/mail/lib/lang/tr_mail_mailinglist.lng
@@ -3,6 +3,7 @@ $wb['mailinglist_txt'] = 'E-posta Listesi';
 $wb['limit_mailmailinglist_txt'] = 'Sınıra ulaşıldı';
 $wb['domain_error_empty'] = 'Etki alanı boş olamaz.';
 $wb['listname_error_empty'] = 'Liste adı boş olamaz.';
+$wb['listname_error_regex'] = 'The list name is invalid. The minimum length is 2 characters (allowed are: [a-z 1-9 - _]).';
 $wb['domain_error_regex'] = 'Etki alanı geçersiz.';
 $wb['email_in_use_txt'] = 'E-posta kullanımda';
 $wb['no_domain_perm'] = 'Bu etki alanı için izniniz yok.';
diff --git a/interface/web/mail/lib/remote.conf.php b/interface/web/mail/lib/remote.conf.php
index 3060a8b4cc7be87c3e15f75f015822eac8bec2a4..38f57fcf19b715a94b7f6b89493118f2b142150f 100644
--- a/interface/web/mail/lib/remote.conf.php
+++ b/interface/web/mail/lib/remote.conf.php
@@ -9,6 +9,7 @@ $function_list['mail_forward_get,mail_forward_add,mail_forward_update,mail_forwa
 $function_list['mail_catchall_get,mail_catchall_add,mail_catchall_update,mail_catchall_delete'] = 'Mail catchall functions';
 $function_list['mail_transport_get,mail_transport_add,mail_transport_update,mail_transport_delete'] = 'Mail transport functions';
 $function_list['mail_relay_get,mail_relay_add,mail_relay_update,mail_relay_delete'] = 'Mail relay functions';
+$function_list['mail_relay_domain_add,mail_relay_domain_delete,mail_relay_domain_get,mail_relay_domain_update'] = 'Mail relay domain functions';
 $function_list['mail_whitelist_get,mail_whitelist_add,mail_whitelist_update,mail_whitelist_delete'] = 'Mail whitelist functions';
 $function_list['mail_blacklist_get,mail_blacklist_add,mail_blacklist_update,mail_blacklist_delete'] = 'Mail blacklist functions';
 $function_list['mail_spamfilter_user_get,mail_spamfilter_user_add,mail_spamfilter_user_update,mail_spamfilter_user_delete'] = 'Mail spamfilter user functions';
diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php
index d8730fa2ebe78c3885af10f785a276e016b7ecfe..1c2bc47313745483d9ac83f50b4fb3a346cae57a 100644
--- a/interface/web/mail/mail_user_edit.php
+++ b/interface/web/mail/mail_user_edit.php
@@ -67,6 +67,17 @@ class page_action extends tform_actions {
 		parent::onShowNew();
 	}
 
+	function onShowEdit() {
+		global $app, $conf;
+
+		parent::onShowEdit();
+
+		if(isset($this->dataRecord)) {
+			$app->tform->formDef['title'] = $app->lng('Mailbox') . ' ' . $this->dataRecord['email'];
+		}
+	}
+
+
 	function onShowEnd() {
 		global $app, $conf;
 
diff --git a/interface/web/mailuser/mail_user_autoresponder_edit.php b/interface/web/mailuser/mail_user_autoresponder_edit.php
index 827a585e509edfb5fb261d810d4dd6501f290521..9ec98f39af06244c5751234b4ec2c5ce0551556f 100644
--- a/interface/web/mailuser/mail_user_autoresponder_edit.php
+++ b/interface/web/mailuser/mail_user_autoresponder_edit.php
@@ -64,8 +64,8 @@ class page_action extends tform_actions {
 
 		//* if autoresponder checkbox not selected, do not save dates
 		if (!isset($_POST['autoresponder']) && array_key_exists('autoresponder_start_date', $_POST)) {
-			$this->dataRecord['autoresponder_start_date'] = array_map(create_function('$item', 'return 0;'), $this->dataRecord['autoresponder_start_date']);
-			$this->dataRecord['autoresponder_end_date'] = array_map(create_function('$item', 'return 0;'), $this->dataRecord['autoresponder_end_date']);
+			$this->dataRecord['autoresponder_start_date'] = array_map(function($item) { return 0;}, $this->dataRecord['autoresponder_start_date']);
+			$this->dataRecord['autoresponder_end_date'] = array_map(function($item) { return 0;}, $this->dataRecord['autoresponder_end_date']);
 			
 			/* To be used when we go to PHP 7.x as min PHP version
 			$this->dataRecord['autoresponder_start_date'] = array_map( function ('$item') { 'return 0;' }, $this->dataRecord['autoresponder_start_date']);
diff --git a/interface/web/monitor/lib/lang/de_syslog_list.lng b/interface/web/monitor/lib/lang/de_syslog_list.lng
index 6ee36a677bbdb35401f07cf1c37a0267abfebf4c..0fefe2fa72b42690c6d35a2b127a44fc201e85ff 100644
--- a/interface/web/monitor/lib/lang/de_syslog_list.lng
+++ b/interface/web/monitor/lib/lang/de_syslog_list.lng
@@ -4,7 +4,7 @@ $wb['tstamp_txt'] = 'Datum';
 $wb['server_id_txt'] = 'Server';
 $wb['loglevel_txt'] = 'Protokoll-Level';
 $wb['message_txt'] = 'Nachricht';
-$wb['batch_delete_errors_txt'] = 'Remove all warnings';
-$wb['batch_delete_errors_txt'] = 'Remove all errors';
-$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?';
-?>
+$wb['batch_delete_warnings_txt'] = 'Alle Warnungen löschen';
+$wb['batch_delete_errors_txt'] = 'Alle Fehler löschen';
+$wb['batch_delete_confirmation'] = 'Sind Sie sicher, dass alle ausgewählten Protokolleinträge gelöscht werden sollen?';
+
diff --git a/interface/web/sites/database_edit.php b/interface/web/sites/database_edit.php
index 60b26bc767ce3968098d9fc9deb5e2b5bfe54b66..55c582eeda06ee701372ec4a9b719adde6ad7cd9 100644
--- a/interface/web/sites/database_edit.php
+++ b/interface/web/sites/database_edit.php
@@ -369,7 +369,7 @@ class page_action extends tform_actions {
 			} else {
 				$remote_ips = explode(",", $global_config['default_remote_dbserver']);
 			}
-			if (!in_array($server_config['ip_address'], $default_remote_db)) { $remote_ips[] = $server_config['ip_address']; }
+			if (!in_array($server_config['ip_address'], $remote_ips)) { $remote_ips[] = $server_config['ip_address']; }
 
 			if($server_config['ip_address']!='') {
 				if($this->dataRecord['remote_access'] != 'y'){
@@ -459,7 +459,7 @@ class page_action extends tform_actions {
 				$remote_ips = explode(",", $global_config['default_remote_dbserver']);
 			}
 			
-			if (!in_array($server_config['ip_address'], $default_remote_db)) { $remote_ips[] = $server_config['ip_address']; }
+			if (!in_array($server_config['ip_address'], $remote_ips)) { $remote_ips[] = $server_config['ip_address']; }
 
 			if($server_config['ip_address']!='') {
 				if($this->dataRecord['remote_access'] != 'y'){
diff --git a/interface/web/sites/lib/lang/de_web_backup_list.lng b/interface/web/sites/lib/lang/de_web_backup_list.lng
index 11ebcd0645ecc950b456a31491325a58bad18682..b95c968e12b953e2f1e87b32e370d181077ed0b9 100644
--- a/interface/web/sites/lib/lang/de_web_backup_list.lng
+++ b/interface/web/sites/lib/lang/de_web_backup_list.lng
@@ -17,23 +17,23 @@ $wb['delete_confirm_txt'] = 'Möchten Sie dieses Backup wirklich löschen?';
 $wb['delete_pending_txt'] = 'Es liegt bereits ein Backup-Lösch-Job an.';
 $wb['backup_type_mysql'] = 'MySQL-Datenbank';
 $wb['backup_type_web'] = 'Webseiten-Dateien';
-$wb['filesize_txt'] = 'Filesize';
-$wb['backup_pending_txt'] = 'There is already a pending backup job.';
-$wb['error_txt'] = 'Error';
-$wb['backup_info_txt'] = 'A backup process started. This action can take several minutes to complete.';
-$wb['backup_format_txt'] = 'Backup format';
-$wb['backup_format_unknown_txt'] = 'Unknown';
+$wb['filesize_txt'] = 'Dateigröße';
+$wb['backup_pending_txt'] = 'Es ist bereits ein Backup-Job in Auftrag gegeben worden.';
+$wb['error_txt'] = 'Fehler';
+$wb['backup_info_txt'] = 'Ein Backup-Vorgang wurde gestartet. Dieser Vorgang kann einige Minuten in Anspruch nehmen.';
+$wb['backup_format_txt'] = 'Backup-Format';
+$wb['backup_format_unknown_txt'] = 'Unbekannt';
 $wb['backup_job_txt'] = 'Scheduler';
-$wb['backup_job_manual_txt'] = 'Manual';
+$wb['backup_job_manual_txt'] = 'Manuell';
 $wb['backup_job_auto_txt'] = 'Auto';
-$wb['manual_backup_title_txt'] = 'Manual backup';
-$wb['make_backup_web_txt'] = 'Make backup of web files';
-$wb['make_backup_database_txt'] = 'Make backup of databases';
-$wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?';
-$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.';
-$wb['yes_txt'] = 'Yes';
-$wb['no_txt'] = 'No';
-$wb['backup_is_encrypted_txt'] = 'Encrypted';
+$wb['manual_backup_title_txt'] = 'Manuelles Backup';
+$wb['make_backup_web_txt'] = 'Erstelle Backup des Webspace';
+$wb['make_backup_database_txt'] = 'Erstelle Backup der Datenbank';
+$wb['make_backup_confirm_txt'] = 'Sie sind dabei, einen manuellen Backup-Prozess zu starten. Manuelle Sicherungen werden auf die Gesamtzahl der zulässigen Sicherungskopien angerechnet: Wenn das Limit überschritten wird, werden die ältesten Sicherungen automatisch gelöscht. Möchten Sie fortfahren?';
+$wb['final_size_txt'] = 'Die endgültige Downloadgröße kann je nach gewähltem Komprimierungsformat variieren.';
+$wb['yes_txt'] = 'Ja';
+$wb['no_txt'] = 'Nein';
+$wb['backup_is_encrypted_txt'] = 'Verschlüsselt';
 $wb['backup_format_zip_txt'] = 'zip (deflate)';
 $wb['backup_format_gzip_txt'] = 'gzip';
 $wb['backup_format_bzip2_txt'] = 'bzip2';
@@ -51,4 +51,4 @@ $wb['backup_format_tar_7z_lzma2_txt'] = 'tar + 7z (LZMA2)';
 $wb['backup_format_tar_7z_ppmd_txt'] = 'tar + 7z (PPMd)';
 $wb['backup_format_tar_7z_bzip2_txt'] = 'tar + 7z (BZip2)';
 $wb['backup_format_rar_txt'] = 'RAR';
-?>
+
diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng
index e99e1eebcbaf82827f8d19cb9d7c456ccdb35455..2431f951fd3faa8456b8d326d27a70265b2eed2a 100644
--- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng
@@ -14,7 +14,7 @@ $wb['domain_txt'] = 'Domain';
 $wb['type_txt'] = 'Typ';
 $wb['parent_domain_id_txt'] = 'Zugehörige Webseite';
 $wb['web_folder_error_regex'] = 'Ungültige Verzeichnisangabe, bitte keinen / eingeben.';
-$wb['web_folder_error_empty'] = 'Web folder cannot be empty.  Use /web/ to make the same as the Parent Website';
+$wb['web_folder_error_empty'] = 'Der Webordner darf nicht leer sein.  Verwenden Sie /web/, um denselben Ordner wie die übergeordnete Website zu erstellen.';
 $wb['redirect_type_txt'] = 'Weiterleitungstyp';
 $wb['r_redirect_txt'] = 'R (Temporary redirect)';
 $wb['l_redirect_txt'] = 'L (Last redirect rule)';
@@ -105,7 +105,7 @@ $wb['hd_quota_error_regex'] = 'Speicherplatzbeschränkung ist ungültig.';
 $wb['traffic_quota_error_regex'] = 'Transfervolumenbeschränkung ist ungültig.';
 $wb['server_php_id_txt'] = 'PHP Version';
 $wb['server_php_id_invalid_txt'] = 'PHP Version is ungültig.';
-$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.';
+$wb['server_php_id_default_hidden_warning_txt'] = 'Die PHP-Version war auf "Standard oder Default" eingestellt, kann aber nicht mehr ausgewählt werden. Wählen Sie die gewünschte PHP-Version und speichern Sie Ihre Einstellungen.';
 $wb['pm_txt'] = 'PHP-FPM FastCGI Prozess Manager';
 $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout';
 $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests';
@@ -155,20 +155,20 @@ $wb['http_port_txt'] = 'HTTP Port';
 $wb['https_port_txt'] = 'HTTPS Port';
 $wb['http_port_error_regex'] = 'HTTP Port ungültig.';
 $wb['https_port_error_regex'] = 'HTTPS Port ungültig.';
-$wb['enable_pagespeed_txt'] = 'Enable PageSpeed';
-$wb['log_retention_txt'] = 'Log-Dateien Aufbewahrungszeit';
-$wb['log_retention_error_regex'] = 'Aufbewahrungszeit in Tagen (Erlaubte Werte: min. 0 - max. 9999)';
+$wb['enable_pagespeed_txt'] = 'Aktiviere PageSpeed';
+$wb['log_retention_txt'] = 'Aufbewahrungsdauer der Log-Dateien des Webspace';
+$wb['log_retention_error_regex'] = 'Aufbewahrungsdauer in Tagen (Erlaubte Werte: min. 0 - max. 9999)';
 $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota kann nicht 0 sein.';
-$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol';
-$wb['backup_format_web_txt'] = 'Backup format for web files';
-$wb['backup_format_db_txt'] = 'Backup format for database';
-$wb['backup_missing_utils_txt'] = 'The following formats can not be used because they are not installed on the webserver: ';
-$wb['backup_compression_options_txt'] = 'Compression options';
-$wb['backup_encryption_note_txt'] = 'Encryption is only available for 7z, RAR, and zip (not secure).';
-$wb['backup_encryption_options_txt'] = 'Encryption options';
-$wb['backup_enable_encryption_txt'] = 'Enable encryption';
-$wb['backup_password_txt'] = 'Password';
-$wb['backup_format_default_txt'] = 'Default: zip (deflate) or tar (gzip)';
+$wb['proxy_protocol_txt'] = 'Aktiviere PROXY Protocol';
+$wb['backup_format_web_txt'] = 'Backup-Format für Webspace';
+$wb['backup_format_db_txt'] = 'Backup-Format für Datenbank';
+$wb['backup_missing_utils_txt'] = 'Die folgenden Formate können nicht verwendet werden, da sie nicht auf dem Webserver installiert sind: ';
+$wb['backup_compression_options_txt'] = 'Komprimierungsoptionen';
+$wb['backup_encryption_note_txt'] = 'Verschlüsselung ist nur für 7z, RAR und zip verfügbar (nicht sicher).';
+$wb['backup_encryption_options_txt'] = 'Verschlüsselungsoptionen';
+$wb['backup_enable_encryption_txt'] = 'Aktiviere Verschlüsselung';
+$wb['backup_password_txt'] = 'Passwort';
+$wb['backup_format_default_txt'] = 'Standard: zip (deflate) oder tar (gzip)';
 $wb['backup_format_zip_txt'] = 'zip (deflate)';
 $wb['backup_format_gzip_txt'] = 'gzip';
 $wb['backup_format_bzip2_txt'] = 'bzip2';
@@ -186,19 +186,19 @@ $wb['backup_format_tar_7z_lzma_txt'] = 'tar + 7z (LZMA)';
 $wb['backup_format_tar_7z_lzma2_txt'] = 'tar + 7z (LZMA2)';
 $wb['backup_format_tar_7z_ppmd_txt'] = 'tar + 7z (PPMd)';
 $wb['backup_format_tar_7z_bzip2_txt'] = 'tar + 7z (BZip2)';
-$wb['dependent_domains_txt'] = 'Dependent sub- / aliasdomains';
-$wb['error_ipv4_change_forbidden'] = 'The IP cannot be changed. Please contact your administrator if you want to change the IPv4 address.';
-$wb['error_ipv6_change_forbidden'] = 'The IP cannot be changed. Please contact your administrator if you want to change the IPv6 address.';
-$wb['error_domain_change_forbidden'] = 'The domain name cannot be changed. Please contact your administrator if you want to change the domain name.';
-$wb['error_server_change_not_possible'] = 'The server cannot be changed.';
+$wb['dependent_domains_txt'] = 'Abhängige Sub-/Aliasdomänen';
+$wb['error_ipv4_change_forbidden'] = 'Die IP kann nicht geändert werden. Bitte wenden Sie sich an Ihren Administrator, wenn Sie die IPv4-Adresse ändern möchten.';
+$wb['error_ipv6_change_forbidden'] = 'Die IP kann nicht geändert werden. Bitte wenden Sie sich an Ihren Administrator, wenn Sie die IPv6-Adresse ändern möchten.';
+$wb['error_domain_change_forbidden'] = 'Der Domänenname kann nicht geändert werden. Wenden Sie sich bitte an Ihren Administrator, wenn Sie den Domänennamen ändern möchten.';
+$wb['error_server_change_not_possible'] = 'Der Server kann nicht geändert werden.';
 $wb['jailkit_chroot_app_sections_txt'] = 'Jailkit Chroot Anwendungsbereiche';
 $wb['jailkit_chroot_app_programs_txt'] = 'Jailkit Chrooted Anwendungen';
 $wb['jailkit_chroot_app_sections_error_empty'] = 'Jailkit Chroot Anwendungsbereiche ist leer.';
 $wb['jailkit_chroot_app_programs_error_empty'] = 'Jailkit Chrooted Anwendungen ist leer.';
-$wb['jailkit_chroot_app_sections_error_regex'] = 'Invalid jaikit chroot sections.';
-$wb['jailkit_chroot_app_programs_error_regex'] = 'Invalid jaikit chroot app programs.';
-$wb['tooltip_jailkit_chroot_app_sections_txt'] = 'When empty, uses Jailkit chroot app sections from Server Config';
-$wb['tooltip_jailkit_chroot_app_programs_txt'] = 'When empty, uses Jailkit chroot applications from Server Config';
-$wb['delete_unused_jailkit_txt'] = 'Delete unused jailkit chroot';
-$wb['tooltip_delete_unused_jailkit_txt'] = 'Delete the jailkit chroot environment when there are no shell users or cron jobs which require it.';
-$wb['ssl_options_not_for_le_txt'] = 'You have Let\'s Encrypt certificates enabled for this website. Please be aware that all options on this page apply to non-Let\'s Encrypt certificates only. Remember to uncheck Let\'s Encrypt on the main tab if you want to switch to a different certificate.';
+$wb['jailkit_chroot_app_sections_error_regex'] = 'Ungültige Jaikit Chroot Anwendungsbereiche.';
+$wb['jailkit_chroot_app_programs_error_regex'] = 'Ungültige Jaikit Chroot Anwendungen.';
+$wb['tooltip_jailkit_chroot_app_sections_txt'] = 'Wenn leer, verwende Jailkit Chroot Anwendungsbereiche aus der Serverkonfiguration';
+$wb['tooltip_jailkit_chroot_app_programs_txt'] = 'Wenn leer, verwende Jailkit Chroot Anwendungen aus der Serverkonfiguration';
+$wb['delete_unused_jailkit_txt'] = 'Lösche unbenutzten Jailkit Chroot';
+$wb['tooltip_delete_unused_jailkit_txt'] = 'Lösche die Jailkit-Chroot-Umgebung, wenn es keine Shell-Benutzer oder Cronjobs gibt, die sie benötigen.';
+$wb['ssl_options_not_for_le_txt'] = 'Sie haben Let\'s Encrypt-Zertifikate für diese Website aktiviert. Bitte beachten Sie, dass alle Optionen auf dieser Seite nur für Nicht-Let\'s Encrypt-Zertifikate gelten. Denken Sie daran, Let\'s Encrypt auf der Hauptregisterkarte zu deaktivieren, wenn Sie zu einem anderen Zertifikat wechseln möchten.';
diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm
index d8c7d119395b39081e383fe9374608ff95d584e9..c4421aac74b282d0934a234ad13df5bc5a1b1804 100644
--- a/interface/web/sites/templates/web_vhost_domain_edit.htm
+++ b/interface/web/sites/templates/web_vhost_domain_edit.htm
@@ -66,6 +66,9 @@
                     </div>
                 </tmpl_unless>
             </tmpl_if>
+            <tmpl_if name="domain_option">
+                <input type="hidden" id="client_group_id" name="client_group_id" value="{tmpl_var name='client_group_id_value'}" />
+            </tmpl_if>
             <div class="form-group">
                 <label for="ip_address" class="col-sm-3 control-label">{tmpl_var name='ip_address_txt'}</label>
                 <div class="col-sm-9"><select name="ip_address" id="ip_address" class="form-control">
diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php
index 9b1117fb2b5ee67f1a39d150d8c998ed525fffc3..365582e9af521000402bda028a0a8199cebcc276 100644
--- a/interface/web/sites/web_vhost_domain_edit.php
+++ b/interface/web/sites/web_vhost_domain_edit.php
@@ -725,6 +725,12 @@ class page_action extends tform_actions {
 			// remove the parent domain part of the domain name before we show it in the text field.
 			if($this->dataRecord["type"] == 'vhostsubdomain') $this->dataRecord["domain"] = str_replace('.'.$selected_domain, '', $this->dataRecord["domain"]);
 
+			// We have to set the client group id value as the client select field is hidden in this mode
+			if($is_admin) {
+				$app->tpl->setVar("client_group_id_value", $this->dataRecord["sys_groupid"], true);
+			} else {
+				$app->tpl->setVar("client_group_id_value", $_SESSION["s"]["user"]["default_group"], true);
+			}
 
 		} else {
 			// remove the parent domain part of the domain name before we show it in the text field.
diff --git a/remoting_client/API-docs/dns_a_add.html b/remoting_client/API-docs/dns_a_add.html
index e7217bcdcfd4972e7c10213b07a0da9ea340de9f..9996bc0d622a4eb480f28c1cf93f351d2e0609c6 100644
--- a/remoting_client/API-docs/dns_a_add.html
+++ b/remoting_client/API-docs/dns_a_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_a_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_a_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns IPv4 record if <em>type</em> is <em>a</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_a_delete.html b/remoting_client/API-docs/dns_a_delete.html
index 8b30fdd6725aad9b22172ef72f8f6e6605ef4009..29e6d1c0f1f3982150ea5339fefcdd3133415496 100644
--- a/remoting_client/API-docs/dns_a_delete.html
+++ b/remoting_client/API-docs/dns_a_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_a_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_a_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns IPv4 resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_a_update.html b/remoting_client/API-docs/dns_a_update.html
index ccacab408bd3b3171dfb01e33c21137e95ac7a3b..6fbd8888f3f07bbd18b9d6d2e5bc5b5e6628f528 100644
--- a/remoting_client/API-docs/dns_a_update.html
+++ b/remoting_client/API-docs/dns_a_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_a_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_a_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates an IPv4 record if <em>type</em> is <em>a</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_aaaa_add.html b/remoting_client/API-docs/dns_aaaa_add.html
index ea21b15361cd0fdbe02b547b2e1f2ceb58e69542..2fe003038306e04ab8aa70390066fc0b2736bea0 100644
--- a/remoting_client/API-docs/dns_aaaa_add.html
+++ b/remoting_client/API-docs/dns_aaaa_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_aaaa_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_aaaa_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns IPv6 resource record if <em>type</em> is <em>aaaa</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_aaaa_delete.html b/remoting_client/API-docs/dns_aaaa_delete.html
index 4a52e4da7fa7c1c66cd456e994a929b99ea080bc..21038c0d50dc6ddd952eb7135dfbac5aa960983c 100644
--- a/remoting_client/API-docs/dns_aaaa_delete.html
+++ b/remoting_client/API-docs/dns_aaaa_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_aaaa_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_aaaa_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns IPv6 resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_aaaa_update.html b/remoting_client/API-docs/dns_aaaa_update.html
index 94b60f4df4601530b4d0ac3bd63e441ea9da8def..da1f85cd12e96698ee7923f2f396e010f8a10e8c 100644
--- a/remoting_client/API-docs/dns_aaaa_update.html
+++ b/remoting_client/API-docs/dns_aaaa_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_aaaa_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_aaaa_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns IPv6 resource record if <em>type</em> is <em>aaaa</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_alias_add.html b/remoting_client/API-docs/dns_alias_add.html
index 4bea3dea6f2a2b2700cdfc01afad04aff5e657cb..178327b70b3d93f421e8a56c3ebfdf2e3295f994 100644
--- a/remoting_client/API-docs/dns_alias_add.html
+++ b/remoting_client/API-docs/dns_alias_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_alias_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_alias_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns server side alias record if <em>type</em> is <em>alias</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_alias_delete.html b/remoting_client/API-docs/dns_alias_delete.html
index 03baf684cbb17031a98c6ad62f9cce2622df4945..b610863922b6e0055e6416de3e44541fee8ccb7b 100644
--- a/remoting_client/API-docs/dns_alias_delete.html
+++ b/remoting_client/API-docs/dns_alias_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_alias_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_alias_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns alias resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_alias_update.html b/remoting_client/API-docs/dns_alias_update.html
index 058654f2f7817bde1a885be060b5a5a6e0e06987..b935521cb11a0d6a50317ca01d309d96bda01f39 100644
--- a/remoting_client/API-docs/dns_alias_update.html
+++ b/remoting_client/API-docs/dns_alias_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_alias_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_alias_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns server side alias record if <em>type</em> is <em>alias</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_cname_add.html b/remoting_client/API-docs/dns_cname_add.html
index afef2bd75c3d5aa409c127bb4a71a30adbd67945..2d8b244e6df7fccc4e3b4b54d023a2f29c6b803a 100644
--- a/remoting_client/API-docs/dns_cname_add.html
+++ b/remoting_client/API-docs/dns_cname_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_cname_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_cname_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns canonical alias name record if <em>type</em> is <em>cname</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_cname_delete.html b/remoting_client/API-docs/dns_cname_delete.html
index c4304a56c3dded194baeaa891e4b53c6c60b5e85..64bc826b4721d096980cac417152faf7cd5291ec 100644
--- a/remoting_client/API-docs/dns_cname_delete.html
+++ b/remoting_client/API-docs/dns_cname_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_cname_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_cname_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns cname resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_cname_update.html b/remoting_client/API-docs/dns_cname_update.html
index f0666331045cc09c0115d7510a3bce1e056b5d0c..626201f5bd1fa1916a0a82f656cae22f74545896 100644
--- a/remoting_client/API-docs/dns_cname_update.html
+++ b/remoting_client/API-docs/dns_cname_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_cname_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_cname_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns canonical alias name record if <em>type</em> is <em>cname</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_hinfo_add.html b/remoting_client/API-docs/dns_hinfo_add.html
index acd89b3d34f857cb8b9e6e6c2d1a16a57edec412..d89e75e8ebe2ce63ea04f07761085d2264c04009 100644
--- a/remoting_client/API-docs/dns_hinfo_add.html
+++ b/remoting_client/API-docs/dns_hinfo_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_hinfo_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_hinfo_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns host information record if <em>type</em> is <em>hinfo</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_hinfo_delete.html b/remoting_client/API-docs/dns_hinfo_delete.html
index 37f796ffafa45dd2fa403622b69399b78a9fdc7c..6cb87780af129bc7d43ee618c231a7c0f5cbe06d 100644
--- a/remoting_client/API-docs/dns_hinfo_delete.html
+++ b/remoting_client/API-docs/dns_hinfo_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_hinfo_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_hinfo_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns hinfo resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_hinfo_update.html b/remoting_client/API-docs/dns_hinfo_update.html
index 463b25b84a71b26d4bdab6feff2ec2ea802448e4..81802e99e943a4306349c45b2560393446b6cd66 100644
--- a/remoting_client/API-docs/dns_hinfo_update.html
+++ b/remoting_client/API-docs/dns_hinfo_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_hinfo_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_hinfo_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns host information record if <em>type</em> is <em>hinfo</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_mx_delete.html b/remoting_client/API-docs/dns_mx_delete.html
index 8bd8572b4eb3af272cad733d03f8ee44f4bd41e2..01a4ae11c0d8702c60795137f54d3d074fd11886 100644
--- a/remoting_client/API-docs/dns_mx_delete.html
+++ b/remoting_client/API-docs/dns_mx_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_mx_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_mx_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns mx resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_mx_update.html b/remoting_client/API-docs/dns_mx_update.html
index d75a8343d3a42f79b8fb204e4af569d0f5775abb..e74a6d99865c50736d8354102e9059047c0a359a 100644
--- a/remoting_client/API-docs/dns_mx_update.html
+++ b/remoting_client/API-docs/dns_mx_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_mx_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_mx_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns mail exchanger record if <em>type</em> is <em>mx</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_naptr_add.html b/remoting_client/API-docs/dns_naptr_add.html
index a8b5d966bf9306d8ded5cedc17d2161ef0c212ca..b9bc9e4d0cbdb32a69b4ec4643834716e9dc5971 100644
--- a/remoting_client/API-docs/dns_naptr_add.html
+++ b/remoting_client/API-docs/dns_naptr_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_naptr_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_naptr_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns server location record if <em>type</em> is <em>naptr</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_naptr_delete.html b/remoting_client/API-docs/dns_naptr_delete.html
index 376bd18aa28592619b7664144c2b79d965dae80c..5b06d1c145a3eff283adbb14121e4d40d8cf386e 100644
--- a/remoting_client/API-docs/dns_naptr_delete.html
+++ b/remoting_client/API-docs/dns_naptr_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_naptr_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_naptr_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns naptr resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_naptr_update.html b/remoting_client/API-docs/dns_naptr_update.html
index 98c4f031833c66b720f1173cf983e48e9c712478..9abfcaab97dee1ce2a8d02be1926fc15231fe555 100644
--- a/remoting_client/API-docs/dns_naptr_update.html
+++ b/remoting_client/API-docs/dns_naptr_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_naptr_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_naptr_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns server location record if <em>type</em> is <em>naptr</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_ns_add.html b/remoting_client/API-docs/dns_ns_add.html
index 8fd9564bbb4d2907b8e6939166a4c7d5f793598b..a3d7b4042d44e6565e8646ddb16b59854e7b1fbf 100644
--- a/remoting_client/API-docs/dns_ns_add.html
+++ b/remoting_client/API-docs/dns_ns_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_ns_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_ns_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns authoritative nameserver record if <em>type</em> is <em>ns</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_ns_delete.html b/remoting_client/API-docs/dns_ns_delete.html
index 0ee3eba72d6181c552832a54e1e9af3565fe8ea5..c59ba0933afe279bd077012084962d2298d1b757 100644
--- a/remoting_client/API-docs/dns_ns_delete.html
+++ b/remoting_client/API-docs/dns_ns_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_ns_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_ns_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns ns resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_ns_update.html b/remoting_client/API-docs/dns_ns_update.html
index 32258a1504b7959c9a3b3c75e7975e43b77ac23f..e2aa90805c2a7adabd912680d851fb9918fe4555 100644
--- a/remoting_client/API-docs/dns_ns_update.html
+++ b/remoting_client/API-docs/dns_ns_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_ns_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_ns_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates an authoritative nameserver record if <em>type</em> is <em>ns</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_ptr_add.html b/remoting_client/API-docs/dns_ptr_add.html
index d2331660d2e36713151a883cd5a119e1101dfc5e..7b65759df941e36e5076b76eb8281c381d8190e8 100644
--- a/remoting_client/API-docs/dns_ptr_add.html
+++ b/remoting_client/API-docs/dns_ptr_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_ptr_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_ptr_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns domain name pointer record if <em>type</em> is <em>ptr</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_ptr_delete.html b/remoting_client/API-docs/dns_ptr_delete.html
index d455bab5f9232840f731dc323e15b6868b4b6a77..50092c0b6c1ec5f1b77463988074271a61f7696a 100644
--- a/remoting_client/API-docs/dns_ptr_delete.html
+++ b/remoting_client/API-docs/dns_ptr_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_ptr_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_ptr_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns ptr resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_ptr_update.html b/remoting_client/API-docs/dns_ptr_update.html
index 25097708ae2a929ff927c75e849821caac60127e..e25cedf8536fa93fa4bc9893f637398e1799ee56 100644
--- a/remoting_client/API-docs/dns_ptr_update.html
+++ b/remoting_client/API-docs/dns_ptr_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_ptr_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_ptr_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns domain name pointer record if <em>type</em> is <em>ptr</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_rp_add.html b/remoting_client/API-docs/dns_rp_add.html
index e20f5186c3c2efe925f56d6852176bb293f547af..327299f11d361cace8c17a96a03ac6e8b8d4755f 100644
--- a/remoting_client/API-docs/dns_rp_add.html
+++ b/remoting_client/API-docs/dns_rp_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_rp_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_rp_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns responsible person record if <em>type</em> is <em>rp</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_rp_delete.html b/remoting_client/API-docs/dns_rp_delete.html
index 0a656c62cc3fa2f6374a1d477c248d82d1ae56c0..5d7540fe4843d791c1cba0601bfc8eb629b2b261 100644
--- a/remoting_client/API-docs/dns_rp_delete.html
+++ b/remoting_client/API-docs/dns_rp_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_rp_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_rp_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns rp resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_rp_update.html b/remoting_client/API-docs/dns_rp_update.html
index 1e7a92db1f305293cddffe069220f04bbbc1a188..926ef72fe0ef409166fb353ea7ed7c49bb8bef9f 100644
--- a/remoting_client/API-docs/dns_rp_update.html
+++ b/remoting_client/API-docs/dns_rp_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_rp_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_rp_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns responsible person record if <em>type</em> is <em>rp</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_slave_delete.html b/remoting_client/API-docs/dns_slave_delete.html
index baaca8408e495c30d28c6305f9fe5c0b6392311e..de5023c1017aa9c6f7861f83f84571c8e94c140b 100644
--- a/remoting_client/API-docs/dns_slave_delete.html
+++ b/remoting_client/API-docs/dns_slave_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_slave_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_slave_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes a dns slave zone.</p><br>
diff --git a/remoting_client/API-docs/dns_srv_add.html b/remoting_client/API-docs/dns_srv_add.html
index 5a2649cadbfb76f7610a8ac9b937c0904072dd3d..ca0d4e8b486eb7898337369ea1d0d091d77cf204 100644
--- a/remoting_client/API-docs/dns_srv_add.html
+++ b/remoting_client/API-docs/dns_srv_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_srv_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_srv_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns server location record if <em>type</em> is <em>srv</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_srv_delete.html b/remoting_client/API-docs/dns_srv_delete.html
index 420d9f746ae3708688e38746c5cc37be968b2ce7..ba69422f640ca225511f6637250ad38eb525c2e5 100644
--- a/remoting_client/API-docs/dns_srv_delete.html
+++ b/remoting_client/API-docs/dns_srv_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_srv_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_srv_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns srv resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_srv_update.html b/remoting_client/API-docs/dns_srv_update.html
index 8a2a6107bfa1073034a5633791f0eb1542f7831f..264eb3c4cdb6d6e1e8e97f4643946e241271f9b6 100644
--- a/remoting_client/API-docs/dns_srv_update.html
+++ b/remoting_client/API-docs/dns_srv_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_srv_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_srv_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns server location record if <em>type</em> is <em>srv</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_txt_add.html b/remoting_client/API-docs/dns_txt_add.html
index d99f79084659482ccbacbcca9d359dc395677324..da6b71af0fd3d2de12e09ac8f516151a93bc9923 100644
--- a/remoting_client/API-docs/dns_txt_add.html
+++ b/remoting_client/API-docs/dns_txt_add.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_txt_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_txt_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Adds a dns text string record if <em>type</em> is <em>txt</em>.</p><br>
diff --git a/remoting_client/API-docs/dns_txt_delete.html b/remoting_client/API-docs/dns_txt_delete.html
index fb809aadd212b17f041d4bb6457da82345187e1a..45562a0c62b4ff904a82ac099dfe993db4159f5b 100644
--- a/remoting_client/API-docs/dns_txt_delete.html
+++ b/remoting_client/API-docs/dns_txt_delete.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_txt_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<h1>dns_txt_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <p class="headgrp">Description: </p>
 <p class="margin"> Deletes target dns txt resource record.</p><br>
diff --git a/remoting_client/API-docs/dns_txt_update.html b/remoting_client/API-docs/dns_txt_update.html
index 374bede8fb0bf4f203ff5030a9be233448b63dac..b93138bc5a8841761b0df0296deacedc268cedd5 100644
--- a/remoting_client/API-docs/dns_txt_update.html
+++ b/remoting_client/API-docs/dns_txt_update.html
@@ -12,7 +12,7 @@
 
 <body>
 <div style="padding:40px">
-<h1>dns_txt_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<h1>dns_txt_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>, <span class="var">$update_serial=false</span>);</h1>
 <br>
 <b>Description: </b>
 <p class="margin"> Updates a dns text string record if <em>type</em> is <em>txt</em>.</p><br>
diff --git a/remoting_client/API-docs/mail_relay_domain_add.html b/remoting_client/API-docs/mail_relay_domain_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..cb2beb5ec6359f1fe8c7af8405e4ea84f6feda1a
--- /dev/null
+++ b/remoting_client/API-docs/mail_relay_domain_add.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><title>ISPCOnfig 3 remote API documentation</title>
+
+
+
+
+
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+  <link rel="stylesheet" type="text/css" href="definitionen.css">
+  <style type="text/css">
+  </style></head>
+
+<body>
+<div style="padding:40px">
+<h1>mail_relay_domain_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1>
+<br>
+<p class="headgrp">Description: </p>
+<p class="margin"> Adds a new relay domain.</p><br>
+<p class="headgrp">Input Variables: </p>
+<p class="margin"> <span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span></p>
+<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
+<p class="margin"> server_id&nbsp;&nbsp;(<span class="paratype">int(11)</span>)</p>
+<p class="margin"> source&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
+<p class="margin"> active&nbsp;&nbsp;(<span class="paratype">enum('n','y')</span>)</p>
+<p class="margin"> access&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
+<p class="headgrp">Output: </p>
+<p class="margin"> Returns the ID of the newly added record</p>
+<!--<b>Output:</b>
+<p style="margin-left:100px">Gives a record of </p> -->
+</div>
+
+</body></html>
diff --git a/remoting_client/API-docs/mail_relay_domain_delete.html b/remoting_client/API-docs/mail_relay_domain_delete.html
new file mode 100644
index 0000000000000000000000000000000000000000..c2af410d904c03ed7977c2743d58e7319c1df612
--- /dev/null
+++ b/remoting_client/API-docs/mail_relay_domain_delete.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><title>ISPCOnfig 3 remote API documentation</title>
+
+
+
+
+
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+  <link rel="stylesheet" type="text/css" href="definitionen.css">
+  <style type="text/css">
+  </style></head>
+
+<body>
+<div style="padding:40px">
+<h1>mail_domain_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<br>
+<p class="headgrp">Description: </p>
+<p class="margin"> Deletes a mail domain.</p><br>
+<p class="headgrp">Input Variables: </p>
+<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p>
+<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
+<p class="margin">None</p>
+<p class="headgrp">Output: </p>
+<p class="margin"> Returns the number of deleted records.</p>
+<!--<b>Output:</b>
+<p style="margin-left:100px">Gives a record of </p> -->
+</div>
+
+</body></html>
diff --git a/remoting_client/API-docs/mail_relay_domain_get.html b/remoting_client/API-docs/mail_relay_domain_get.html
new file mode 100644
index 0000000000000000000000000000000000000000..e9e03d80d6b9e4683bae9dfd7d5ed59f5f2f0f34
--- /dev/null
+++ b/remoting_client/API-docs/mail_relay_domain_get.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><title>ISPCOnfig 3 remote API documentation</title>
+
+  
+
+  
+  
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+  <link rel="stylesheet" type="text/css" href="definitionen.css">
+  <style type="text/css">
+  </style></head>
+
+<body>
+<div style="padding:40px">
+<h1>mail_relay_domain_get(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1>
+<br>
+<p class="headgrp">Description: </p>
+<p class="margin"> Retrieves information about a relay domain.</p><br>
+<p class="headgrp">Input Variables: </p>
+<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p>
+<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
+<p class="margin"> None</p>
+<p class="headgrp">Output: </p>
+<p class="margin"> Returns all fields and values of the chosen relay domain.</p>
+<!--<b>Output:</b> 
+<p style="margin-left:100px">Gives a record of </p> -->
+</div>
+
+</body></html>
diff --git a/remoting_client/API-docs/mail_relay_domain_update.html b/remoting_client/API-docs/mail_relay_domain_update.html
new file mode 100644
index 0000000000000000000000000000000000000000..d755f5781dbb43cfa31f4b963fba3b4e045b2e1a
--- /dev/null
+++ b/remoting_client/API-docs/mail_relay_domain_update.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><title>ISPCOnfig 3 remote API documentation</title>
+
+  
+
+  
+  
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+  <link rel="stylesheet" type="text/css" href="definitionen.css">
+  <style type="text/css">
+  </style></head>
+
+<body>
+<div style="padding:40px">
+<h1>mail_relay_domain_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1>
+<br>
+<b>Description: </b>
+<p class="margin"> Updates a relay domain.</p><br>
+<b>Input Variables: </b>
+<p class="margin"> <span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span></p>
+<b>Parameters (in <span class="var">$params</span>): </b>
+<p class="margin"> server_id&nbsp;&nbsp;(<span class="paratype">int(11)</span>)</p>
+<p class="margin"> source&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
+<p class="margin"> active&nbsp;&nbsp;(<span class="paratype">enum('n','y')</span>)</p>
+<p class="margin"> access&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
+<b>Output: </b> 
+<p class="margin"> Returns the number of affected rows.</p>
+<!--<b>Output:</b> 
+<p style="margin-left:100px">Gives a record of </p> -->
+</div>
+
+</body></html>
diff --git a/remoting_client/examples/mail_relay_domain_add.php b/remoting_client/examples/mail_relay_domain_add.php
new file mode 100644
index 0000000000000000000000000000000000000000..06f82b0e007fb8a601a9c8e30e85c1150a1b1c62
--- /dev/null
+++ b/remoting_client/examples/mail_relay_domain_add.php
@@ -0,0 +1,40 @@
+<?php
+
+require 'soap_config.php';
+
+
+$client = new SoapClient(null, array('location' => $soap_location,
+		'uri'      => $soap_uri,
+		'trace' => 1,
+		'exceptions' => 1));
+
+
+try {
+	if($session_id = $client->login($username, $password)) {
+		echo 'Logged successfull. Session ID:'.$session_id.'<br />';
+	}
+
+	//* Set the function parameters.
+	$client_id = 1;
+	$params = array(
+		'server_id' => 1,
+		'domain' => 'test.tld',
+		'active' => 'y',
+        'access' => 'OK'
+	);
+
+	$relay_domain_id = $client->mail_relay_domain_add($session_id, $client_id, $params);
+
+	echo "Relay domain ID: ".$relay_domain_id."<br>";
+
+	if($client->logout($session_id)) {
+		echo 'Logged out.<br />';
+	}
+
+
+} catch (SoapFault $e) {
+	echo $client->__getLastResponse();
+	die('SOAP Error: '.$e->getMessage());
+}
+
+?>
diff --git a/remoting_client/examples/mail_relay_domain_delete.php b/remoting_client/examples/mail_relay_domain_delete.php
new file mode 100644
index 0000000000000000000000000000000000000000..60dd49c4afcc7a7b77efd0c74079c91a8a1cee69
--- /dev/null
+++ b/remoting_client/examples/mail_relay_domain_delete.php
@@ -0,0 +1,34 @@
+<?php
+
+require 'soap_config.php';
+
+
+$client = new SoapClient(null, array('location' => $soap_location,
+		'uri'      => $soap_uri,
+		'trace' => 1,
+		'exceptions' => 1));
+
+
+try {
+	if($session_id = $client->login($username, $password)) {
+		echo 'Logged successfull. Session ID:'.$session_id.'<br />';
+	}
+
+	//* Set the function parameters.
+	$mail_relay_domain_id = 3;
+
+	$affected_rows = $client->mail_relay_domain_delete($session_id, $mail_relay_domain_id);
+
+	echo "Number of records that have been deleted: ".$affected_rows."<br>";
+
+	if($client->logout($session_id)) {
+		echo 'Logged out.<br />';
+	}
+
+
+} catch (SoapFault $e) {
+	echo $client->__getLastResponse();
+	die('SOAP Error: '.$e->getMessage());
+}
+
+?>
diff --git a/remoting_client/examples/mail_relay_domain_get.php b/remoting_client/examples/mail_relay_domain_get.php
new file mode 100644
index 0000000000000000000000000000000000000000..509a1993ed593ff502b41b9ae6cbb32e3eda6d82
--- /dev/null
+++ b/remoting_client/examples/mail_relay_domain_get.php
@@ -0,0 +1,34 @@
+<?php
+
+require 'soap_config.php';
+
+
+$client = new SoapClient(null, array('location' => $soap_location,
+		'uri'      => $soap_uri,
+		'trace' => 1,
+		'exceptions' => 1));
+
+
+try {
+	if($session_id = $client->login($username, $password)) {
+		echo 'Logged successfull. Session ID:'.$session_id.'<br />';
+	}
+
+	//* Set the function parameters.
+	$relay_domain_id = 1;
+
+	// Lookup by primary key, gets back a single record.
+	$relay_domain = $client->mail_relay_domain_get($session_id, $relay_domain_id);
+    print_r($relay_domain);
+
+	if($client->logout($session_id)) {
+		echo 'Logged out.<br />';
+	}
+
+
+} catch (SoapFault $e) {
+	echo $client->__getLastResponse();
+	die('SOAP Error: '.$e->getMessage());
+}
+
+?>
diff --git a/remoting_client/examples/mail_relay_domain_update.php b/remoting_client/examples/mail_relay_domain_update.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c42946474e2e580426b4039f15acd05409366d4
--- /dev/null
+++ b/remoting_client/examples/mail_relay_domain_update.php
@@ -0,0 +1,41 @@
+<?php
+
+require 'soap_config.php';
+
+
+$client = new SoapClient(null, array('location' => $soap_location,
+		'uri'      => $soap_uri,
+		'trace' => 1,
+		'exceptions' => 1));
+
+
+try {
+	if($session_id = $client->login($username, $password)) {
+		echo 'Logged successfull. Session ID:'.$session_id.'<br />';
+	}
+
+	//* Set the function parameters.
+    $client_id = 1;
+    $primary_id = 1;
+	$params = array(
+		'server_id' => 1,
+		'domain' => 'test.tld',
+		'active' => 'y',
+        'access' => 'OK'
+	);
+
+	$affected_rows = $client->mail_relay_domain_update($session_id, $client_id, $primary_id, $params);
+
+	echo "Affected Rows: ".$affected_rows."<br>";
+
+	if($client->logout($session_id)) {
+		echo 'Logged out.<br />';
+	}
+
+
+} catch (SoapFault $e) {
+	echo $client->__getLastResponse();
+	die('SOAP Error: '.$e->getMessage());
+}
+
+?>
diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master
index 8d6df71b7da0cf2c07e7e57cce50c77d04787b2e..6957ed5eb8062dc8f65021710ebb637c5e22dc7d 100644
--- a/server/conf/apache_apps.vhost.master
+++ b/server/conf/apache_apps.vhost.master
@@ -9,10 +9,12 @@
 <VirtualHost {tmpl_var name='apps_vhost_ip'}:{tmpl_var name='apps_vhost_port'}>
   ServerAdmin webmaster@localhost
   {tmpl_var name='apps_vhost_servername'}
-
-  <FilesMatch "\.ph(p3?|tml)$">
-    SetHandler None
-  </FilesMatch>
+  
+  <Directory {tmpl_var name='apps_vhost_dir'}>
+    <FilesMatch "\.ph(p3?|tml)$">
+      SetHandler None
+    </FilesMatch>
+  </Directory>
 
   # SSL Configuration
   <tmpl_var name="ssl_comment">SSLEngine On
@@ -96,7 +98,7 @@
     DocumentRoot {tmpl_var name='apps_vhost_dir'}
     SuexecUserGroup ispapps ispapps
     <Directory {tmpl_var name='apps_vhost_dir'}>
-		Options +Indexes +FollowSymLinks +MultiViews +ExecCGI
+		Options -Indexes +FollowSymLinks +MultiViews +ExecCGI
 		AllowOverride AuthConfig Indexes Limit Options FileInfo
 	    <FilesMatch "\.php$">
 		  SetHandler fcgid-script
@@ -109,6 +111,8 @@
 		Allow from all
 		</tmpl_if>
     </Directory>
+    IPCCommTimeout  7200
+    MaxRequestLen 15728640 
   </IfModule>
 
 {tmpl_if name="use_rspamd"}
diff --git a/server/conf/apps_php_fpm_pool.conf.master b/server/conf/apps_php_fpm_pool.conf.master
index 74597272c0e998f5b1d7412188b9e71e18ed9ee0..e0db30dad69d0efe4052cc13014ccaf858632a08 100644
--- a/server/conf/apps_php_fpm_pool.conf.master
+++ b/server/conf/apps_php_fpm_pool.conf.master
@@ -17,4 +17,7 @@ pm.max_spare_servers = 5
 chdir = /
 
 ; php_admin_value[open_basedir] = /var/www/apps:/srv/www/apps:/usr/share
-php_admin_flag[magic_quotes_gpc] = off
\ No newline at end of file
+php_admin_flag[magic_quotes_gpc] = off
+
+php_admin_value[post_max_size] = 100M
+php_admin_value[upload_max_filesize] = 100M
diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master
index fd216d3d6401bf2e81f35b7239041daabbfd6054..5635b946aa8c2e3fed747f4543011ecc979c7415 100644
--- a/server/conf/sieve_filter.master
+++ b/server/conf/sieve_filter.master
@@ -3,7 +3,7 @@
 # You can create and activate a per-user sieve script (manually or via managesieve),
 # which will execute after this.
 
-require ["fileinto", "mailbox", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"];
+require ["body", "copy", "date", "envelope", "fileinto", "imap4flags", "mailbox", "regex", "reject", "relational", "subaddress", "vacation", "variables"];
 
 <tmpl_if name="move_junk" op="==" value="y">
 # Move spam to spam folder
@@ -29,7 +29,7 @@ redirect :copy "<tmpl_var name='address'>";
 # You can create and activate a per-user sieve script (manually or via managesieve),
 # which will execute before this.
 
-require ["fileinto", "mailbox", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"];
+require ["body", "copy", "date", "envelope", "fileinto", "imap4flags", "mailbox", "regex", "reject", "relational", "subaddress", "vacation", "variables"];
 
 <tmpl_if name="move_junk" op="==" value="a">
 # Move spam to spam folder
diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master
index a1873eab84033afbc75776924ac7414962aeef6a..f687bee839ba003cdbcaa195bd1cadbb0590a356 100644
--- a/server/conf/vhost.conf.master
+++ b/server/conf/vhost.conf.master
@@ -408,6 +408,13 @@
 </tmpl_if>
 <tmpl_if name='use_tcp'>
 			#ProxyPassMatch ^/(.*\.php[345]?(/.*)?)$ fcgi://127.0.0.1:<tmpl_var name='fpm_port'><tmpl_var name='web_document_root'>/$1
+			<Directory {tmpl_var name='web_document_root_www'}>
+				<FilesMatch "\.php[345]?$">
+					<If "-f '%{REQUEST_FILENAME}'">
+						SetHandler "proxy:fcgi://127.0.0.1:<tmpl_var name='fpm_port'>"
+					</If>
+				</FilesMatch>
+			</Directory>
 			<Directory {tmpl_var name='web_document_root'}>
 				<FilesMatch "\.php[345]?$">
 					<If "-f '%{REQUEST_FILENAME}'">
@@ -418,6 +425,13 @@
 </tmpl_if>
 <tmpl_if name='use_socket'>
 			#ProxyPassMatch ^/(.*\.php[345]?(/.*)?)$ unix://<tmpl_var name='fpm_socket'>|fcgi://localhost/<tmpl_var name='web_document_root'>/$1
+			<Directory {tmpl_var name='web_document_root_www'}>
+				<FilesMatch "\.php[345]?$">
+					<If "-f '%{REQUEST_FILENAME}'">
+						SetHandler "proxy:unix:<tmpl_var name='fpm_socket'>|fcgi://localhost"
+					</If>
+				</FilesMatch>
+			</Directory>
 			<Directory {tmpl_var name='web_document_root'}>
 				<FilesMatch "\.php[345]?$">
 					<If "-f '%{REQUEST_FILENAME}'">
diff --git a/server/cron.sh b/server/cron.sh
index 05fa10ef0d5c96a8d50d88b9e0cf0c1ca665084e..ddbf8c7618a6c95eb65aca475a52710b5c35a961 100644
--- a/server/cron.sh
+++ b/server/cron.sh
@@ -2,6 +2,8 @@
 
 PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
 
+. /etc/profile
+
 if [ -f /usr/local/ispconfig/server/lib/php.ini ]; then
         PHPINIOWNER=`stat -c %U /usr/local/ispconfig/server/lib/php.ini`
         if [ $PHPINIOWNER == 'root' ] || [ $PHPINIOWNER == 'ispconfig'  ]; then
diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php
index ffd20e9fb6129df681a0c5ae158b2d3929557f6a..b6adb3a1027c40e0a18a47bf496f3def0835ffa0 100644
--- a/server/lib/app.inc.php
+++ b/server/lib/app.inc.php
@@ -36,6 +36,11 @@ if(isset($conf['timezone']) && $conf['timezone'] != '') {	// note: !empty($conf[
 	date_default_timezone_set($conf['timezone']);
 }
 
+//* Set error reporting level when we are not on a developer system
+if(DEVSYSTEM !== true) {
+	@ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_WARNING);
+}
+
 /**
  * Class for defining (mostly static) methods that are commonly used across the whole application.
  *
diff --git a/server/lib/classes/aps_installer.inc.php b/server/lib/classes/aps_installer.inc.php
index 922f32e61288664e8b8dd464e4f3d3f2e8cb9d99..e50c601cecd7d6988c67a5d1667ccc48f4eb257b 100644
--- a/server/lib/classes/aps_installer.inc.php
+++ b/server/lib/classes/aps_installer.inc.php
@@ -384,7 +384,7 @@ class ApsInstaller extends ApsBase
 					if(is_dir($this->document_root)){
 						$files = array_diff(scandir($this->document_root), array('.', '..', 'error', 'stats'));
 						foreach($files as $file){
-							if(is_dir($this->document_root.'/'.$file)){
+							if(is_dir($this->document_root.'/'.$file) and !is_link($this->document_root.'/'.$file)){
 								$app->file->removeDirectory($this->document_root.'/'.$file);
 							} else {
 								@unlink($this->document_root.'/'.$file);
diff --git a/server/lib/classes/backup.inc.php b/server/lib/classes/backup.inc.php
index 2b6d21e57e3ad5501d69dc1ad83f55fdf2693c1b..46618e227898376e1e0c0a3826b1f34864de6129 100644
--- a/server/lib/classes/backup.inc.php
+++ b/server/lib/classes/backup.inc.php
@@ -1076,11 +1076,10 @@ class backup
     {
         global $app;
         if ( ! is_dir($repos_path)) {
+            $dbt = debug_backtrace();
+            $dbt_info = $dbt[1]['file'] . ':' . $dbt[1]['line'];
             $app->log("Unknown path " . var_export($repos_path, TRUE)
-                . ' called from ' . (function() {
-                    $dbt = debug_backtrace();
-                    return $dbt[1]['file'] . ':' . $dbt[1]['line'];
-                })(), LOGLEVEL_ERROR);
+                . ' called from ' . $dbt_info, LOGLEVEL_ERROR);
             return FALSE;
         }
         switch ($backup_mode) {
diff --git a/server/lib/classes/cron.d/100-monitor_cpu.inc.php b/server/lib/classes/cron.d/100-monitor_cpu.inc.php
index f570eeb81913110d1d40482febee8879c02fd2d1..1d67be73704757262ae9f89f4078981cff037fba 100644
--- a/server/lib/classes/cron.d/100-monitor_cpu.inc.php
+++ b/server/lib/classes/cron.d/100-monitor_cpu.inc.php
@@ -78,7 +78,7 @@ class cronjob_monitor_cpu extends cronjob {
 
 				$part = preg_split('/:/', $line);
 				$key = trim($part[0]);
-				$value = trim($part[1]);
+				$value = (isset($part[1]))?trim($part[1]):'';
 				if ($key == 'processor')
 					$processor = intval($value);
 				if ($key != '')
diff --git a/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php b/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php
index 1d03949a8cf1c7457fd9b7e96a51be5fe73b57f9..a3c3a3448fdb38287ec50f386e214ce3595f255d 100644
--- a/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php
+++ b/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php
@@ -83,7 +83,7 @@ class cronjob_monitor_disk_usage extends cronjob {
 		 * ignore the first line, process the rest
 		 */
 		for ($i = 1; $i <= sizeof($df); $i++) {
-			if ($df[$i] != '') {
+			if (isset($df[$i]) && $df[$i] != '') {
 				/*
 				 * Make an array of the data
 				 */
diff --git a/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php b/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php
index 33c7e59589a0b053f9bb3317d103ed263fd25c07..32a9c410e8fa4797da178e7e8f94f7cab13386ca 100644
--- a/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php
+++ b/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php
@@ -78,7 +78,7 @@ class cronjob_monitor_hd_quota extends cronjob {
 
 		//* ignore the first 5 lines, process the rest
 		for ($i = 5; $i <= sizeof($df); $i++) {
-			if ($df[$i] != '') {
+			if (isset($df[$i]) && $df[$i] != '') {
 				//* Make a array of the data
 				$s = preg_split('/[\s]+/', $df[$i]);
 				$username = $s[0];
@@ -106,7 +106,7 @@ class cronjob_monitor_hd_quota extends cronjob {
 
 		//* ignore the first 5 lines, process the rest
 		for ($i = 5; $i <= sizeof($df); $i++) {
-			if ($df[$i] != '') {
+			if (isset($df[$i]) && $df[$i] != '') {
 				//* Make a array of the data
 				$s = preg_split('/[\s]+/', $df[$i]);
 				$groupname = $s[0];
diff --git a/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php b/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php
index b259904d55752c36407517f87aed98863161ba4c..f39dd00a6eea4c917980ba0a4f2cc7ae5e99f854 100644
--- a/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php
+++ b/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php
@@ -89,8 +89,8 @@ class cronjob_monitor_mail_queue extends cronjob {
 		$tmp = explode("\n", $data['output']);
 		$more = $tmp[sizeof($tmp) - 1];
 		$res = $this->_getIntArray($more);
-		$data['bytes'] = $res[0];
-		$data['requests'] = $res[1];
+		$data['bytes'] = (isset($res[0]))?$res[0]:0;
+		$data['requests'] = (isset($res[1]))?$res[1]:0;
 
 		/** The state of the mailq. */
 		$state = 'ok';
diff --git a/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php b/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php
index 73567478dc33cb2aee8f903ffe8358f45e460648..613287267df7e03752556c90887e93d6f0cb58c7 100644
--- a/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php
+++ b/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php
@@ -78,7 +78,7 @@ class cronjob_monitor_mem_usage extends cronjob {
 			$key = trim($part[0]);
 			$tmp = explode(' ', trim($part[1]));
 			$value = 0;
-			if ($tmp[1] == 'kB')
+			if (isset($tmp[1]) && $tmp[1] == 'kB')
 				$value = $tmp[0] * 1024;
 			$data[$key] = $value;
 		}
diff --git a/server/lib/classes/cron.inc.php b/server/lib/classes/cron.inc.php
index 67be475fe37249d1df27d13c1d7408a72e9ba1e0..d0e26c66f44d278eb5f33a712c47eefcbf4c1d80 100644
--- a/server/lib/classes/cron.inc.php
+++ b/server/lib/classes/cron.inc.php
@@ -204,7 +204,7 @@ class cron {
 		if($this->_bParsed == false) $this->_calcValidValues();
 
 		// get the field values for the given Date.
-		list($iMinute, $iHour, $iDay, $iWDay, $iMonth, $iYear) = explode(':', ISPConfigDateTime::to_string($vDate, 'custom:%M:%H:%d:%w:%m:%Y'));
+		list($iMinute, $iHour, $iDay, $iWDay, $iMonth, $iYear) = explode(':', ISPConfigDateTime::to_string($vDate, 'custom:i:G:j:w:n:Y'));
 
 		$bValid = false;
 		$iStartYear = $iYear;
@@ -244,9 +244,8 @@ class cron {
 			}
 
 			$ts = mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear);
-			//print strftime('%d.%m.%Y (%A) %H:%M', $ts) . "\n";
 			//var_dump($iCurMinute, $iCurHour, $iCurDay, $iCurMonth, $iCurWDay, '--', $iNextMinute, $iNextHour, $iNextDay, $iNextMonth, $iNextWDay);
-			if(ISPConfigDateTime::last_day($iMonth, $iYear) >= $iDay && in_array($app->functions->intval(strftime('%w', $ts)), $this->_aValidValues['weekday'], true) === true) {
+			if(ISPConfigDateTime::last_day($iMonth, $iYear) >= $iDay && in_array($app->functions->intval(date('w', $ts)), $this->_aValidValues['weekday'], true) === true) {
 				$bValid = true;
 			} else {
 				if($iYear - $iStartYear > 5) {
diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php
index 9b9d43b442898309a91d67c087d447d062353fc7..3096a5b06273aa2347eaa6060688f6bc9b2059c2 100644
--- a/server/lib/classes/db_mysql.inc.php
+++ b/server/lib/classes/db_mysql.inc.php
@@ -77,11 +77,13 @@ class db
 		$this->dbPort = $port ? $port : $conf['db_port'];
 		$this->dbName = $database ? $database : $conf['db_database'];
 		$this->dbUser = $user ? $user : $conf['db_user'];
-		$this->dbPass = $pass ? $pass : $conf['db_password'];
+		$this->dbPass = ( $pass !== NULL ) ? $pass : $conf['db_password'];
 		$this->dbCharset = $conf['db_charset'];
 		$this->dbClientFlags = ($flags !== NULL) ? $flags : $conf['db_client_flags'];
 		$this->_iConnId = mysqli_init();
 
+		mysqli_report(MYSQLI_REPORT_OFF);
+
 		mysqli_real_connect($this->_iConnId, $this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort, NULL, $this->dbClientFlags);
 		for($try=0;(!is_object($this->_iConnId) || mysqli_connect_errno()) && $try < 5;++$try) {
 			sleep($try);
diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php
index e78ef2636e4aca32451fb53053d1d01edfff9442..bce4e7b84a9ef7916d25a9b808f96fd5d0de19a0 100644
--- a/server/lib/classes/letsencrypt.inc.php
+++ b/server/lib/classes/letsencrypt.inc.php
@@ -44,7 +44,7 @@ class letsencrypt {
 	}
 
 	public function get_acme_script() {
-		$acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh'));
+		$acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh 2> /dev/null'));
 		$acme = reset($acme);
 		if(is_executable($acme)) {
 			return $acme;
@@ -80,7 +80,8 @@ class letsencrypt {
 	}
 
 	public function get_certbot_script() {
-		$letsencrypt = explode("\n", shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt'));
+		$which_certbot = shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt');
+		$letsencrypt = explode("\n", $which_certbot ? $which_certbot : '');
 		$letsencrypt = reset($letsencrypt);
 		if(is_executable($letsencrypt)) {
 			return $letsencrypt;
@@ -303,6 +304,7 @@ class letsencrypt {
 				'domain' => $domain,
 				'key' => $ssl_dir.'/'.$domain.'-le.key',
 				'key2' => $ssl_dir.'/'.$domain.'-le.key.org',
+				'csr' => '', # Not used for LE.
 				'crt' => $ssl_dir.'/'.$domain.'-le.crt',
 				'bundle' => $ssl_dir.'/'.$domain.'-le.bundle'
 			);
diff --git a/server/lib/classes/libdatetime.inc.php b/server/lib/classes/libdatetime.inc.php
index fe2b81553b25849fb956cdfa69d1b48e7b77015e..a0633266fc4cd1ea0d31dead028aa194f01906cf 100644
--- a/server/lib/classes/libdatetime.inc.php
+++ b/server/lib/classes/libdatetime.inc.php
@@ -152,7 +152,7 @@ abstract class ISPConfigDateTime {
 	 * - onlytime: HH:MM
 	 * - rss: Rss time format for XML
 	 * - nice: if you prepend a nice: (like nice:long) you will get results like "today" or "yesterday" if applicable
-	 * - custom: you can give a strftime format like %d.%m.%Y %H:%M if you prepend custom: to it
+	 * - custom: you can give a php date function format like d.m.Y H:i if you prepend custom: to it
 	 * @param bool $time if true apped the time to the date string
 	 * @param bool $seconds if true append the seconds to the time
 	 * @return string date string
@@ -174,15 +174,15 @@ abstract class ISPConfigDateTime {
 		$fmt = '';
 		$prepend = '';
 		if(substr($format, 0, 5) == 'nice:') {
-			if(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime())) {
+			if(date('d.m.Y', $date) == date('d.m.Y', $portal->getTime())) {
 				if($time == true) $format = 'onlytime';
 				else $format = '';
 				$prepend = 'Heute';
-			} elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() - 86400)) {
+			} elseif(date('d.m.Y', $date) == date('d.m.Y', $portal->getTime() - 86400)) {
 				if($time == true) $format = 'onlytime';
 				else $format = '';
 				$prepend = 'Gestern';
-			} elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() + 86400)) {
+			} elseif(date('d.m.Y', $date) == date('d.m.Y', $portal->getTime() + 86400)) {
 				if($time == true) $format = 'onlytime';
 				else $format = '';
 				$prepend = 'Morgen';
@@ -195,21 +195,21 @@ abstract class ISPConfigDateTime {
 			$time = false;
 		}
 
-		if($format == 'short') $fmt = '%d.%m.%y';
-		elseif($format == 'veryshort') $fmt = '%d.%m.';
-		elseif($format == 'medium') $fmt = '%d.%m.%Y';
-		elseif($format == 'long') $fmt = '%d. %B %Y';
-		elseif($format == 'extra') $fmt = '%A, %d. %B %Y';
-		elseif($format == 'day') $fmt = '%d';
-		elseif($format == 'monthnum') $fmt = '%m';
-		elseif($format == 'shortmonth') $fmt = '%b';
-		elseif($format == 'month') $fmt = '%B';
-		elseif($format == 'shortyear') $fmt = '%y';
-		elseif($format == 'year') $fmt = '%Y';
-		elseif($format == 'onlydate') $fmt = '%d.%m.';
-		elseif($format == 'onlydatelong') $fmt = '%d. %B';
+		if($format == 'short') $fmt = 'd.m.y';
+		elseif($format == 'veryshort') $fmt = 'd.m.';
+		elseif($format == 'medium') $fmt = 'd.m.Y';
+		elseif($format == 'long') $fmt = 'd. B Y';
+		elseif($format == 'extra') $fmt = 'A, d. B Y';
+		elseif($format == 'day') $fmt = 'd';
+		elseif($format == 'monthnum') $fmt = 'm';
+		elseif($format == 'shortmonth') $fmt = 'b';
+		elseif($format == 'month') $fmt = 'B';
+		elseif($format == 'shortyear') $fmt = 'y';
+		elseif($format == 'year') $fmt = 'Y';
+		elseif($format == 'onlydate') $fmt = 'd.m.';
+		elseif($format == 'onlydatelong') $fmt = 'd. B';
 		elseif($format == 'onlytime') {
-			$fmt = '%H:%M';
+			$fmt = 'H:i';
 			$time = false;
 		} elseif($format == 'rss') {
 			$ret = date(DATE_RSS, $date);
@@ -220,9 +220,9 @@ abstract class ISPConfigDateTime {
 			if($prepend != '') $ret = $prepend . ' ' . $ret;
 			return $ret;
 		}
-		if($time == true) $fmt .= ' %H:%M' . ($seconds == true ? ':%S' : '');
+		if($time == true) $fmt .= ' H:i' . ($seconds == true ? ':s' : '');
 
-		if($fmt != '') $ret = strftime($fmt, $date);
+		if($fmt != '') $ret = date($fmt, $date);
 		else $ret = '';
 
 		if($prepend != '') $ret = trim($prepend . ' ' . $ret);
@@ -249,10 +249,10 @@ abstract class ISPConfigDateTime {
 	 * @return mixed either int (months) or array of int (0 => years, 1 => months) or FALSE on invalid dates
 	 */
 	public static function months_between($date_from, $date_to, $return_years = false, $include_both = false) {
-		$date_from = self::to_string($date_from, 'custom:%Y%m');
+		$date_from = self::to_string($date_from, 'custom:Ym');
 		if($date_from === false) return $date_from;
 
-		$date_to = self::to_string($date_to, 'custom:%Y%m');
+		$date_to = self::to_string($date_to, 'custom:Ym');
 		if($date_to === false) return $date_to;
 
 		$date_from = intval($date_from);
@@ -294,12 +294,12 @@ abstract class ISPConfigDateTime {
 	 * @return mixed either int (days) or FALSE on invalid dates
 	 */
 	public static function days_between($date_from, $date_to, $include_both = false) {
-		$date_from = self::to_string($date_from, 'custom:%Y-%m-%d');
+		$date_from = self::to_string($date_from, 'custom:Y-m-d');
 		if($date_from === false) return $date_from;
 		list($y, $m, $d) = explode('-', $date_from);
 		$ts_from = mktime(0, 0, 0, $m, $d, $y);
 
-		$date_to = self::to_string($date_to, 'custom:%Y-%m-%d');
+		$date_to = self::to_string($date_to, 'custom:Y-m-d');
 		if($date_to === false) return $date_to;
 		list($y, $m, $d) = explode('-', $date_to);
 		$ts_to = mktime(0, 0, 0, $m, $d, $y);
@@ -364,7 +364,7 @@ abstract class ISPConfigDateTime {
 		if($date === false) $date = $portal->getTime(true);
 
 		if(is_numeric($date)) {
-			return $no_time ? strftime('%Y-%m-%d', $date) : strftime('%Y-%m-%d %H:%M:%S', $date);
+			return $no_time ? date('Y-m-d', $date) : date('Y-m-d H:i:s', $date);
 		}
 
 		if(preg_match('/^(.*)(\d{1,2}:\d{1,2}(:\d{1,2})?)(\D|$)/', $date, $matches)) {
@@ -473,7 +473,7 @@ abstract class ISPConfigDateTime {
 		if($date === false) return $date;
 
 		list($year, $month, $day) = explode('-', $date);
-		list($curyear, $curmonth, $curday) = explode('-', strftime('%Y-%m-%d', $portal->getTime()));
+		list($curyear, $curmonth, $curday) = explode('-', date('Y-m-d', $portal->getTime()));
 
 		$year_diff = $curyear - $year;
 		$month_diff = $curmonth - $month;
diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php
index 5d91bf5ace51733753749363d492f12c0b3e4279..fa1ea26babb92ef6bb6745959115516eaa3f8fd4 100644
--- a/server/lib/classes/monitor_tools.inc.php
+++ b/server/lib/classes/monitor_tools.inc.php
@@ -87,6 +87,10 @@ class monitor_tools {
 				$mainver = $ver;
 			}
 			switch ($mainver){
+			case "22.04":
+				$relname = "(Jammy Jellyfish)";
+				$distconfid = 'ubuntu2204';
+				break;
 			case "20.04":
 				$relname = "(Focal Fossa)";
 				$distconfid = 'ubuntu2004';
@@ -275,7 +279,6 @@ class monitor_tools {
 		}
 	}
 
-
 	//** RHEL (including compatible clones) & Fedora
 	elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) {
 
@@ -296,7 +299,7 @@ class monitor_tools {
 			$distver = '33';
 			$distid = 'fedora33';
 			$distbaseid = 'fedora';
-                //** RHEL 7 and compatible clones 
+        //** RHEL 7 and compatible clones 
 		} elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) {
 			preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version);
 			$distname = $name[0];
@@ -309,6 +312,12 @@ class monitor_tools {
 			$distver = $version[0];
 			$distid = 'centos80';
 			$distbaseid = 'fedora';
+		//** RHEL 9 and compatible clones
+		} elseif(preg_match('/^(?:9|9\.[0-9]{1,2})$/', $versionid[0])) {
+			$distname = $name[0];
+			$distver = $version[0];
+			$distid = 'centos90';
+			$distbaseid = 'fedora';
 		} else {
 			$distname = 'Redhat';
 			$distver = 'Unknown';
@@ -316,41 +325,40 @@ class monitor_tools {
 			$distbaseid = 'fedora';
 		}
         //** CentOS 6
-        } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) {
-
-                $content = file_get_contents('/etc/redhat-release');
-
-                if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
-                        preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version);
-                        $distname = 'CentOS Linux';
-                        $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6';
-                        $distid = 'centos53';
-                        $distbaseid = 'fedora';
-                } else {
-                        $distname = 'Redhat';
-                        $distver = 'Unknown';
-                        $distid = 'fedora9';
-                        $distbaseid = 'fedora';
-                }
+		} elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) {
+
+			$content = file_get_contents('/etc/redhat-release');
+
+			if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
+				preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version);
+				$distname = 'CentOS Linux';
+				$distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6';
+				$distid = 'centos53';
+				$distbaseid = 'fedora';
+			} else {
+				$distname = 'Redhat';
+				$distver = 'Unknown';
+				$distid = 'fedora9';
+				$distbaseid = 'fedora';
+			}
         //** CentOS 6 Extended Lifecycle Support by CloudLinux
         } elseif(file_exists('/etc/redhat-release') && file_exists('/etc/els-release') && !file_exists('/etc/os-release')) {
 
-                $content = file_get_contents('/etc/els-release');
-
-                if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
-                        preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version);
-                        $distname = 'CentOS Linux';
-                        $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6';
-                        $distid = 'centos53';
-                        $distbaseid = 'fedora';
-                } else {
-                        $distname = 'Redhat';
-                        $distver = 'Unknown';
-                        $distid = 'fedora9';
-                        $distbaseid = 'fedora';
-                }
-        }
+			$content = file_get_contents('/etc/els-release');
 
+			if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
+				preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version);
+				$distname = 'CentOS Linux';
+				$distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6';
+				$distid = 'centos53';
+				$distbaseid = 'fedora';
+			} else {
+				$distname = 'Redhat';
+				$distver = 'Unknown';
+				$distid = 'fedora9';
+				$distbaseid = 'fedora';
+			}
+		}
 
 	//** Gentoo
 	elseif(file_exists('/etc/gentoo-release')) {
@@ -470,16 +478,21 @@ class monitor_tools {
 			}
 		}
 
-		/* Monitor MySQL Server */
-		$data['mysqlserver'] = -1; // unknown - not needed
-		if ($services['db_server'] == 1) {
-                       if ($this->_checkTcp($conf['db_host'], $conf['db_port'])) {
-				$data['mysqlserver'] = 1;
-			} else {
-				$data['mysqlserver'] = 0;
-				$state = 'error'; // because service is down
-			}
-		}
+        /* Monitor MySQL Server */
+        $data['mysqlserver'] = -1; // unknown - not needed
+        if ($services['db_server'] == 1) {
+            // hail MySQL server:
+            mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
+            $ispcDB = mysqli_connect($conf['db_host'], $conf['db_user'], $conf['db_password'], $conf['db_database'], $conf['db_port']);
+            if ($ispcDB !== false) {
+                $data['mysqlserver'] = 1;
+            } else {
+                $data['mysqlserver'] = 0;
+                $state = 'error'; // because service is down
+            }
+            mysqli_close($ispcDB);  // we can ignore the result (gwyneth 20220605)
+        }
+		
 /*
 		$data['mongodbserver'] = -1;
 		if ($this->_checkTcp('localhost', 27017)) {
diff --git a/server/lib/classes/tpl.inc.php b/server/lib/classes/tpl.inc.php
index 70dc2e783cf4c37b4bafe0e73c453a30e47e16cd..a4ba1602529663254b096a91e3151ed6c6d29aec 100644
--- a/server/lib/classes/tpl.inc.php
+++ b/server/lib/classes/tpl.inc.php
@@ -1099,7 +1099,7 @@ if (!defined('vlibTemplateClassLoaded')) {
 		{
 			array_push($this->_namespace, $varname);
 			$tempvar = count($this->_namespace) - 1;
-			$retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars";
+			$retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < \$this->_tpl_count(\$this->_arrvars";
 			for ($i=0; $i < count($this->_namespace); $i++) {
 				$retstr .= "['".$this->_namespace[$i]."']";
 				if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]";
@@ -1439,6 +1439,27 @@ if (!defined('vlibTemplateClassLoaded')) {
 			return $return;
 		}
 
+		/**
+		* Used during in evaled code to replace PHP count function for PHP 8 compatibility
+		* @var variable to be counted
+		*/
+		private function _tpl_count($var)
+		{
+			$retvar = 0;
+			if(isset($var)) {
+				if(is_array($var)) {
+					$retvar = count($var);
+				} elseif(is_null($var)) {
+					$retvar = 0;
+				} else {
+					$retvar = 1;
+				}
+			} else {
+				$retvar = 0;
+			}
+			return $retvar;
+		}
+
 		/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     The following functions have no use and are included just so that if the user
     is making use of vlibTemplateCache functions, this doesn't crash when changed to
diff --git a/server/lib/classes/tpl_ini.inc.php b/server/lib/classes/tpl_ini.inc.php
index 792dacbece793e095541caca39451de0733d57d9..6f9f83731bd2e89eae6c8578674173f77fae5914 100644
--- a/server/lib/classes/tpl_ini.inc.php
+++ b/server/lib/classes/tpl_ini.inc.php
@@ -89,7 +89,7 @@ if (!defined('vlibIniClassLoaded')) {
 
 				/* the following are only used by the vlibTemplateCache class. */
 
-				'CACHE_DIRECTORY' => $conf["template"]["cache_dir"],
+				'CACHE_DIRECTORY' => (isset($conf["template"]["cache_dir"]))?$conf["template"]["cache_dir"]:'',
 				// Directory where the cached filesystem
 				// will be set up (full path, and must be writable)
 				// '/' or '\' off the end of the directory.
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 76573c0e964009e5acdb468ed9cabb68f63e49e8..d411cc74dc3f60c8fad66006c4609fe1d3a92778 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -266,7 +266,7 @@ class apache2_plugin {
 		// load the server configuration options
 		$app->uses('getconf');
 		$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
-		if ($web_config['CA_path']!='' && !file_exists($web_config['CA_path'].'/openssl.cnf'))
+		if (isset($web_config['CA_path']) && $web_config['CA_path'] !='' && !file_exists($web_config['CA_path'].'/openssl.cnf'))
 			$app->log("CA path error, file does not exist:".$web_config['CA_path'].'/openssl.cnf', LOGLEVEL_ERROR);
 
 		//* Only vhosts can have a ssl cert
@@ -1169,7 +1169,7 @@ class apache2_plugin {
 		if(!is_dir($web_config['website_basedir'].'/conf')) $app->system->mkdir($web_config['website_basedir'].'/conf');
 
 		//* add open_basedir restriction to custom php.ini content, required for suphp only
-		if(!stristr($data['new']['custom_php_ini'], 'open_basedir') && $data['new']['php'] == 'suphp') {
+		if(isset($data['new']['custom_php_ini']) && !stristr($data['new']['custom_php_ini'], 'open_basedir') && $data['new']['php'] == 'suphp') {
 			$data['new']['custom_php_ini'] .= "\nopen_basedir = '".$data['new']['php_open_basedir']."'\n";
 		}
 
@@ -1194,7 +1194,7 @@ class apache2_plugin {
 		//* Create custom php.ini
 		# Because of custom default PHP directives from snippet
 		# php.ini custom values order os: 1. general settings 2. Directive Snippets settings 3. custom php.ini settings defined in domain settings
-		if(trim($data['new']['custom_php_ini']) != '' || $data['new']['directive_snippets_id'] > "0") {
+		if((isset($data['new']['custom_php_ini']) && trim($data['new']['custom_php_ini']) != '') || $data['new']['directive_snippets_id'] > "0") {
 			$has_custom_php_ini = true;
 			$custom_sendmail_path = false;
 			if(!is_dir($custom_php_ini_dir)) $app->system->mkdirpath($custom_php_ini_dir);
@@ -1400,14 +1400,12 @@ class apache2_plugin {
 
 		$server_alias = array();
 
-		// get autoalias
-		$auto_alias = $web_config['website_autoalias'];
-		if($auto_alias != '') {
+		if(isset($web_config['website_autoalias']) && $web_config['website_autoalias'] != '') {
 			// get the client username
 			$client = $app->db->queryOneRecord("SELECT `username` FROM `client` WHERE `client_id` = ?", $client_id);
 			$aa_search = array('[client_id]', '[website_id]', '[client_username]', '[website_domain]');
 			$aa_replace = array($client_id, $data['new']['domain_id'], $client['username'], $data['new']['domain']);
-			$auto_alias = str_replace($aa_search, $aa_replace, $auto_alias);
+			$auto_alias = str_replace($aa_search, $aa_replace, $web_config['website_autoalias']);
 			unset($client);
 			unset($aa_search);
 			unset($aa_replace);
@@ -1793,7 +1791,7 @@ class apache2_plugin {
 
 		//if proxy protocol is enabled we need to add a new port to lsiten to
 		if($web_config['vhost_proxy_protocol_enabled'] == 'y' && $data['new']['proxy_protocol'] == 'y'){
-			if((int)$web_config['vhost_proxy_protocol_http_port'] > 0) {
+			if(isset($web_config['vhost_proxy_protocol_http_port']) && (int)$web_config['vhost_proxy_protocol_http_port'] > 0) {
 				$tmp_vhost_arr['port']           = (int)$web_config['vhost_proxy_protocol_http_port'];
 				$tmp_vhost_arr['use_proxy_protocol'] = $data['new']['proxy_protocol'];
 				$vhosts[]                        = $tmp_vhost_arr;
@@ -1831,10 +1829,9 @@ class apache2_plugin {
 		//* Add vhost for IPv6 IP
 		if($data['new']['ipv6_address'] != '') {
 			//* rewrite ipv6 on mirrors
-			/* chang $conf to $web_config */
-			if ($web_config['serverconfig']['web']['vhost_rewrite_v6'] == 'y') {
-				if (isset($web_config['serverconfig']['server']['v6_prefix']) && $web_config['serverconfig']['server']['v6_prefix'] <> '') {
-					$explode_v6prefix=explode(':', $web_config['serverconfig']['server']['v6_prefix']);
+			if (isset($conf['serverconfig']['web']['vhost_rewrite_v6']) && $conf['serverconfig']['web']['vhost_rewrite_v6'] == 'y') {
+				if (isset($conf['serverconfig']['server']['v6_prefix']) && $conf['serverconfig']['server']['v6_prefix'] <> '') {
+					$explode_v6prefix=explode(':', $conf['serverconfig']['server']['v6_prefix']);
 					$explode_v6=explode(':', $data['new']['ipv6_address']);
 
 					for ( $i = 0; $i <= count($explode_v6prefix)-1; $i++ ) {
@@ -1943,7 +1940,7 @@ class apache2_plugin {
 			unset($ht_file);
 
 			if(!is_file($data['new']['document_root'].'/web/stats/.htpasswd_stats') || $data['new']['stats_password'] != $data['old']['stats_password']) {
-				if(trim($data['new']['stats_password']) != '') {
+				if(isset($data['new']['stats_password']) && trim($data['new']['stats_password']) != '') {
 					$htp_file = 'admin:'.trim($data['new']['stats_password']);
 					$app->system->web_folder_protection($data['new']['document_root'], false);
 					$app->system->file_put_contents($data['new']['document_root'].'/web/stats/.htpasswd_stats', $htp_file);
diff --git a/server/plugins-available/bind_plugin.inc.php b/server/plugins-available/bind_plugin.inc.php
index f2465d76082d92f7f8a63458dfc3a639d4f44337..9499f1eabaab242ccd6f99df59ceea49226b90e0 100644
--- a/server/plugins-available/bind_plugin.inc.php
+++ b/server/plugins-available/bind_plugin.inc.php
@@ -323,6 +323,10 @@ class bind_plugin {
 					}
 				}
 			}
+			else {
+				$app->log("DNS zone[".$zone['origin']."] has no records yet, skip...", LOGLEVEL_DEBUG);
+				return;
+			}
 			$tpl->setLoop('zones', $records);
 
 			$filename = $dns_config['bind_zonefiles_dir'].'/' . $dns_config['bind_zonefiles_masterprefix'] . str_replace("/", "_", substr($zone['origin'], 0, -1));
@@ -544,11 +548,11 @@ class bind_plugin {
 			if ($tmp['dnssec_wanted'] == 'Y') $zone_file .= '.signed'; //.signed is for DNSSEC-Implementation
 
 			$options = '';
-			if(trim($tmp['xfer']) != '') {
+			if($tmp['xfer'] != null && trim($tmp['xfer']) != '') {
 				$options .= "        allow-transfer {".str_replace(',', ';', $tmp['xfer']).";};\n";
 			}
-			if(trim($tmp['also_notify']) != '') $options .= '        also-notify {'.str_replace(',', ';', $tmp['also_notify']).";};\n";
-			if(trim($tmp['update_acl']) != '') $options .= "        allow-update {".str_replace(',', ';', $tmp['update_acl']).";};\n";
+			if($tmp['also_notify'] != null && trim($tmp['also_notify']) != '') $options .= '        also-notify {'.str_replace(',', ';', $tmp['also_notify']).";};\n";
+			if($tmp['update_acl'] != null && trim($tmp['update_acl']) != '') $options .= "        allow-update {".str_replace(',', ';', $tmp['update_acl']).";};\n";
 
 			if(file_exists($zone_file)) {
 				$zones[] = array( 'zone' => substr($tmp['origin'], 0, -1),
diff --git a/server/plugins-available/mysql_clientdb_plugin.inc.php b/server/plugins-available/mysql_clientdb_plugin.inc.php
index 4d637ef37f6e58b142d454c5a249d10f0f029d97..9cf750a84db03949bc818d0979618dc8f82c7bca 100644
--- a/server/plugins-available/mysql_clientdb_plugin.inc.php
+++ b/server/plugins-available/mysql_clientdb_plugin.inc.php
@@ -166,9 +166,9 @@ class mysql_clientdb_plugin {
 						$link->escape_string($database_password));
 					if(!$link->query($query)) $success = false;
 				}
-				
+
 				$app->log("PASSWORD SET FOR '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG);
-				
+
 				if($success == true){
 					$link->query("FLUSH PRIVILEGES");
 				}
@@ -261,6 +261,7 @@ class mysql_clientdb_plugin {
 				return;
 			}
 
+			mysqli_report(MYSQLI_REPORT_OFF);
 			//* Connect to the database
 			$link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password);
 			if ($link->connect_error) {
@@ -324,6 +325,7 @@ class mysql_clientdb_plugin {
 				return;
 			}
 
+			mysqli_report(MYSQLI_REPORT_OFF);
 			//* Connect to the database
 			$link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password);
 			if ($link->connect_error) {
@@ -654,6 +656,7 @@ class mysql_clientdb_plugin {
 				return;
 			}
 
+			mysqli_report(MYSQLI_REPORT_OFF);
 			//* Connect to the database
 			$link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password);
 			if ($link->connect_error) {
@@ -709,6 +712,7 @@ class mysql_clientdb_plugin {
 			return;
 		}
 
+		mysqli_report(MYSQLI_REPORT_OFF);
 		//* Connect to the database
 		$link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password);
 		if ($link->connect_error) {
@@ -782,6 +786,7 @@ class mysql_clientdb_plugin {
 			return;
 		}
 
+		mysqli_report(MYSQLI_REPORT_OFF);
 		//* Connect to the database
 		$link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password);
 		if ($link->connect_error) {
@@ -807,16 +812,16 @@ class mysql_clientdb_plugin {
 
 		$link->close();
 	}
-	
-	
-				
-				
+
+
+
+
 	function getDatabaseType($link) {
 		$result = $link->query('SELECT VERSION() as version');
 		if($result) {
 			$tmp = $result->fetch_assoc();
 			$result->free();
-			
+
 			if(stristr($tmp['version'],'mariadb')) {
 				return 'mariadb';
 			} else {
@@ -832,7 +837,7 @@ class mysql_clientdb_plugin {
 		if($result) {
 			$tmp = $result->fetch_assoc();
 			$result->free();
-			
+
 			$version = explode('-', $tmp['version']);
 			if($major_version_only == true) {
 				$version_parts = explode('.', $version[0]);
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index dd0ad5892146ccd414f5746117240e53adb3576a..1a4b3336dab8902b0f06126a30a2b699d4d4813d 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -161,7 +161,7 @@ class nginx_plugin {
         subjectAltName         = @alt_names
 
         [alt_names]
-        DNS.1                  = .$domain";
+        DNS.1                  = $domain";
 
 			$ssl_cnf_file = $ssl_dir.'/openssl.conf';
 			$app->system->file_put_contents($ssl_cnf_file, $ssl_cnf);
diff --git a/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php b/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php
index b2dd92265e8f638aae2addf1f34942fbb31e0448..628abe0a2d8d3187ec1d13c30e85549404b2b045 100644
--- a/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php
+++ b/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php
@@ -106,7 +106,7 @@ class z_php_fpm_incron_reload_plugin {
 		$app->uses('getconf');
 		$serverConfig = $app->getconf->get_server_config($conf['server_id'], 'web');
 
-		return $serverConfig['php_fpm_incron_reload'] === 'y';
+		return (isset($serverConfig['php_fpm_incron_reload']) && $serverConfig['php_fpm_incron_reload'] === 'y');
 	}
 
 	private function createIncronConfiguration($triggerFile, $systemUser, $fastcgiPhpVersion) {
diff --git a/server/server.php b/server/server.php
index 164451babe0c8dd69c5aa82bbaed114d2e5c1a56..878376a154c22d4b773094aa93ec28106a595549 100644
--- a/server/server.php
+++ b/server/server.php
@@ -94,7 +94,7 @@ if ($app->dbmaster->testConnection()) {
 	// retrieve admin email address for notifications
 	$sys_ini = $app->db->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = 1");
 	$conf['sys_ini'] = $app->ini_parser->parse_ini_string(stripslashes($sys_ini['config']));
-	$conf['admin_mail'] = $conf['sys_ini']['mail']['admin_mail'];
+	$conf['admin_mail'] = (isset($conf['sys_ini']['mail']['admin_mail']) ? $conf['sys_ini']['mail']['admin_mail'] : '');
 	unset($sys_ini);
 
 	/*
@@ -170,9 +170,9 @@ if ($app->db->testConnection() && $app->dbmaster->testConnection()) {
 	$app->modules->loadModules('all');
 	//** Load the plugins that are in the plugins-enabled folder
 	$app->plugins->loadPlugins('all');
-	
+
 	$app->plugins->raiseAction('server_plugins_loaded', '');
-	
+
 	if ($tmp_num_records > 0) {
 		$app->log("Found $tmp_num_records changes, starting update process.", LOGLEVEL_DEBUG);
 		//** Go through the sys_datalog table and call the processing functions