diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php
index 8c9d7644420490272e36578cc933f8f883073fa2..5c915e579a59d348cb1b6ffd646c661d18419ec6 100644
--- a/server/lib/classes/cron.d/150-goaccess.inc.php
+++ b/server/lib/classes/cron.d/150-goaccess.inc.php
@@ -77,9 +77,8 @@ class cronjob_goaccess extends cronjob {
                 }
 
 
-                /* Check if goaccess binary is in path */
-                system("type goaccess 2>&1>/dev/null", $retval);
-		if ($retval === 0) {
+                /* Check if goaccess binary is in path/installed */
+		if($app->system->is_installed('goaccess')) {
 
 			foreach($records as $rec) {
 				$yesterday = date('Ymd', strtotime("-1 day", time()));
@@ -118,7 +117,7 @@ class cronjob_goaccess extends cronjob {
 				} elseif(!file_exists($goaccess_conf)) {
 					/*
 					 By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir.
-					 Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf.
+					 Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf or /etc/goaccess/goaccess.conf as the base conf.
 					*/
 
 					$app->system->copy($goaccess_conf_main, $goaccess_conf);
@@ -147,8 +146,7 @@ class cronjob_goaccess extends cronjob {
 	                        if(!@is_dir($goa_db_dir)) $app->system->mkdirpath($goa_db_dir);
 	
 	                        if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) $app->system->unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log');
-	                        symlink($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log');
-
+				$app->system->create_relative_link($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log');
 
 				$app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir);
 
@@ -178,7 +176,11 @@ class cronjob_goaccess extends cronjob {
 
 					// don't rotate db files per month
 					//rename($goa_db_dir, $statsdirold.'db');
-	                                //mkdir($goa_db_dir);
+					//mkdir($goa_db_dir);
+
+					$app->system->copy($output_html, $statsdirold);
+					$app->system->unlink($output_html);
+
 
 					$files = scandir($statsdir);
 
@@ -228,8 +230,8 @@ class cronjob_goaccess extends cronjob {
 
 	                        $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG);
 	                        if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) {
-	                                chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']);
-	                                chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']);
+	                                $app->system->chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']);
+	                                $app->system->chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']);
 	                        }
 
 				$app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir);
diff --git a/server/lib/classes/cron.d/symlink b/server/lib/classes/cron.d/symlink
new file mode 100644
index 0000000000000000000000000000000000000000..5d73153c46b8ae0fdcbefd611b1c8b1e6bdd6df8
--- /dev/null
+++ b/server/lib/classes/cron.d/symlink
@@ -0,0 +1,273 @@
+100-mailbox_stats.inc.php:		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+100-mailbox_stats.inc.php:				$tr = $app->dbmaster->queryOneRecord($sql, $rec['mailuser_id']);
+100-mailbox_stats.inc.php:					$app->dbmaster->query($sql, $mail_traffic, $tr['traffic_id']);
+100-mailbox_stats.inc.php:					$app->dbmaster->query($sql, $tstamp, $rec['mailuser_id'], $mail_traffic);
+100-mailbox_stats.inc.php:			$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+100-mailbox_stats.inc.php:			$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+100-mailbox_stats.inc.php:			$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+100-mailbox_stats.inc.php:					$tr = $app->dbmaster->queryOneRecord($sql, $tstamp, $rec['mailuser_id']);
+100-mailbox_stats.inc.php:						$app->dbmaster->query($sql, $mail_traffic, $tr['traffic_id']);
+100-mailbox_stats.inc.php:						$app->dbmaster->query($sql, $tstamp, $rec['mailuser_id'], $mail_traffic);
+100-monitor_clamav_log.inc.php:		$app->load('monitor_tools');
+100-monitor_clamav_log.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_clamav_log.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_cpu.inc.php:		$app->load('monitor_tools');
+100-monitor_cpu.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_database_size.inc.php:		$app->load('monitor_tools');
+100-monitor_database_size.inc.php:		$databases = $app->db->queryAllRecords("SELECT database_id, database_name, sys_groupid, database_quota, quota_exceeded FROM web_database WHERE server_id = ? GROUP BY sys_groupid, database_name ASC", $server_id);
+100-monitor_database_size.inc.php:				$data[$i]['size'] = $app->db->getDatabaseSize($rec['database_name']);
+100-monitor_database_size.inc.php:						$app->dbmaster->datalogUpdate('web_database', array('quota_exceeded' => 'n'), 'database_id', $rec['database_id']);
+100-monitor_database_size.inc.php:					$app->dbmaster->datalogUpdate('web_database', array('quota_exceeded' => 'y'), 'database_id', $rec['database_id']);
+100-monitor_database_size.inc.php:			$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_disk_usage.inc.php:		$app->load('monitor_tools');
+100-monitor_disk_usage.inc.php:		$app->uses('getconf');
+100-monitor_disk_usage.inc.php:		$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
+100-monitor_disk_usage.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_email_quota.inc.php:		$app->uses('getconf');
+100-monitor_email_quota.inc.php:		$mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
+100-monitor_email_quota.inc.php:		$app->load('monitor_tools');
+100-monitor_email_quota.inc.php:		$mailboxes = $app->db->queryAllRecords("SELECT email,maildir FROM mail_user WHERE server_id = ?", $server_id);
+100-monitor_email_quota.inc.php:					$app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG);
+100-monitor_email_quota.inc.php:					$app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG);
+100-monitor_email_quota.inc.php:					$app->system->exec_safe('du -s ?', $mb['maildir']);
+100-monitor_email_quota.inc.php:					$out = $app->system->last_exec_out();
+100-monitor_email_quota.inc.php:					$app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG);
+100-monitor_email_quota.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_fail2ban.inc.php:		$app->load('monitor_tools');
+100-monitor_fail2ban.inc.php:		if ($app->system->is_installed('fail2ban-client')	// Debian, Ubuntu, Fedora
+100-monitor_fail2ban.inc.php:			|| $app->system->is_installed('fail2ban')) {	// CentOS
+100-monitor_fail2ban.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_hd_quota.inc.php:		$app->load('monitor_tools');
+100-monitor_hd_quota.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_iptables.inc.php:		$app->load('monitor_tools');
+100-monitor_iptables.inc.php:		if ($app->system->is_installed('iptables')) {
+100-monitor_iptables.inc.php:		if ($app->system->is_installed('ip6tables')) {
+100-monitor_iptables.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_ispconfig_log.inc.php:		$app->load('monitor_tools');
+100-monitor_ispconfig_log.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_ispconfig_log.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_ispconfig_version.inc.php:		$app->load('monitor_tools');
+100-monitor_ispconfig_version.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_kernel_version.inc.php:		$app->load('monitor_tools');
+100-monitor_kernel_version.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_mail_log.inc.php:		$app->load('monitor_tools');
+100-monitor_mail_log.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_mail_log.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_mail_log.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_mail_queue.inc.php:		$app->load('monitor_tools');
+100-monitor_mail_queue.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_mem_usage.inc.php:		$app->load('monitor_tools');
+100-monitor_mem_usage.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_mongodb.inc.php~:		$app->load('monitor_tools');
+100-monitor_mongodb.inc.php~:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_openvz.inc.php:		$app->load('monitor_tools');
+100-monitor_openvz.inc.php:		$app->load('openvz_tools');
+100-monitor_openvz.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_openvz.inc.php:		$app->load('openvz_tools');
+100-monitor_openvz.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_os_version.inc.php:		$app->load('monitor_tools');
+100-monitor_os_version.inc.php:		$server_id = $app->functions->intval($conf['server_id']);
+100-monitor_os_version.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_raid.inc.php:		$app->load('monitor_tools');
+100-monitor_raid.inc.php:			if ($app->system->is_installed('mpt-status')) {
+100-monitor_raid.inc.php:		if($app->system->is_installed('tw_cli')) {
+100-monitor_raid.inc.php:		if($app->system->is_installed('hpacucli')) {
+100-monitor_raid.inc.php:		if ($app->system->is_installed('megacli')) {
+100-monitor_raid.inc.php:		if ($app->system->is_installed('megacli64')) {
+100-monitor_raid.inc.php:		if($app->system->is_installed('arcconf')) {
+100-monitor_raid.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_rkhunter.inc.php:		$app->load('monitor_tools');
+100-monitor_rkhunter.inc.php:		if ($app->system->is_installed('rkhunter')) {
+100-monitor_rkhunter.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_server.inc.php:		$app->load('monitor_tools');
+100-monitor_server.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_services.inc.php:		$app->load('monitor_tools');
+100-monitor_services.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_syslog.inc.php:		$app->load('monitor_tools');
+100-monitor_syslog.inc.php:		$dbData = $app->dbmaster->queryAllRecords('SELECT loglevel FROM sys_log WHERE server_id = ? AND loglevel > 0', $server_id);
+100-monitor_syslog.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_syslog.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+100-monitor_system_update.inc.php:		$app->uses('getconf');
+100-monitor_system_update.inc.php:		$server_config = $app->getconf->get_server_config($conf['server_id'], 'server');
+100-monitor_system_update.inc.php:		$app->load('monitor_tools');
+100-monitor_system_update.inc.php:		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
+150-awstats.inc.php:		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+150-awstats.inc.php:		$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
+150-awstats.inc.php:				$tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']);
+150-awstats.inc.php:			$aliases = $app->db->queryAllRecords($sql, $rec['domain_id']);
+150-awstats.inc.php:					$app->log("No awstats base config found. Either awstats.conf or awstats.model.conf must exist in ".$awstats_conf_dir.".", LOGLEVEL_WARN);
+150-awstats.inc.php:				$app->log('Created awstats statistics with command: '.$command, LOGLEVEL_DEBUG);
+150-awstats.inc.php:				$app->log("No awstats statistics created. Either $awstats_pl or $awstats_buildstaticpages_pl is not owned by root user.", LOGLEVEL_WARN);
+150-awstats.inc.php:			$app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir);
+150-goaccess.inc.php:		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+150-goaccess.inc.php:		$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
+150-goaccess.inc.php:                                        $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_ERROR);
+150-goaccess.inc.php:					$tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']);
+150-goaccess.inc.php:					$app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf);
+150-goaccess.inc.php:					$app->system->copy($goaccess_conf_main, $goaccess_conf);
+150-goaccess.inc.php:					$content = $app->system->file_get_contents($goaccess_conf, true);
+150-goaccess.inc.php:					$app->system->file_put_contents($goaccess_conf, $content, true);
+150-goaccess.inc.php:					$content = $app->system->file_get_contents($goaccess_conf, true);
+150-goaccess.inc.php:					$app->system->file_put_contents($goaccess_conf, $content, true);
+150-goaccess.inc.php:				if(!@is_dir($statsdir)) $app->system->mkdirpath($statsdir, 0755, $username, $groupname);
+150-goaccess.inc.php:	                        if(!@is_dir($goa_db_dir)) $app->system->mkdirpath($goa_db_dir);
+150-goaccess.inc.php:	                        if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) $app->system->unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log');
+150-goaccess.inc.php:				$app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir);
+150-goaccess.inc.php:						 $app->system->mkdirpath($statsdirold, 0755, $username, $groupname);
+150-goaccess.inc.php:						if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->copy("$statsdir"."/"."$file", "$statsdirold"."$file");
+150-goaccess.inc.php:				$goaccess_version = $app->system->system_safe('goaccess --version 2>&1');
+150-goaccess.inc.php:					$app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html);
+150-goaccess.inc.php:					$output = $app->system->system_safe('goaccess --help 2>&1');
+150-goaccess.inc.php:						$app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html);
+150-goaccess.inc.php:	                                        $app->log("Stats not generated. The GoAccess binary was not compiled with btree support. Please recompile/reinstall GoAccess with btree support, or install GoAccess version >= 1.4!", LOGLEVEL_ERROR);
+150-goaccess.inc.php:						$app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php");
+150-goaccess.inc.php:						$app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php");
+150-goaccess.inc.php:	                        $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG);
+150-goaccess.inc.php:				$app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir);
+150-goaccess.inc.php:		$app->log("Stats not generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_ERROR);
+150-webalizer.inc.php:		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+150-webalizer.inc.php:				$tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']);
+150-webalizer.inc.php:			$app->system->exec_safe("$webalizer -c ? -n ? -s ? -r ? -q -T -p -o ? ?", $webalizer_conf, $domain, $domain, $domain, $statsdir, $logfile);
+150-webalizer.inc.php:			$app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir);
+200-ftplogfiles.inc.php:		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+200-ftplogfiles.inc.php:				$temp = $app->db->queryOneRecord($sql, $parsed_line['username'] );
+200-ftplogfiles.inc.php:				$tmp = $app->dbmaster->queryOneRecord($sql1, $hostname , $traffic_date);		
+200-ftplogfiles.inc.php:				$resultat = $app->dbmaster->query($sql, $traffic['in'], $traffic['out'], $hostname, $traffic_date );
+200-logfiles.inc.php:		$app->uses('getconf');
+200-logfiles.inc.php:		$server_config = $app->getconf->get_server_config($conf['server_id'], 'server');
+200-logfiles.inc.php:			$max_syslog = $app->functions->intval($server_config['log_retention']);
+200-logfiles.inc.php:		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+200-logfiles.inc.php:				$tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']);
+200-logfiles.inc.php:				$tmp = $app->dbmaster->queryOneRecord("select hostname from web_traffic where hostname=? and traffic_date=?", $rec['domain'], $traffic_date);
+200-logfiles.inc.php:					$app->dbmaster->query($sql, $total_bytes, $rec['domain'], $traffic_date);
+200-logfiles.inc.php:					$app->dbmaster->query($sql, $rec['domain'], $traffic_date, $total_bytes);
+200-logfiles.inc.php:				$app->system->exec_safe("gzip -c ? > ?", $logfile, $logfile . '.gz');
+200-logfiles.inc.php:					$app->system->exec_safe("gzip -c ? > ?", $cron_logfile, $cron_logfile . '.1.gz');
+200-logfiles.inc.php:					$app->system->exec_safe("cat /dev/null > ?", $cron_logfile);
+200-logfiles.inc.php:				$app->system->exec_safe("gzip -c ? > ?", $error_logfile, $error_logfile . '.1.gz');
+200-logfiles.inc.php:				$app->system->exec_safe("cat /dev/null > ?", $error_logfile);
+200-logfiles.inc.php:			$app->system->exec_safe("cd ?; find . -mtime +$max_syslog -name '*.log' | xargs rm > /dev/null 2> /dev/null", '/var/log/ispconfig/httpd/'.$tmp_hostname[0]);
+200-logfiles.inc.php:				$app->system->exec_safe("gzip -c ? > ?", $ispconfig_logfile, $ispconfig_logfile . '.1.gz');
+200-logfiles.inc.php:				$app->system->exec_safe("cat /dev/null > ?", $ispconfig_logfile);
+200-logfiles.inc.php:		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+200-logfiles.inc.php:		$app->uses('system');
+200-logfiles.inc.php:				if($tmp_path != '' && strlen($tmp_path) > 10 && is_dir($tmp_path) && $app->system->is_user($rec['system_user'])){
+200-logfiles.inc.php:					$app->system->exec_safe("cd ?; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null", $tmp_path);
+200-logfiles.inc.php:		if ($app->dbmaster == $app->db) {
+200-logfiles.inc.php:			$app->dbmaster->query($sql, $tstamp);
+200-logfiles.inc.php:			$app->dbmaster->query($sql, $tstamp);
+200-logfiles.inc.php:			$app->dbmaster->query($sql, $tstamp - (3600 * 24 * 23));
+200-logfiles.inc.php:			$res = $app->dbmaster->queryOneRecord($sql);
+200-logfiles.inc.php:			$app->dbmaster->query($sql, $tstamp, $maxId);
+200-logfiles.inc.php:			$records = $app->dbmaster->queryAllRecords($sql);
+200-logfiles.inc.php:			$res = $app->dbmaster->queryOneRecord($sql);
+200-logfiles.inc.php:					$app->dbmaster->query($sql, $tstamp, $server['server_id'], $server['updated'], $maxId);
+300-quota_notify.inc.php:		$app->load('monitor_tools');
+300-quota_notify.inc.php:		$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
+300-quota_notify.inc.php:		if ($app->dbmaster == $app->db) {
+300-quota_notify.inc.php:			$global_config = $app->getconf->get_global_config('mail');
+300-quota_notify.inc.php:			$records = $app->db->queryAllRecords($sql);
+300-quota_notify.inc.php:					$tmp = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) As total_traffic_bytes FROM web_traffic WHERE traffic_date like '$current_month%' AND hostname = '$domain'");
+300-quota_notify.inc.php:						$app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'y', "active" => 'n'), 'domain_id', $rec['domain_id']);
+300-quota_notify.inc.php:						$app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.', LOGLEVEL_DEBUG);
+300-quota_notify.inc.php:								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+300-quota_notify.inc.php:							$app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'n', "active" => 'y'), 'domain_id', $rec['domain_id']);
+300-quota_notify.inc.php:							$app->log('Traffic quota for '.$rec['domain'].' ok again. Re-enabling website.', LOGLEVEL_DEBUG);
+300-quota_notify.inc.php:		if ($app->dbmaster == $app->db) {
+300-quota_notify.inc.php:			$global_config = $app->getconf->get_global_config('mail');
+300-quota_notify.inc.php:			$records = $app->db->queryAllRecords($sql);
+300-quota_notify.inc.php:				$tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'harddisk_quota' ORDER BY created DESC");
+300-quota_notify.inc.php:						$monitor_data = array_merge_recursive($monitor_data, unserialize($app->db->unquote($tmp_mon['data'])));
+300-quota_notify.inc.php:						if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => null), 'domain_id', $rec['domain_id']);
+300-quota_notify.inc.php:								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+300-quota_notify.inc.php:							$app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'domain_id', $rec['domain_id']);
+300-quota_notify.inc.php:								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+300-quota_notify.inc.php:		if ($app->dbmaster == $app->db) {
+300-quota_notify.inc.php:			$global_config = $app->getconf->get_global_config('mail');
+300-quota_notify.inc.php:			$mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
+300-quota_notify.inc.php:			$records = $app->db->queryAllRecords($sql);
+300-quota_notify.inc.php:				$tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC");
+300-quota_notify.inc.php:						//$monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
+300-quota_notify.inc.php:						$tmp_array = unserialize($app->db->unquote($tmp_mon['data']));
+300-quota_notify.inc.php:						if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => null), 'mailuser_id', $rec['mailuser_id']);
+300-quota_notify.inc.php:								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+300-quota_notify.inc.php:							$app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'mailuser_id', $rec['mailuser_id']);
+300-quota_notify.inc.php:								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+300-quota_notify.inc.php:		if ($app->dbmaster == $app->db) {
+300-quota_notify.inc.php:			$global_config = $app->getconf->get_global_config('mail');
+300-quota_notify.inc.php:			$tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'database_size' ORDER BY created DESC");
+300-quota_notify.inc.php:					$tmp_array = unserialize($app->db->unquote($tmp_mon['data']));
+300-quota_notify.inc.php:			$database_records = $app->db->queryAllRecords("SELECT database_id,sys_groupid,database_name,database_quota,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM web_database");
+300-quota_notify.inc.php:								$client = $app->db->queryOneRecord("SELECT client.username, client.email FROM web_database, sys_group, client WHERE web_database.sys_groupid = sys_group.groupid AND sys_group.client_id = client.client_id AND web_database.database_name=?", $database);
+300-quota_notify.inc.php:										$app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'database_id', $rec['database_id']);
+300-quota_notify.inc.php:											'{used}' => $app->functions->formatBytes($monitor['size']),
+300-quota_notify.inc.php:											'{quota}' => $app->functions->formatBytes($quota),
+300-quota_notify.inc.php:									if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => null), 'database_id', $rec['database_id']);
+300-quota_notify.inc.php:											'{used}' => $app->functions->formatBytes($monitor['size']),
+300-quota_notify.inc.php:											'{quota}' => $app->functions->formatBytes($quota),
+400-openvz.inc.php:		if ($app->dbmaster == $app->db) {
+400-openvz.inc.php:			$records = $app->db->queryAllRecords($sql);
+400-openvz.inc.php:					$app->dbmaster->datalogUpdate('openvz_vm', array("active" => 'n'), 'vm_id', $rec['vm_id']);
+400-openvz.inc.php:					$app->log('Virtual machine active date expired. Disabling VM '.$rec['veid'], LOGLEVEL_DEBUG);
+500-backup.inc.php:		$app->load("backup");
+500-backup_mail.inc.php:		$server_config = $app->getconf->get_server_config($conf['server_id'], 'server');
+500-backup_mail.inc.php:		$mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
+500-backup_mail.inc.php:		$global_config = $app->getconf->get_global_config('sites');
+500-backup_mail.inc.php:			if( $server_config['backup_dir_is_mount'] == 'y' && !$app->system->mount_backup_dir($backup_dir) ) $run_backups = false;
+500-backup_mail.inc.php:			$records = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE server_id = ? AND maildir != ''", intval($conf['server_id']));
+500-backup_mail.inc.php:				if($app->system->is_installed('pigz')) {
+500-backup_mail.inc.php:					$domain_rec=$app->db->queryOneRecord("SELECT * FROM mail_domain WHERE domain = ?", $domain);
+500-backup_mail.inc.php:							$webdomain = $app->db->queryOneRecord($sql, $domain_rec['domain']);
+500-backup_mail.inc.php:									$webdomain = $app->db->queryOneRecord($sql, $webdomain['parent_domain_id']);
+500-backup_mail.inc.php:							$app->system->exec_safe("su -c ?", 'dsync backup -u "'.$rec["email"].'" mdbox:' . $this->tmp_backup_dir . '/backup');
+500-backup_mail.inc.php:								$app->system->exec_safe('cd ? && zip ? -b ? -r backup > /dev/null && rm -rf backup', $this->tmp_backup_dir, $mail_backup_dir.'/'.$mail_backup_file, $backup_tmp);
+500-backup_mail.inc.php:								$retval = $app->system->last_exec_retcode();
+500-backup_mail.inc.php:									$app->system->exec_safe('tar pcf - --directory ? backup | pigz > ? && rm -rf ?', $this->tmp_backup_dir, $mail_backup_dir.'/'.$mail_backup_file, $this->tmp_backup_dir.'/backup');
+500-backup_mail.inc.php:									$retval = $app->system->last_exec_retcode();
+500-backup_mail.inc.php:									$app->system->exec_safe('tar pczf ? --directory ? backup && rm -rf ?', $mail_backup_dir.'/'.$mail_backup_file, $this->tmp_backup_dir, $this->tmp_backup_dir.'/backup');
+500-backup_mail.inc.php:									$retval = $app->system->last_exec_retcode();
+500-backup_mail.inc.php:									$app->system->exec_safe('rm -rf ?', $this->tmp_backup_dir . '/backup');
+500-backup_mail.inc.php:								$app->system->exec_safe('cd ? && zip ? -b ? -r ? > /dev/null', $domain_dir, $mail_backup_dir.'/'.$mail_backup_file, $backup_tmp, $source_dir);
+500-backup_mail.inc.php:								$retval = $app->system->last_exec_retcode();
+500-backup_mail.inc.php:									$app->system->exec_safe('tar pcf - --directory ? ? | pigz > ?', $domain_dir, $source_dir, $mail_backup_dir.'/'.$mail_backup_file);
+500-backup_mail.inc.php:									$app->system->exec_safe('tar pczf ? --directory ? ?', $mail_backup_dir.'/'.$mail_backup_file, $domain_dir, $source_dir);
+500-backup_mail.inc.php:								$retval = $app->system->last_exec_retcode();
+500-backup_mail.inc.php:							$app->db->query($sql, $conf['server_id'], $domain_rec['domain_id'], $rec['mailuser_id'], $backup_mode, time(), $mail_backup_file, $filesize);	
+500-backup_mail.inc.php:							if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $domain_rec['domain_id'], $rec['mailuser_id'], $backup_mode, time(), $mail_backup_file, $filesize);
+500-backup_mail.inc.php:									$app->system->exec_safe('rm -rf ?', $rec['maildir'] . '/backup');
+500-backup_mail.inc.php:							$app->log($mail_backup_file.' NOK:'.implode('',$tmp_output), LOGLEVEL_WARN);
+500-backup_mail.inc.php:								$app->db->query($sql, $conf['server_id'], $domain_rec['domain_id'], $files[$n]);
+500-backup_mail.inc.php:								if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $domain_rec['domain_id'], $files[$n]);
+500-backup_mail.inc.php:						$app->db->query($sql, $conf['server_id'], $domain_rec['domain_id'], $rec['mailuser_id']);
+500-backup_mail.inc.php:						if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $domain_rec['domain_id'], $rec['mailuser_id']);
+500-backup_mail.inc.php:				$backups = $app->db->queryAllRecords("SELECT * FROM mail_backup WHERE server_id = ?", $conf['server_id']);
+500-backup_mail.inc.php:							$app->db->query($sql, $conf['server_id'], $backup['parent_domain_id'], $backup['filename']);
+500-backup_mail.inc.php:							if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $backup['parent_domain_id'], $backup['filename']);
+500-backup_mail.inc.php:				if( $server_config['backup_dir_is_mount'] == 'y' ) $app->system->umount_backup_dir($backup_dir);
+500-clean_mailboxes.inc.php:		$records = $app->db->queryAllRecords("SELECT email, maildir, purge_trash_days, purge_junk_days FROM mail_user WHERE maildir_format = 'maildir' AND disableimap = 'n' AND server_id = ? AND (purge_trash_days > 0 OR purge_junk_days > 0)", $server_id);
+500-clean_mailboxes.inc.php:							$app->system->exec_safe($purge_cmd.intval($email['purge_trash_days']).'d', $email['email'], $trash);
+500-clean_mailboxes.inc.php:							$app->system->exec_safe($purge_cmd.intval($email['purge_junk_days']).'d', $email['email'], $junk);
+500-clean_mailboxes.inc.php:				$app->system->exec_safe($recalc_cmd, $email['email']);
+550-bind_dnssec.inc.php:		$serial_date = $app->functions->intval(substr($serial, 0, 8));
+550-bind_dnssec.inc.php:		$count = $app->functions->intval(substr($serial, 8, 2));
+550-bind_dnssec.inc.php:		if($app->db->dbHost != $app->dbmaster->dbHost) return;
+550-bind_dnssec.inc.php:		$app->uses("getconf,tpl");
+550-bind_dnssec.inc.php://		$dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns');
+550-bind_dnssec.inc.php://		$soas = $app->db->queryAllRecords("SELECT id,serial,origin FROM dns_soa WHERE server_id = ? AND active= 'Y' AND dnssec_wanted = 'Y' AND dnssec_initialized = 'Y' AND (dnssec_last_signed < ? OR dnssec_last_signed > ?)", $conf['server_id'], time()-(3600*24*5)+900, time()+900); //Resign zones every 5 days (expiry is 16 days so we have enough safety, 15 minutes tolerance)
+550-bind_dnssec.inc.php:		$soas = $app->db->queryAllRecords("SELECT id,serial,origin FROM dns_soa WHERE active= 'Y' AND dnssec_wanted = 'Y' AND dnssec_initialized = 'Y' AND (dnssec_last_signed < ? OR dnssec_last_signed > ?)", time()-(3600*24*5)+900, time()+900); //Resign zones every 5 days (expiry is 16 days so we have enough safety, 15 minutes tolerance)
+550-bind_dnssec.inc.php:			$app->log('DNSSEC Auto-Resign: Touching zone '.$domain, LOGLEVEL_DEBUG);
+550-bind_dnssec.inc.php:			$app->db->datalogUpdate('dns_soa', array("serial" => $this->increase_serial($data['serial'])), 'id', $data['id']);
+600-cleanup.inc.php:			$records = $app->db->queryAllRecords("SELECT s.instance_id, s.name, s.value FROM `aps_instances_settings` as s INNER JOIN `aps_instances` as i ON (i.id = s.instance_id) WHERE s.value != '' AND s.name IN ('main_database_password', 'admin_password') AND i.instance_status > 1");
+600-cleanup.inc.php:					$tmp = $app->db->queryOneRecord("SELECT id FROM aps_instances_settings WHERE instance_id = ? AND name = ?", $rec['instance_id'], $rec['name']);
+600-cleanup.inc.php:					$app->db->datalogUpdate('aps_instances_settings', array("value" => ''), 'id', $tmp['id']);
+600-purge_mailboxes.inc.php:		$records = $app->db->queryAllRecords($sql, $server_id);
+600-purge_mailboxes.inc.php:				$app->system->exec_safe("su -c ?", 'doveadm purge -u "' . $rec["email"] . '"');
+900-letsencrypt.inc.php:		$app->modules->loadModules('web_module');
+900-letsencrypt.inc.php:		$server_config = $app->getconf->get_server_config($conf['server_id'], 'server');
+900-letsencrypt.inc.php:			$acme = $app->letsencrypt->get_acme_script();
+900-letsencrypt.inc.php:			$letsencrypt = $app->letsencrypt->get_certbot_script();
+900-letsencrypt.inc.php:						$app->services->restartServiceDelayed('httpd', 'force-reload');
+900-letsencrypt.inc.php:						$app->system->exec_safe($letsencrypt . ' -n renew --post-hook ?', $cmd);
+900-letsencrypt.inc.php:							$app->services->restartServiceDelayed('httpd', 'force-reload');
+900-letsencrypt.inc.php:					$app->services->restartServiceDelayed('httpd', 'force-reload');
+900-letsencrypt.inc.php:			$app->log('Migration mode active, not running Let\'s Encrypt renewal.', LOGLEVEL_DEBUG);
diff --git a/server/lib/classes/cron.d/system- b/server/lib/classes/cron.d/system-
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391