diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql
index 32e85bd876c1178da79b5e3ee7c8a7109dc330db..b909bc25ead5fc4ed3e81be60dba19c64dae69c6 100644
--- a/install/sql/incremental/upd_dev_collection.sql
+++ b/install/sql/incremental/upd_dev_collection.sql
@@ -204,12 +204,13 @@ CREATE TABLE `ftp_traffic` (
 ALTER TABLE `mail_forwarding` ADD COLUMN `allow_send_as` ENUM('n','y') NOT NULL DEFAULT 'n' AFTER `active`;
 UPDATE `mail_forwarding` SET `allow_send_as` = 'y' WHERE `type` = 'alias';
 
---- DNSSEC-Implementation by dark alex
---- TODO: Review and resolve conflicts if more has been done in that column
 ALTER TABLE `dns_rr` CHANGE COLUMN `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`;
 
 ALTER TABLE `dns_soa`
 	ADD COLUMN `dnssec_initialized` ENUM('Y','N') NOT NULL DEFAULT 'N',
 	ADD COLUMN `dnssec_wanted` ENUM('Y','N') NOT NULL DEFAULT 'N',
 	ADD COLUMN `dnssec_last_signed` BIGINT NOT NULL DEFAULT '0',
-	ADD COLUMN `dnssec_info` TEXT NULL;
\ No newline at end of file
+	ADD COLUMN `dnssec_info` TEXT NULL;
+
+ALTER TABLE `client` ADD COLUMN `limit_ssl_letsencrypt` enum('n','y') NOT NULL DEFAULT 'n' AFTER `limit_ssl`;
+ALTER TABLE `client_template` ADD COLUMN `limit_ssl_letsencrypt` enum('n','y') NOT NULL DEFAULT 'n' AFTER `limit_ssl`;
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index 68cf272f084e8b2f1abb3f10b866e5f6fbf77e50..d025b7fa71a7d8a3012347096b569ce16c2eaa17 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -211,6 +211,7 @@ CREATE TABLE `client` (
   `limit_hterror` enum('n','y') NOT NULL DEFAULT 'n',
   `limit_wildcard` enum('n','y') NOT NULL DEFAULT 'n',
   `limit_ssl` enum('n','y') NOT NULL DEFAULT 'n',
+  `limit_ssl_letsencrypt` enum('n','y') NOT NULL DEFAULT 'n',
   `limit_web_subdomain` int(11) NOT NULL DEFAULT '-1',
   `limit_web_aliasdomain` int(11) NOT NULL DEFAULT '-1',
   `limit_ftp_user` int(11) NOT NULL DEFAULT '-1',
@@ -335,6 +336,7 @@ CREATE TABLE `client_template` (
   `limit_hterror` enum('n','y') NOT NULL DEFAULT 'n',
   `limit_wildcard` enum('n','y') NOT NULL DEFAULT 'n',
   `limit_ssl` enum('n','y') NOT NULL DEFAULT 'n',
+  `limit_ssl_letsencrypt` enum('n','y') NOT NULL DEFAULT 'n',
   `limit_web_subdomain` int(11) NOT NULL default '-1',
   `limit_web_aliasdomain` int(11) NOT NULL default '-1',
   `limit_ftp_user` int(11) NOT NULL default '-1',
diff --git a/install/tpl/apache_ispconfig.conf.master b/install/tpl/apache_ispconfig.conf.master
index cd9924a3770da2c523bb4134c7366ca34bb63583..852cb39e0bfe988a96006bd9dbfecaa779fdc9f8 100644
--- a/install/tpl/apache_ispconfig.conf.master
+++ b/install/tpl/apache_ispconfig.conf.master
@@ -118,6 +118,16 @@ CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m
 Alias /awstats-icon "/usr/share/awstats/icon"
 </tmpl_if>
 
+Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-known/acme-challenge
+<Directory /usr/local/ispconfig/interface/acme/.well-known/acme-challenge>
+		<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>
+
 NameVirtualHost *:80
 NameVirtualHost *:443
 <tmpl_loop name="ip_adresses">
diff --git a/interface/acme/.well-known/acme-challenge/empty.dir b/interface/acme/.well-known/acme-challenge/empty.dir
new file mode 100644
index 0000000000000000000000000000000000000000..95ba9ef37cca69318bcba17e67cd44ae84bd41e1
--- /dev/null
+++ b/interface/acme/.well-known/acme-challenge/empty.dir
@@ -0,0 +1 @@
+This empty directory is needed by ISPConfig.
diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php
index 4415768d62d6b9043391265b9e984f4b0b8d44c2..4e972b9228327b9669fed8b36db4467e2d21ec72 100644
--- a/interface/web/client/form/client.tform.php
+++ b/interface/web/client/form/client.tform.php
@@ -1022,6 +1022,12 @@ $form["tabs"]['limits'] = array (
 			'default' => 'n',
 			'value'  => array(0 => 'n', 1 => 'y')
 		),
+		'limit_ssl_letsencrypt' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default' => 'n',
+			'value'  => array(0 => 'n', 1 => 'y')
+		),
 		'limit_web_aliasdomain' => array (
 			'datatype' => 'INTEGER',
 			'formtype' => 'TEXT',
@@ -1109,6 +1115,12 @@ $form["tabs"]['limits'] = array (
 			'default' => 'y',
 			'value'  => array(0 => 'n', 1 => 'y')
 		),
+		'limit_directive_snippets' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default' => 'n',
+			'value'  => array(0 => 'n', 1 => 'y')
+		),
 		'default_dnsserver' => array (
 			'datatype' => 'INTEGER',
 			'formtype' => 'SELECT',
diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php
index 21f85963ee84d3a0fd7940e09d51d03c22600fc0..2da539c73752590fd2abc978391fadc892cf8b51 100644
--- a/interface/web/client/form/client_template.tform.php
+++ b/interface/web/client/form/client_template.tform.php
@@ -522,6 +522,12 @@ $form["tabs"]['limits'] = array (
 			'default' => 'n',
 			'value'  => array(0 => 'n', 1 => 'y')
 		),
+		'limit_ssl_letsencrypt' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default' => 'n',
+			'value'  => array(0 => 'n', 1 => 'y')
+		),
 		'limit_web_aliasdomain' => array (
 			'datatype' => 'INTEGER',
 			'formtype' => 'TEXT',
@@ -612,6 +618,12 @@ $form["tabs"]['limits'] = array (
 			'default' => 'y',
 			'value'  => array(0 => 'n', 1 => 'y')
 		),
+		'limit_directive_snippets' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default' => 'n',
+			'value'  => array(0 => 'n', 1 => 'y')
+		),
 		'default_dnsserver' => array (
 			'datatype' => 'INTEGER',
 			'formtype' => 'SELECT',
diff --git a/interface/web/client/form/reseller.tform.php b/interface/web/client/form/reseller.tform.php
index 8f4e5baf6dab40b82d785e0c7fd5024e437b8f36..50d5e7438a5d2a35ebb5ba351e8170b91340957c 100644
--- a/interface/web/client/form/reseller.tform.php
+++ b/interface/web/client/form/reseller.tform.php
@@ -1019,6 +1019,12 @@ $form["tabs"]['limits'] = array (
 			'default' => 'n',
 			'value'  => array(0 => 'n', 1 => 'y')
 		),
+		'limit_ssl_letsencrypt' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default' => 'n',
+			'value'  => array(0 => 'n', 1 => 'y')
+		),
 		'limit_web_aliasdomain' => array (
 			'datatype' => 'INTEGER',
 			'formtype' => 'TEXT',
@@ -1105,6 +1111,12 @@ $form["tabs"]['limits'] = array (
 			'default' => 'y',
 			'value'  => array(0 => 'n', 1 => 'y')
 		),
+		'limit_directive_snippets' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default' => 'n',
+			'value'  => array(0 => 'n', 1 => 'y')
+		),
 		'default_dnsserver' => array (
 			'datatype' => 'INTEGER',
 			'formtype' => 'SELECT',
diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng
index 45c6eb910aed962cbd3cce619abef7cc6347a4ea..70368421ce6a04ce7c36ca7aa0133503d8780d9c 100644
--- a/interface/web/client/lib/lang/de_client.lng
+++ b/interface/web/client/lib/lang/de_client.lng
@@ -98,6 +98,7 @@ $wb['force_suexec_txt'] = 'SuEXEC erzwungen';
 $wb['limit_hterror_txt'] = 'Eigene Fehlerseiten verfügbar';
 $wb['limit_wildcard_txt'] = 'Wildcard Subdomain verfügbar';
 $wb['limit_ssl_txt'] = 'SSL verfügbar';
+$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt verfügbar';
 $wb['limit_client_error'] = 'Die maximale Anzahl an Kunden wurde erreicht.';
 $wb['limit_mailaliasdomain_txt'] = 'Max. Anzahl an Domain Aliases';
 $wb['limit_mailaliasdomain_error_notint'] = 'Das E-Mail Domain Alias Limit muss eine Zahl sein.';
@@ -194,4 +195,5 @@ $wb['limit_xmpp_anon_txt'] = 'Anonymous host available';
 $wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available';
 $wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available';
 $wb['limit_xmpp_status_txt'] = 'Status host available';
+$wb['limit_directive_snippets_txt'] = 'Webserver-Konfigurationsauswahl sichtbar';
 ?>
diff --git a/interface/web/client/lib/lang/de_client_template.lng b/interface/web/client/lib/lang/de_client_template.lng
index 37f85fe8f1618647952f31d3334e6160686eaf48..47e647f5f94339f3f8027285749b7859172f5239 100644
--- a/interface/web/client/lib/lang/de_client_template.lng
+++ b/interface/web/client/lib/lang/de_client_template.lng
@@ -77,6 +77,7 @@ $wb['force_suexec_txt'] = 'SuEXEC erzwungen';
 $wb['limit_hterror_txt'] = 'Eigene Fehlerseiten verfügbar';
 $wb['limit_wildcard_txt'] = 'Wildcard Subdomain verfügbar';
 $wb['limit_ssl_txt'] = 'SSL verfügbar';
+$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt verfügbar';
 $wb['template_type_txt'] = 'Vorlagen Typ';
 $wb['template_name_txt'] = 'Vorlagen Name';
 $wb['web_limits_txt'] = 'Web Limits';
@@ -114,4 +115,5 @@ $wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available';
 $wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available';
 $wb['limit_xmpp_status_txt'] = 'Status host available';
 $wb['dns_servers_txt'] = 'DNS servers';
+$wb['limit_directive_snippets_txt'] = 'Webserver-Konfigurationsauswahl sichtbar';
 ?>
diff --git a/interface/web/client/lib/lang/de_reseller.lng b/interface/web/client/lib/lang/de_reseller.lng
index 43deed8803d7dde167053630295bd57a59b8c7c1..137d206e9fa2b0ae3002e20c3bfa80a7e3f48a21 100644
--- a/interface/web/client/lib/lang/de_reseller.lng
+++ b/interface/web/client/lib/lang/de_reseller.lng
@@ -97,6 +97,7 @@ $wb['force_suexec_txt'] = 'SuEXEC erzwungen';
 $wb['limit_hterror_txt'] = 'Eigene Fehlerseiten verfügbar';
 $wb['limit_wildcard_txt'] = 'Wildcard Subdomain verfügbar';
 $wb['limit_ssl_txt'] = 'SSL verfügbar';
+$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt verfügbar';
 $wb['limit_client_error'] = 'Die maximale Anzahl an Kunden wurde erreicht.';
 $wb['limit_client_error_positive_or_unlimited'] = 'Die Anzahl an Kunden muss > 0 sein';
 $wb['limit_web_quota_txt'] = 'Speicherplatzbeschränkung';
@@ -196,4 +197,5 @@ $wb['limit_xmpp_anon_txt'] = 'Anonymous host available';
 $wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available';
 $wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available';
 $wb['limit_xmpp_status_txt'] = 'Status host available';
+$wb['limit_directive_snippets_txt'] = 'Webserver-Konfigurationsauswahl sichtbar';
 ?>
diff --git a/interface/web/client/lib/lang/en_client.lng b/interface/web/client/lib/lang/en_client.lng
index 9514324878828b316dc7c5c78f7bcc23ac0500ca..ac3336da8475e1585a2c6422d53c163cecb5aae8 100644
--- a/interface/web/client/lib/lang/en_client.lng
+++ b/interface/web/client/lib/lang/en_client.lng
@@ -110,6 +110,7 @@ $wb["force_suexec_txt"] = "SuEXEC forced";
 $wb["limit_hterror_txt"] = "Custom error docs available";
 $wb["limit_wildcard_txt"] = "Wildcard subdomain available";
 $wb["limit_ssl_txt"] = "SSL available";
+$wb["limit_ssl_letsencrypt_txt"] = "Let\'s Encrypt available";
 $wb["limit_client_error"] = 'The max. number of clients is reached.';
 $wb["limit_web_quota_txt"] = 'Web Quota';
 $wb["limit_traffic_quota_txt"] = 'Traffic Quota';
@@ -200,4 +201,5 @@ $wb['btn_save_txt'] = "Save";
 $wb['btn_cancel_txt'] = "Cancel";
 $wb['invalid_vat_id'] = 'The VAT ID is invalid.';
 $wb["email_error_empty"] = "Email is empty";
+$wb['limit_directive_snippets_txt'] = 'Show web server config selection';
 ?>
diff --git a/interface/web/client/lib/lang/en_client_template.lng b/interface/web/client/lib/lang/en_client_template.lng
index 27f8d8a7b9e30d7f225ace1a6c666d94572004cd..7fc3d8c7aab6d15963576b5f5a29ec16752c74bb 100644
--- a/interface/web/client/lib/lang/en_client_template.lng
+++ b/interface/web/client/lib/lang/en_client_template.lng
@@ -85,6 +85,7 @@ $wb["force_suexec_txt"] = "SuEXEC forced";
 $wb["limit_hterror_txt"] = "Custom error docs available";
 $wb["limit_wildcard_txt"] = "Wildcard subdomain available";
 $wb["limit_ssl_txt"] = "SSL available";
+$wb["limit_ssl_letsencrypt_txt"] = "Let\'s Encrypt available";
 $wb["web_limits_txt"] = 'Web Limits';
 $wb["email_limits_txt"] = 'Email Limits';
 $wb["database_limits_txt"] = 'Database Limits';
@@ -116,4 +117,5 @@ $wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available';
 $wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available';
 $wb['limit_xmpp_status_txt'] = 'Status host available';
 $wb["dns_servers_txt"] = 'DNS servers';
+$wb['limit_directive_snippets_txt'] = 'Show web server config selection';
 ?>
diff --git a/interface/web/client/lib/lang/en_reseller.lng b/interface/web/client/lib/lang/en_reseller.lng
index 824f75035ff89c88b02b5e95868dabe319061ac4..1cc3e5e8fe6c77f7401a57cfbe35aa6d75f277de 100644
--- a/interface/web/client/lib/lang/en_reseller.lng
+++ b/interface/web/client/lib/lang/en_reseller.lng
@@ -108,6 +108,7 @@ $wb["force_suexec_txt"] = "SuEXEC forced";
 $wb["limit_hterror_txt"] = "Custom error docs available";
 $wb["limit_wildcard_txt"] = "Wildcard subdomain available";
 $wb["limit_ssl_txt"] = "SSL available";
+$wb["limit_ssl_letsencrypt_txt"] = "Let\'s Encrypt available";
 $wb["limit_client_error"] = 'The max. number of clients is reached.';
 $wb["limit_client_error_positive_or_unlimited"] = 'The number of clients must be > 0 or -1 (unlimited)';
 $wb["limit_web_quota_txt"] = 'Web Quota';
@@ -200,4 +201,6 @@ $wb['invalid_vat_id'] = 'The VAT ID is invalid.';
 $wb["btn_save_txt"] = "Save";
 $wb["btn_cancel_txt"] = "Cancel";
 $wb["email_error_empty"] = "Email is empty";
+$wb['limit_directive_snippets_txt'] = 'Show web server config selection';
+
 ?>
diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm
index 8c133d4d5572ed2f5e20e0280e4d78036657719e..01b1b8b28d8a346dc53929c062d41bfae92103e6 100644
--- a/interface/web/client/templates/client_edit_limits.htm
+++ b/interface/web/client/templates/client_edit_limits.htm
@@ -136,6 +136,12 @@
                         {tmpl_var name='limit_ssl'}
                     </div>
                 </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">{tmpl_var name='limit_ssl_letsencrypt_txt'}</label>
+                    <div class="col-sm-9">
+                        {tmpl_var name='limit_ssl_letsencrypt'}
+                    </div>
+                </div>
                 <div class="form-group">
                     <label for="limit_web_aliasdomain" class="col-sm-3 control-label">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
                     <div class="col-sm-9"><input type="text" name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" class="form-control" /></div></div>
@@ -163,6 +169,12 @@
                         {tmpl_var name='limit_backup'}
                     </div>
                 </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">{tmpl_var name='limit_directive_snippets_txt'}</label>
+                    <div class="col-sm-9">
+                        {tmpl_var name='limit_directive_snippets'}
+                    </div>
+                </div>
       </div>
 	</div>
   </div>
diff --git a/interface/web/client/templates/client_template_edit_limits.htm b/interface/web/client/templates/client_template_edit_limits.htm
index c7a4001720988f7997293215cb66012dac9a394a..09bcce24714af786f65734edce830056685e6fc2 100644
--- a/interface/web/client/templates/client_template_edit_limits.htm
+++ b/interface/web/client/templates/client_template_edit_limits.htm
@@ -88,6 +88,12 @@
                         {tmpl_var name='limit_ssl'}
                     </div>
                 </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">{tmpl_var name='limit_ssl_letsencrypt_txt'}</label>
+                    <div class="col-sm-9">
+                        {tmpl_var name='limit_ssl_letsencrypt'}
+                    </div>
+                </div>
                 <div class="form-group">
                     <label for="limit_web_aliasdomain" class="col-sm-3 control-label">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
                     <div class="col-sm-9"><input type="text" name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" class="form-control" /></div></div>
@@ -115,6 +121,12 @@
                         {tmpl_var name='limit_backup'}
                     </div>
                 </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">{tmpl_var name='limit_directive_snippets_txt'}</label>
+                    <div class="col-sm-9">
+                        {tmpl_var name='limit_directive_snippets'}
+                    </div>
+                </div>
       </div>
 	</div>
   </div>
diff --git a/interface/web/client/templates/reseller_edit_limits.htm b/interface/web/client/templates/reseller_edit_limits.htm
index 05a22ae889c14b95a32dd6ade81e0e8621ae0958..8dc587eb23190073b57e731cb7c1156734f4529d 100644
--- a/interface/web/client/templates/reseller_edit_limits.htm
+++ b/interface/web/client/templates/reseller_edit_limits.htm
@@ -139,6 +139,12 @@
                         {tmpl_var name='limit_ssl'}
                     </div>
                 </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">{tmpl_var name='limit_ssl_letsencrypt_txt'}</label>
+                    <div class="col-sm-9">
+                        {tmpl_var name='limit_ssl_letsencrypt'}
+                    </div>
+                </div>
                 <div class="form-group">
                     <label for="limit_web_aliasdomain" class="col-sm-3 control-label">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
                     <div class="col-sm-9"><input type="text" name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" class="form-control" /></div></div>
@@ -166,6 +172,12 @@
                         {tmpl_var name='limit_backup'}
                     </div>
                 </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">{tmpl_var name='limit_directive_snippets_txt'}</label>
+                    <div class="col-sm-9">
+                        {tmpl_var name='limit_directive_snippets'}
+                    </div>
+                </div>
       </div>
 	</div>
   </div>
diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php
index 894ea0c0572bbc0d10f84423c080fb90c0dd54aa..8e40f82c8ce914e2c079c166c8090879cbdcc289 100644
--- a/interface/web/sites/form/web_vhost_domain.tform.php
+++ b/interface/web/sites/form/web_vhost_domain.tform.php
@@ -88,10 +88,11 @@ $ssl_available = true;
 $backup_available = ($vhostdomain_type == 'domain');
 if(!$app->auth->is_admin()) {
 	$client_group_id = $_SESSION["s"]["user"]["default_group"];
-	$client = $app->db->queryOneRecord("SELECT limit_wildcard, limit_ssl, limit_backup FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+	$client = $app->db->queryOneRecord("SELECT limit_wildcard, limit_ssl, limit_ssl_letsencrypt, limit_backup FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 
 	if($client['limit_wildcard'] != 'y') $wildcard_available = false;
 	if($client['limit_ssl'] != 'y') $ssl_available = false;
+	if($client['limit_ssl_letsencrypt'] == 'y') $ssl_available = false;
 	if($client['limit_backup'] != 'y') $backup_available = false;
 }
 
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 e6bfb44999c2aa02ac52f791170ca0c92facd9df..01820e5a83de4770a333e3761721682c03228d9c 100644
--- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng
@@ -142,4 +142,5 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou
 $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.';
 $wb['rewrite_to_https_txt'] = 'Rewrite HTTP to HTTPS';
 $wb['password_strength_txt'] = 'Password strength';
+$wb['directive_snippets_id_txt'] = 'Webserver-Konfiguration';
 ?>
diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng
index 68cd3997cc562d23e0fed4ad0642c1e411f66f9a..a10b9b65e85eefdc85b8e2b4f852c78a7abbb7c1 100644
--- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng
@@ -147,4 +147,5 @@ $wb["document_root_txt"] = "Document Root";
 $wb['ssl_letsencrypt_txt'] = 'Let\'s Encrypt SSL';
 $wb['rewrite_to_https_txt'] = 'Rewrite HTTP to HTTPS';
 $wb['password_strength_txt'] = 'Password strength';
+$wb['directive_snippets_id_txt'] = 'Web server config';
 ?>
diff --git a/interface/web/sites/lib/module.conf.php b/interface/web/sites/lib/module.conf.php
index 979aa63df29ddcd7e9e741e389e3999c2bada6a0..94c5ba0593faeec34ef62e4748abaefc77bcf4eb 100644
--- a/interface/web/sites/lib/module.conf.php
+++ b/interface/web/sites/lib/module.conf.php
@@ -194,6 +194,11 @@ $items[] = array(   'title'   => 'Web traffic',
 	'link'    => 'sites/web_sites_stats.php',
 	'html_id' => 'websites_stats');
 
+$items[] = array(   'title'   => 'FTP traffic',
+	'target'  => 'content',
+	'link'    => 'sites/ftp_sites_stats.php',
+	'html_id' => 'ftpsites_stats');
+
 $items[] = array(   'title'   => 'Website quota (Harddisk)',
 	'target'  => 'content',
 	'link'    => 'sites/user_quota_stats.php',
diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm
index 8ba2825ecb6ea3eb3941693c28b6beaa5ec7f21e..468797ebc539bf1655acb40a2c8cee90434e5c86 100644
--- a/interface/web/sites/templates/web_vhost_domain_edit.htm
+++ b/interface/web/sites/templates/web_vhost_domain_edit.htm
@@ -206,16 +206,18 @@
             </div>
             <tmpl_if name="limit_ssl" op="==" value="y"><div class="form-group">
                 <label class="col-sm-3 control-label">{tmpl_var name='ssl_txt'}</label>
-                <div class="col-sm-9">
+                <div class="col-sm-9" data-uncheck-fields="ssl_letsencrypt">
                     {tmpl_var name='ssl'}
                 </div>
             </div>
+            <tmpl_if name="limit_ssl_letsencrypt" op="==" value="y">
             <div class="form-group">
                 <label class="col-sm-3 control-label">{tmpl_var name='ssl_letsencrypt_txt'}</label>
-                <div class="col-sm-9">
+                <div class="col-sm-9" data-check-fields="ssl">
                     {tmpl_var name='ssl_letsencrypt'}
                 </div>
             </div></tmpl_if>
+            </tmpl_if>
             <div class="form-group">
                 <label for="php" class="col-sm-3 control-label">{tmpl_var name='php_txt'}</label>
                 <div class="col-sm-9"><select name="php" id="php" class="form-control">
@@ -229,12 +231,12 @@
                     {tmpl_var name='fastcgi_php_version'}
                 </select></div>
             </div>
-			<div class="form-group">
+            <tmpl_if name="limit_directive_snippets" op="==" value="y"><div class="form-group">
 				<label for="directive_snippets_id" class="col-sm-3 control-label">{tmpl_var name='directive_snippets_id_txt'}</label>
 				<div class="col-sm-9"><select name="directive_snippets_id" id="directive_snippets_id" class="form-control">
 					{tmpl_var name='directive_snippets_id'}
 				</select></div>
-			</div>
+			</div></tmpl_if>
 			{tmpl_hook name="field_enable_pagespeed"}
 			<div class="form-group nginx pagespeed">
 				<label class="col-sm-3 control-label">{tmpl_var name='enable_pagespeed_txt'}</label>
diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php
index 8bbc5e1fb00d2d625c68e786ceb8d0f605d0d79a..05d906fdac74c85fff57d97fb7acf2c87edf8984 100644
--- a/interface/web/sites/web_vhost_domain_edit.php
+++ b/interface/web/sites/web_vhost_domain_edit.php
@@ -139,7 +139,7 @@ class page_action extends tform_actions {
 		$app->uses('ini_parser,getconf');
 		$settings = $app->getconf->get_global_config('domains');
 
-		$read_limits = array('limit_cgi', 'limit_ssi', 'limit_perl', 'limit_ruby', 'limit_python', 'force_suexec', 'limit_hterror', 'limit_wildcard', 'limit_ssl');
+		$read_limits = array('limit_cgi', 'limit_ssi', 'limit_perl', 'limit_ruby', 'limit_python', 'force_suexec', 'limit_hterror', 'limit_wildcard', 'limit_ssl', 'limit_ssl_letsencrypt', 'limit_directive_snippets');
 
 		if($this->_vhostdomain_type != 'domain') $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ?", @$this->dataRecord["parent_domain_id"]);
 		
@@ -953,7 +953,7 @@ class page_action extends tform_actions {
 			$this->parent_domain_record = $parent_domain;
 		}
 
-		$read_limits = array('limit_cgi', 'limit_ssi', 'limit_perl', 'limit_ruby', 'limit_python', 'force_suexec', 'limit_hterror', 'limit_wildcard', 'limit_ssl');
+		$read_limits = array('limit_cgi', 'limit_ssi', 'limit_perl', 'limit_ruby', 'limit_python', 'force_suexec', 'limit_hterror', 'limit_wildcard', 'limit_ssl', 'limit_ssl_letsencrypt', 'limit_directive_snippets');
 
 		/* check if the domain module is used - and check if the selected domain can be used! */
 		if($app->tform->getCurrentTab() == 'domain') {
@@ -1020,6 +1020,8 @@ class page_action extends tform_actions {
 			if($client['limit_hterror'] != 'y') $this->dataRecord['errordocs'] = 'n';
 			if($client['limit_wildcard'] != 'y' && $this->dataRecord['subdomain'] == '*') $this->dataRecord['subdomain'] = 'n';
 			if($client['limit_ssl'] != 'y') $this->dataRecord['ssl'] = 'n';
+			if($client['limit_ssl_letsencrypt'] != 'y') $this->dataRecord['ssl_letsencrypt'] = 'n';
+			if($client['limit_directive_snippets'] != 'y') $this->dataRecord['directive_snippets_id'] = 0;
 
 			// only generate quota and traffic warnings if value has changed
 			if($this->id > 0) {
diff --git a/interface/web/themes/default/assets/javascripts/ispconfig.js b/interface/web/themes/default/assets/javascripts/ispconfig.js
index b9ebee4c05c3ac367a5e98438c999e03a35dce0d..7d7dd3f6eee3414dcff1750ffe0d704b7ae8c579 100644
--- a/interface/web/themes/default/assets/javascripts/ispconfig.js
+++ b/interface/web/themes/default/assets/javascripts/ispconfig.js
@@ -655,9 +655,9 @@ $(document).bind("keypress", function(event) {
 		$("#pageForm .table #Filter").trigger('click');
 	}
 	//Use $ submit with keypress Enter in forms
-	if (event.which == '13' && $(".pnl_formsarea button.positive").length > 0 && event.target.localName != 'textarea' && $(event.target).is(':input')) {
+	if (event.which == '13' && $(".tab-content button.formbutton-success").length > 0 && event.target.localName != 'textarea' && $(event.target).is(':input')) {
 		event.preventDefault();
-		$(".pnl_formsarea button.positive:first").not("[disabled='disabled']").trigger('click');
+		$(".tab-content button.formbutton-success").not("[disabled='disabled']").trigger('click');
 	}
 });
 
@@ -702,6 +702,29 @@ $(document).on("click", ".addPlaceholderContent", function(){
 	template2.insertAtCaret(placeholderContentText);
 });
 
+$(document).on("click", "[data-check-fields] > input[type='checkbox']", function() {
+	if($(this).is(':checked')) {
+		var flds = $(this).parent().attr('data-check-fields');
+		var tmp = flds.split(/,/);
+		for(var i = 0; i < tmp.length; i++) {
+			var fname = tmp[i];
+			$('input[type="checkbox"][name="' + fname + '"]').prop('checked', true);
+		}
+	}
+});
+
+$(document).on("click", "[data-uncheck-fields] > input[type='checkbox']", function() {
+	if($(this).is(':checked') == false) {
+		var flds = $(this).parent().attr('data-uncheck-fields');
+		var tmp = flds.split(/,/);
+		for(var i = 0; i < tmp.length; i++) {
+			var fname = tmp[i];
+			$('input[type="checkbox"][name="' + fname + '"]').prop('checked', false);
+		}
+	}
+});
+
+
 $(document).on('ready', function () {
 	$.fn.extend({
 		insertAtCaret: function(myValue){
diff --git a/interface/web/themes/default/assets/javascripts/ispconfig.min.js b/interface/web/themes/default/assets/javascripts/ispconfig.min.js
index 0df4d49b520ba390fef61682ece6742ce616bbcf..247c83f1ed41e83352f5c620ebec9f45cdfca597 100644
--- a/interface/web/themes/default/assets/javascripts/ispconfig.min.js
+++ b/interface/web/themes/default/assets/javascripts/ispconfig.min.js
@@ -1 +1 @@
-var ISPConfig={pageFormChanged:false,tabChangeWarningTxt:"",tabChangeDiscardTxt:"",tabChangeWarning:false,tabChangeDiscard:false,requestsRunning:0,indicatorCompleted:false,registeredHooks:new Array(),new_tpl_add_id:0,options:{useLoadIndicator:false,useComboBox:false},setOption:function(a,b){ISPConfig.options[a]=b},setOptions:function(a){$.extend(ISPConfig.options,a)},reportError:function(a){},registerHook:function(a,c){if(!ISPConfig.registeredHooks[a]){ISPConfig.registeredHooks[a]=new Array()}var b=ISPConfig.registeredHooks[a].length;ISPConfig.registeredHooks[a][b]=c},callHook:function(a,c){if(!ISPConfig.registeredHooks[a]){return}for(var b=0;b<ISPConfig.registeredHooks[a].length;b++){var d=ISPConfig.registeredHooks[a][b];d(a,c)}},resetFormChanged:function(){ISPConfig.pageFormChanged=false},showLoadIndicator:function(){document.body.style.cursor="wait";if(ISPConfig.options.useLoadIndicator==true){ISPConfig.requestsRunning+=1;if(ISPConfig.requestsRunning<2){var a=$("#ajaxloader");if(a.length<1){a=$('<div id="ajaxloader" style="display: none;"></div>');a.appendTo("body")}var b=$("#content");if(b.length<1){return}ISPConfig.indicatorCompleted=false;var d=b.offset().left+150;var c=b.offset().top+150;a.css({left:d,top:c}).fadeIn("fast",function(){ISPConfig.indicatorCompleted=true;if(ISPConfig.requestsRunning<1){$(this).fadeOut("fast",function(){$(this).hide()})}})}}},hideLoadIndicator:function(){document.body.style.cursor="";ISPConfig.requestsRunning-=1;if(ISPConfig.requestsRunning<1){ISPConfig.requestsRunning=0;if(ISPConfig.indicatorCompleted==true){$("#ajaxloader").fadeOut("fast",function(){$("#ajaxloader").hide()})}}},onAfterSideNavLoaded:function(){if(ISPConfig.options.useComboBox==true){$("#sidebar").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:true,allowClear:true})}},onAfterContentLoad:function(a,b){if(!b){b=""}else{b="&"+b}if(ISPConfig.options.useComboBox==true){$("#pageContent").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:true,allowClear:true,formatResult:function(c){if(c.id&&$(c.element).parent().hasClass("flags")){return'<span class="flags flag-'+c.id.toLowerCase()+'">'+c.text+"</span>"}else{return c.text}},formatSelection:function(c){if(c.id&&$(c.element).parent().hasClass("flags")){return'<span class="flags flag-'+c.id.toLowerCase()+'">'+c.text+"</span>"}else{return c.text}}}).on("change",function(c){if($("#pageForm .table #Filter").length>0){$("#pageForm .table #Filter").trigger("click")}})}$('input[data-input-element="date"]').datetimepicker({language:"en",todayHighlight:true,todayBtn:"linked",bootcssVer:3,fontAwesome:true,autoclose:true,minView:"month"});$('input[data-input-element="datetime"]').datetimepicker({language:"en",todayHighlight:true,todayBtn:"linked",bootcssVer:3,fontAwesome:true,autoclose:true});ISPConfig.callHook("onAfterContentLoad",{url:a,data:b})},submitForm:function(d,e,c){var b=arguments[3];if(!c){c=false}if(!c||window.confirm(c)){var a=$.ajax({type:"POST",url:e,data:$("#"+d).serialize(),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(g,i,f){if(b){alert(b)}if(f.responseText.indexOf("HEADER_REDIRECT:")>-1){var h=f.responseText.split(":");ISPConfig.loadContent(h[1])}else{if(f.responseText.indexOf("LOGIN_REDIRECT:")>-1){document.location.href="/index.php"}else{$("#pageContent").html(f.responseText);ISPConfig.onAfterContentLoad(e,$("#"+d).serialize());ISPConfig.pageFormChanged=false}}ISPConfig.hideLoadIndicator()},error:function(f,i,h){ISPConfig.hideLoadIndicator();var g=f.responseText.split(":");ISPConfig.reportError("Ajax Request was not successful. 111")}})}},submitUploadForm:function(c,d){var b=function(n){var h,j=n.contentWindow.document.body.innerHTML;try{h=JSON.parse(j)}catch(k){h=j}var o=$("<div></div>").html(h);var f="";var l=o.find("#OKMsg").html();if(l){f='<div id="OKMsg">'+l+"</div>"}var i=o.find("#errorMsg").html();if(i){f=f+'<div id="errorMsg">'+i+"</div>"}var m=o.find('input[name="_csrf_key"]').val();var g=o.find('input[name="_csrf_id"]').val();f=f+'<input type="hidden" name="_csrf_id" value="'+g+'" /><input type="hidden" name="_csrf_key" value="'+m+'" />';return f};var a="ajaxUploader-iframe-"+Math.round(new Date().getTime()/1000);$("body").append('<iframe width="0" height="0" style="display:none;" name="'+a+'" id="'+a+'"/>');$("#"+a).load(function(){var e=b(this);$("#errorMsg").remove();$("#OKMsg").remove();$('input[name="_csrf_key"]').remove();$('input[name="_csrf_id"]').remove();$('input[name="id"]').before(e);$(this).remove()});$('input[type="file"]').closest("form").attr({target:a,action:d}).submit()},capp:function(b,c){var a=$.ajax({type:"GET",url:"capp.php",data:"mod="+b+((c!=undefined)?"&redirect="+c:""),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(e,h,d){if(d.responseText!=""){if(d.responseText.indexOf("HEADER_REDIRECT:")>-1){var g=d.responseText.split(":");ISPConfig.loadContent(g[1])}else{if(d.responseText.indexOf("URL_REDIRECT:")>-1){var f=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+"URL_REDIRECT:".length);document.location.href=f}else{}}}ISPConfig.loadMenus();ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+b)}})},loadContent:function(b){var c=arguments[1];var a=$.ajax({type:"GET",url:b,data:(c?c:null),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(e,h,d){if(d.responseText.indexOf("HEADER_REDIRECT:")>-1){var g=d.responseText.split(":");ISPConfig.loadContent(g[1])}else{if(d.responseText.indexOf("URL_REDIRECT:")>-1){var f=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+"URL_REDIRECT:".length);document.location.href=f}else{$("#pageContent").html(d.responseText);ISPConfig.onAfterContentLoad(b,(c?c:null));ISPConfig.pageFormChanged=false}}ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 113")}})},loadContentRefresh:function(b){if($("#refreshinterval").val()>0){var a=$.ajax({type:"GET",url:b,data:"refresh="+document.getElementById("refreshinterval").value,dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#pageContent").html(c.responseText);ISPConfig.onAfterContentLoad(b,"refresh="+document.getElementById("refreshinterval").value);ISPConfig.pageFormChanged=false},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+b)}});setTimeout("ISPConfig.loadContentRefresh('"+b+"&refresh="+document.getElementById("refreshinterval").value+"')",document.getElementById("refreshinterval").value*1000*60)}},loadInitContent:function(){var a=$.ajax({type:"GET",url:"dashboard/dashboard.php",data:"",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(c,e,b){if(b.responseText.indexOf("HEADER_REDIRECT:")>-1){var d=b.responseText.split(":");ISPConfig.loadContent(d[1])}else{$("#pageContent").html(b.responseText);ISPConfig.onAfterContentLoad("dashboard/dashboard.php","");ISPConfig.pageFormChanged=false}ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 114")}});ISPConfig.loadMenus();ISPConfig.keepalive();setTimeout(function(){try{$("form#pageForm").find('input[name="username"]').focus()}catch(b){}},1000)},loadMenus:function(){var b=$.ajax({type:"GET",url:"nav.php",data:"nav=side",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#sidebar").html(c.responseText);ISPConfig.onAfterSideNavLoaded();ISPConfig.loadPushyMenu()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 115")}});var a=$.ajax({type:"GET",url:"nav.php",data:"nav=top",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#topnav-container").html(c.responseText);ISPConfig.loadPushyMenu()},error:function(c){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 116")}})},changeTab:function(c,e,d){if(ISPConfig.requestsRunning>0){return false}document.pageForm.next_tab.value=c;var b=$("form#pageForm").find('[name="id"]');var f=null;if(b.length>0){f=b.val()}if(ISPConfig.tabChangeDiscard=="y"&&!d){if((b.length<1||f)&&(ISPConfig.pageFormChanged==false||window.confirm(ISPConfig.tabChangeDiscardTxt))){var a=c;if(f){ISPConfig.loadContent(e,{next_tab:a,id:f})}else{ISPConfig.loadContent(e,{next_tab:a})}}else{return false}}else{if(f&&ISPConfig.tabChangeWarning=="y"&&ISPConfig.pageFormChanged==true){if(window.confirm(ISPConfig.tabChangeWarningTxt)){ISPConfig.submitForm("pageForm",e)}else{var a=c;if(f){ISPConfig.loadContent(e,{next_tab:a,id:f})}else{ISPConfig.loadContent(e,{next_tab:a})}}}else{ISPConfig.submitForm("pageForm",e)}}},confirm_action:function(b,a){if(window.confirm(a)){ISPConfig.loadContent(b)}},loadContentInto:function(b,c){var a=$.ajax({type:"GET",url:c,dataType:"html",beforeSend:function(){},success:function(e,f,d){$("#"+b).html(d.responseText)},error:function(){ISPConfig.reportError("Ajax Request was not successful. 118")}})},loadOptionInto:function(b,c,d){var a=$.ajax({type:"GET",url:c,dataType:"html",beforeSend:function(){},success:function(h,l,g){var j=g.responseText;var k=j.split("#");el=document.getElementById(b);el.innerHTML="";for(var f=0;f<k.length;++f){var e=document.createElement("option");e.appendChild(document.createTextNode(k[f]));e.value=k[f];el.appendChild(e)}if(typeof(d)!="undefined"){d(b,c)}},error:function(){ISPConfig.reportError("Ajax Request was not successful. 119")}})},keepalive:function(){var a=$.ajax({type:"GET",url:"keepalive.php",dataType:"html",success:function(c,d,b){setTimeout(function(){ISPConfig.keepalive()},1000000)},error:function(){ISPConfig.reportError("Session expired. Please login again.")}})},addAdditionalTemplate:function(){var e=$("#template_additional").val();var a=$("#tpl_add_select").val().split("|",2);var d=a[0];var f=a[1];if(d>0){var c=e.split("/");ISPConfig.new_tpl_add_id+=1;var b=$('<a href="#"></a>').attr("class","button icons16 icoDelete").click(function(g){g.preventDefault();ISPConfig.delAdditionalTemplate($(this).parent().attr("rel"))});c[c.length]="n"+ISPConfig.new_tpl_add_id+":"+d;$("<li>"+f+"</li>").attr("rel","n"+new_tpl_add_id).append(b).appendTo("#template_additional_list ul");$("#template_additional").val(c.join("/"));alert("additional template "+f+" added to customer")}else{alert("no additional template selcted")}},delAdditionalTemplate:function(d){var a=$("#template_additional").val();if(d){var l=$("#template_additional_list ul").find('li[rel="'+d+'"]').eq(0);var k=l.text();l.remove();var j=a.split("/");var b=new Array();for(var e=0;e<j.length;e++){var f=j[e].split(":",2);if(f.length==2&&f[0]==d){continue}b[b.length]=j[e]}$("#template_additional").val(b.join("/"));alert("additional template "+k+" deleted from customer")}else{if(a!=""){var c=document.getElementById("tpl_add_select").value.split("|",2);var h=c[0];var k=c[1];$("#template_additional_list ul").find("li:not([rel])").each(function(){var i=$(this).text();if(i==k){$(this).remove();return false}return this});var b=a;var g=new RegExp("(^|/)"+h+"(/|$)");b=b.replace(g,"");b=b.replace("//","/");$("#template_additional").val(b);alert("additional template "+k+" deleted from customer")}else{alert("no additional template selcted")}}}};$(document).on("change",function(a){var b=a.target.localName;if($("#pageForm .table #Filter").length>0&&b=="select"){a.preventDefault();$("#pageForm .table #Filter").trigger("click")}if(b=="select"||b=="input"||b=="textarea"){if($(a.target).hasClass("no-page-form-change")==false){ISPConfig.pageFormChanged=true}}});$(document).on("click","a[data-load-content],button[data-load-content]",function(b){b.preventDefault();$("html, body").animate({scrollTop:0},1000);var a=$(this).attr("data-load-content");if(!a){return this}ISPConfig.loadContent(a)});$(document).on("click","a[data-capp],button[data-capp]",function(b){b.preventDefault();$("html, body").animate({scrollTop:0},1000);var a=$(this).attr("data-capp");if(!a){return this}ISPConfig.capp(a)});$(document).on("click","a[data-submit-form],button[data-submit-form]",function(d){d.preventDefault();$("html, body").animate({scrollTop:0},1000);var b=$(this);var a=b.attr("data-form-action");var c=b.attr("data-submit-form");if(b.attr("data-form-upload")=="true"){ISPConfig.submitUploadForm(c,a)}else{ISPConfig.submitForm(c,a)}});$(document).bind("keypress",function(a){if(a.which=="13"&&$("#pageForm .table #Filter").length>0&&$(a.target).hasClass("ui-autocomplete-input")==false){a.preventDefault();$("#pageForm .table #Filter").trigger("click")}if(a.which=="13"&&$(".pnl_formsarea button.positive").length>0&&a.target.localName!="textarea"&&$(a.target).is(":input")){a.preventDefault();$(".pnl_formsarea button.positive:first").not("[disabled='disabled']").trigger("click")}});$(document).on("click","th[data-column]",function(h){var i=$(this);var d=i.attr("data-column");if(!d){return this}if($("#pageForm .table #Filter").length>0&&i.attr("data-sortable")!="false"){var c=$("#Filter");var a=c.attr("data-form-action");var f=c.attr("data-submit-form");var b=i.attr("data-ordered");var g="?";if(a.indexOf("?")>=0){g="&"}a=a+g+"orderby="+d;ISPConfig.submitForm(f,a);$(document).ajaxComplete(function(){var e=$('#pageForm .table th[data-column="'+d+'"]');e.parent().children("th[data-column]").removeAttr("data-ordered");if(b&&b=="asc"){e.attr("data-ordered","desc")}else{e.attr("data-ordered","asc")}})}});$(document).on("click",".addPlaceholder",function(){var a=$(this).text();var b=$(this).siblings(":input");b.insertAtCaret(a)});$(document).on("click",".addPlaceholderContent",function(){var b=$(this).find(".addPlaceholderContent").text();var a=$(this).siblings(":input");a.insertAtCaret(b)});$(document).on("ready",function(){$.fn.extend({insertAtCaret:function(a){return this.each(function(d){if(document.selection){this.focus();sel=document.selection.createRange();sel.text=a;this.focus()}else{if(this.selectionStart||this.selectionStart=="0"){var c=this.selectionStart;var b=this.selectionEnd;var e=this.scrollTop;this.value=this.value.substring(0,c)+a+this.value.substring(b,this.value.length);this.focus();this.selectionStart=c+a.length;this.selectionEnd=c+a.length;this.scrollTop=e}else{this.value+=a;this.focus()}}})}});$(".progress .progress-bar").css("width",function(){return $(this).attr("aria-valuenow")+"%"});ISPConfig.loadInitContent();$("#searchform").submit(function(a){a.preventDefault()});$("#pageForm").submit(function(a){if($("#pageForm .table #Filter").length>0){a.preventDefault()}});$.fn.setCursorPosition=function(c){var b=$(this).get(0);if(b.setSelectionRange){b.setSelectionRange(c,c)}else{if(b.createTextRange){var a=b.createTextRange();a.collapse(true);if(c<0){c=$(this).val().length+c}a.moveEnd("character",c);a.moveStart("character",c);a.select()}}};$.fn.getCursorPosition=function(){var c=0;var b=$(this).get(0);if(typeof b.selectionStart==="number"){c=b.selectionDirection=="backward"?b.selectionStart:b.selectionEnd}else{if(document.selection){this.focus();var a=document.selection.createRange();a.moveStart("character",-b.value.length);c=a.text.length}}return c}});
\ No newline at end of file
+var ISPConfig={pageFormChanged:false,tabChangeWarningTxt:"",tabChangeDiscardTxt:"",tabChangeWarning:false,tabChangeDiscard:false,requestsRunning:0,indicatorCompleted:false,registeredHooks:new Array(),new_tpl_add_id:0,options:{useLoadIndicator:false,useComboBox:false},setOption:function(a,b){ISPConfig.options[a]=b},setOptions:function(a){$.extend(ISPConfig.options,a)},reportError:function(a){},registerHook:function(a,c){if(!ISPConfig.registeredHooks[a]){ISPConfig.registeredHooks[a]=new Array()}var b=ISPConfig.registeredHooks[a].length;ISPConfig.registeredHooks[a][b]=c},callHook:function(a,c){if(!ISPConfig.registeredHooks[a]){return}for(var b=0;b<ISPConfig.registeredHooks[a].length;b++){var d=ISPConfig.registeredHooks[a][b];d(a,c)}},resetFormChanged:function(){ISPConfig.pageFormChanged=false},showLoadIndicator:function(){document.body.style.cursor="wait";if(ISPConfig.options.useLoadIndicator==true){ISPConfig.requestsRunning+=1;if(ISPConfig.requestsRunning<2){var a=$("#ajaxloader");if(a.length<1){a=$('<div id="ajaxloader" style="display: none;"></div>');a.appendTo("body")}var b=$("#content");if(b.length<1){return}ISPConfig.indicatorCompleted=false;var d=b.offset().left+150;var c=b.offset().top+150;a.css({left:d,top:c}).fadeIn("fast",function(){ISPConfig.indicatorCompleted=true;if(ISPConfig.requestsRunning<1){$(this).fadeOut("fast",function(){$(this).hide()})}})}}},hideLoadIndicator:function(){document.body.style.cursor="";ISPConfig.requestsRunning-=1;if(ISPConfig.requestsRunning<1){ISPConfig.requestsRunning=0;if(ISPConfig.indicatorCompleted==true){$("#ajaxloader").fadeOut("fast",function(){$("#ajaxloader").hide()})}}},onAfterSideNavLoaded:function(){if(ISPConfig.options.useComboBox==true){$("#sidebar").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:true,allowClear:true})}},onAfterContentLoad:function(a,b){if(!b){b=""}else{b="&"+b}if(ISPConfig.options.useComboBox==true){$("#pageContent").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:true,allowClear:true,formatResult:function(c){if(c.id&&$(c.element).parent().hasClass("flags")){return'<span class="flags flag-'+c.id.toLowerCase()+'">'+c.text+"</span>"}else{return c.text}},formatSelection:function(c){if(c.id&&$(c.element).parent().hasClass("flags")){return'<span class="flags flag-'+c.id.toLowerCase()+'">'+c.text+"</span>"}else{return c.text}}}).on("change",function(c){if($("#pageForm .table #Filter").length>0){$("#pageForm .table #Filter").trigger("click")}})}$('input[data-input-element="date"]').datetimepicker({language:"en",todayHighlight:true,todayBtn:"linked",bootcssVer:3,fontAwesome:true,autoclose:true,minView:"month"});$('input[data-input-element="datetime"]').datetimepicker({language:"en",todayHighlight:true,todayBtn:"linked",bootcssVer:3,fontAwesome:true,autoclose:true});ISPConfig.callHook("onAfterContentLoad",{url:a,data:b})},submitForm:function(d,e,c){var b=arguments[3];if(!c){c=false}if(!c||window.confirm(c)){var a=$.ajax({type:"POST",url:e,data:$("#"+d).serialize(),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(g,i,f){if(b){alert(b)}if(f.responseText.indexOf("HEADER_REDIRECT:")>-1){var h=f.responseText.split(":");ISPConfig.loadContent(h[1])}else{if(f.responseText.indexOf("LOGIN_REDIRECT:")>-1){document.location.href="/index.php"}else{$("#pageContent").html(f.responseText);ISPConfig.onAfterContentLoad(e,$("#"+d).serialize());ISPConfig.pageFormChanged=false}}ISPConfig.hideLoadIndicator()},error:function(f,i,h){ISPConfig.hideLoadIndicator();var g=f.responseText.split(":");ISPConfig.reportError("Ajax Request was not successful. 111")}})}},submitUploadForm:function(c,d){var b=function(n){var h,j=n.contentWindow.document.body.innerHTML;try{h=JSON.parse(j)}catch(k){h=j}var o=$("<div></div>").html(h);var f="";var l=o.find("#OKMsg").html();if(l){f='<div id="OKMsg">'+l+"</div>"}var i=o.find("#errorMsg").html();if(i){f=f+'<div id="errorMsg">'+i+"</div>"}var m=o.find('input[name="_csrf_key"]').val();var g=o.find('input[name="_csrf_id"]').val();f=f+'<input type="hidden" name="_csrf_id" value="'+g+'" /><input type="hidden" name="_csrf_key" value="'+m+'" />';return f};var a="ajaxUploader-iframe-"+Math.round(new Date().getTime()/1000);$("body").append('<iframe width="0" height="0" style="display:none;" name="'+a+'" id="'+a+'"/>');$("#"+a).load(function(){var e=b(this);$("#errorMsg").remove();$("#OKMsg").remove();$('input[name="_csrf_key"]').remove();$('input[name="_csrf_id"]').remove();$('input[name="id"]').before(e);$(this).remove()});$('input[type="file"]').closest("form").attr({target:a,action:d}).submit()},capp:function(b,c){var a=$.ajax({type:"GET",url:"capp.php",data:"mod="+b+((c!=undefined)?"&redirect="+c:""),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(e,h,d){if(d.responseText!=""){if(d.responseText.indexOf("HEADER_REDIRECT:")>-1){var g=d.responseText.split(":");ISPConfig.loadContent(g[1])}else{if(d.responseText.indexOf("URL_REDIRECT:")>-1){var f=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+"URL_REDIRECT:".length);document.location.href=f}else{}}}ISPConfig.loadMenus();ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+b)}})},loadContent:function(b){var c=arguments[1];var a=$.ajax({type:"GET",url:b,data:(c?c:null),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(e,h,d){if(d.responseText.indexOf("HEADER_REDIRECT:")>-1){var g=d.responseText.split(":");ISPConfig.loadContent(g[1])}else{if(d.responseText.indexOf("URL_REDIRECT:")>-1){var f=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+"URL_REDIRECT:".length);document.location.href=f}else{$("#pageContent").html(d.responseText);ISPConfig.onAfterContentLoad(b,(c?c:null));ISPConfig.pageFormChanged=false}}ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 113")}})},loadContentRefresh:function(b){if($("#refreshinterval").val()>0){var a=$.ajax({type:"GET",url:b,data:"refresh="+document.getElementById("refreshinterval").value,dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#pageContent").html(c.responseText);ISPConfig.onAfterContentLoad(b,"refresh="+document.getElementById("refreshinterval").value);ISPConfig.pageFormChanged=false},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+b)}});setTimeout("ISPConfig.loadContentRefresh('"+b+"&refresh="+document.getElementById("refreshinterval").value+"')",document.getElementById("refreshinterval").value*1000*60)}},loadInitContent:function(){var a=$.ajax({type:"GET",url:"dashboard/dashboard.php",data:"",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(c,e,b){if(b.responseText.indexOf("HEADER_REDIRECT:")>-1){var d=b.responseText.split(":");ISPConfig.loadContent(d[1])}else{$("#pageContent").html(b.responseText);ISPConfig.onAfterContentLoad("dashboard/dashboard.php","");ISPConfig.pageFormChanged=false}ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 114")}});ISPConfig.loadMenus();ISPConfig.keepalive();setTimeout(function(){try{$("form#pageForm").find('input[name="username"]').focus()}catch(b){}},1000)},loadMenus:function(){var b=$.ajax({type:"GET",url:"nav.php",data:"nav=side",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#sidebar").html(c.responseText);ISPConfig.onAfterSideNavLoaded();ISPConfig.loadPushyMenu()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 115")}});var a=$.ajax({type:"GET",url:"nav.php",data:"nav=top",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#topnav-container").html(c.responseText);ISPConfig.loadPushyMenu()},error:function(c){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 116")}})},changeTab:function(c,e,d){if(ISPConfig.requestsRunning>0){return false}document.pageForm.next_tab.value=c;var b=$("form#pageForm").find('[name="id"]');var f=null;if(b.length>0){f=b.val()}if(ISPConfig.tabChangeDiscard=="y"&&!d){if((b.length<1||f)&&(ISPConfig.pageFormChanged==false||window.confirm(ISPConfig.tabChangeDiscardTxt))){var a=c;if(f){ISPConfig.loadContent(e,{next_tab:a,id:f})}else{ISPConfig.loadContent(e,{next_tab:a})}}else{return false}}else{if(f&&ISPConfig.tabChangeWarning=="y"&&ISPConfig.pageFormChanged==true){if(window.confirm(ISPConfig.tabChangeWarningTxt)){ISPConfig.submitForm("pageForm",e)}else{var a=c;if(f){ISPConfig.loadContent(e,{next_tab:a,id:f})}else{ISPConfig.loadContent(e,{next_tab:a})}}}else{ISPConfig.submitForm("pageForm",e)}}},confirm_action:function(b,a){if(window.confirm(a)){ISPConfig.loadContent(b)}},loadContentInto:function(b,c){var a=$.ajax({type:"GET",url:c,dataType:"html",beforeSend:function(){},success:function(e,f,d){$("#"+b).html(d.responseText)},error:function(){ISPConfig.reportError("Ajax Request was not successful. 118")}})},loadOptionInto:function(b,c,d){var a=$.ajax({type:"GET",url:c,dataType:"html",beforeSend:function(){},success:function(h,l,g){var j=g.responseText;var k=j.split("#");el=document.getElementById(b);el.innerHTML="";for(var f=0;f<k.length;++f){var e=document.createElement("option");e.appendChild(document.createTextNode(k[f]));e.value=k[f];el.appendChild(e)}if(typeof(d)!="undefined"){d(b,c)}},error:function(){ISPConfig.reportError("Ajax Request was not successful. 119")}})},keepalive:function(){var a=$.ajax({type:"GET",url:"keepalive.php",dataType:"html",success:function(c,d,b){setTimeout(function(){ISPConfig.keepalive()},1000000)},error:function(){ISPConfig.reportError("Session expired. Please login again.")}})},addAdditionalTemplate:function(){var e=$("#template_additional").val();var a=$("#tpl_add_select").val().split("|",2);var d=a[0];var f=a[1];if(d>0){var c=e.split("/");ISPConfig.new_tpl_add_id+=1;var b=$('<a href="#"></a>').attr("class","button icons16 icoDelete").click(function(g){g.preventDefault();ISPConfig.delAdditionalTemplate($(this).parent().attr("rel"))});c[c.length]="n"+ISPConfig.new_tpl_add_id+":"+d;$("<li>"+f+"</li>").attr("rel","n"+new_tpl_add_id).append(b).appendTo("#template_additional_list ul");$("#template_additional").val(c.join("/"));alert("additional template "+f+" added to customer")}else{alert("no additional template selcted")}},delAdditionalTemplate:function(d){var a=$("#template_additional").val();if(d){var l=$("#template_additional_list ul").find('li[rel="'+d+'"]').eq(0);var k=l.text();l.remove();var j=a.split("/");var b=new Array();for(var e=0;e<j.length;e++){var f=j[e].split(":",2);if(f.length==2&&f[0]==d){continue}b[b.length]=j[e]}$("#template_additional").val(b.join("/"));alert("additional template "+k+" deleted from customer")}else{if(a!=""){var c=document.getElementById("tpl_add_select").value.split("|",2);var h=c[0];var k=c[1];$("#template_additional_list ul").find("li:not([rel])").each(function(){var i=$(this).text();if(i==k){$(this).remove();return false}return this});var b=a;var g=new RegExp("(^|/)"+h+"(/|$)");b=b.replace(g,"");b=b.replace("//","/");$("#template_additional").val(b);alert("additional template "+k+" deleted from customer")}else{alert("no additional template selcted")}}}};$(document).on("change",function(a){var b=a.target.localName;if($("#pageForm .table #Filter").length>0&&b=="select"){a.preventDefault();$("#pageForm .table #Filter").trigger("click")}if(b=="select"||b=="input"||b=="textarea"){if($(a.target).hasClass("no-page-form-change")==false){ISPConfig.pageFormChanged=true}}});$(document).on("click","a[data-load-content],button[data-load-content]",function(b){b.preventDefault();$("html, body").animate({scrollTop:0},1000);var a=$(this).attr("data-load-content");if(!a){return this}ISPConfig.loadContent(a)});$(document).on("click","a[data-capp],button[data-capp]",function(b){b.preventDefault();$("html, body").animate({scrollTop:0},1000);var a=$(this).attr("data-capp");if(!a){return this}ISPConfig.capp(a)});$(document).on("click","a[data-submit-form],button[data-submit-form]",function(d){d.preventDefault();$("html, body").animate({scrollTop:0},1000);var b=$(this);var a=b.attr("data-form-action");var c=b.attr("data-submit-form");if(b.attr("data-form-upload")=="true"){ISPConfig.submitUploadForm(c,a)}else{ISPConfig.submitForm(c,a)}});$(document).bind("keypress",function(a){if(a.which=="13"&&$("#pageForm .table #Filter").length>0&&$(a.target).hasClass("ui-autocomplete-input")==false){a.preventDefault();$("#pageForm .table #Filter").trigger("click")}if(a.which=="13"&&$(".tab-content button.formbutton-success").length>0&&a.target.localName!="textarea"&&$(a.target).is(":input")){a.preventDefault();$(".tab-content button.formbutton-success").not("[disabled='disabled']").trigger("click")}});$(document).on("click","th[data-column]",function(h){var i=$(this);var d=i.attr("data-column");if(!d){return this}if($("#pageForm .table #Filter").length>0&&i.attr("data-sortable")!="false"){var c=$("#Filter");var a=c.attr("data-form-action");var f=c.attr("data-submit-form");var b=i.attr("data-ordered");var g="?";if(a.indexOf("?")>=0){g="&"}a=a+g+"orderby="+d;ISPConfig.submitForm(f,a);$(document).ajaxComplete(function(){var e=$('#pageForm .table th[data-column="'+d+'"]');e.parent().children("th[data-column]").removeAttr("data-ordered");if(b&&b=="asc"){e.attr("data-ordered","desc")}else{e.attr("data-ordered","asc")}})}});$(document).on("click",".addPlaceholder",function(){var a=$(this).text();var b=$(this).siblings(":input");b.insertAtCaret(a)});$(document).on("click",".addPlaceholderContent",function(){var b=$(this).find(".addPlaceholderContent").text();var a=$(this).siblings(":input");a.insertAtCaret(b)});$(document).on("click","[data-check-fields] > input[type='checkbox']",function(){if($(this).is(":checked")){var c=$(this).parent().attr("data-check-fields");var b=c.split(/,/);for(var a=0;a<b.length;a++){var d=b[a];$('input[type="checkbox"][name="'+d+'"]').prop("checked",true)}}});$(document).on("click","[data-uncheck-fields] > input[type='checkbox']",function(){if($(this).is(":checked")==false){var c=$(this).parent().attr("data-uncheck-fields");var b=c.split(/,/);for(var a=0;a<b.length;a++){var d=b[a];$('input[type="checkbox"][name="'+d+'"]').prop("checked",false)}}});$(document).on("ready",function(){$.fn.extend({insertAtCaret:function(a){return this.each(function(d){if(document.selection){this.focus();sel=document.selection.createRange();sel.text=a;this.focus()}else{if(this.selectionStart||this.selectionStart=="0"){var c=this.selectionStart;var b=this.selectionEnd;var e=this.scrollTop;this.value=this.value.substring(0,c)+a+this.value.substring(b,this.value.length);this.focus();this.selectionStart=c+a.length;this.selectionEnd=c+a.length;this.scrollTop=e}else{this.value+=a;this.focus()}}})}});$(".progress .progress-bar").css("width",function(){return $(this).attr("aria-valuenow")+"%"});ISPConfig.loadInitContent();$("#searchform").submit(function(a){a.preventDefault()});$("#pageForm").submit(function(a){if($("#pageForm .table #Filter").length>0){a.preventDefault()}});$.fn.setCursorPosition=function(c){var b=$(this).get(0);if(b.setSelectionRange){b.setSelectionRange(c,c)}else{if(b.createTextRange){var a=b.createTextRange();a.collapse(true);if(c<0){c=$(this).val().length+c}a.moveEnd("character",c);a.moveStart("character",c);a.select()}}};$.fn.getCursorPosition=function(){var c=0;var b=$(this).get(0);if(typeof b.selectionStart==="number"){c=b.selectionDirection=="backward"?b.selectionStart:b.selectionEnd}else{if(document.selection){this.focus();var a=document.selection.createRange();a.moveStart("character",-b.value.length);c=a.text.length}}return c}});
\ No newline at end of file
diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master
index 97862c5b5a4ab03e108ec118ab572f090f1a50ee..67f1ee0ed452a37b373be1706d070bfa1037c31e 100644
--- a/server/conf/nginx_vhost.conf.master
+++ b/server/conf/nginx_vhost.conf.master
@@ -263,6 +263,13 @@ server {
         }
 </tmpl_if>
 
+location /\.well-known/acme-challenge {
+	   root /usr/local/ispconfig/interface/acme/.well-known/acme-challenge;
+	   index index.html index.htm;
+	   try_files $uri =404;
+}
+
+
 <tmpl_loop name="basic_auth_locations">
         location <tmpl_var name='htpasswd_location'> { ##merge##
                 auth_basic "Members Only";
@@ -293,6 +300,13 @@ server {
 </tmpl_if>
         
         server_name <tmpl_var name='rewrite_domain'>;
+
+location /\.well-known/acme-challenge {
+	   root /usr/local/ispconfig/interface/acme-challenge;
+	   index index.html index.htm;
+	   try_files $uri =404;
+}
+
 <tmpl_if name='alias_seo_redirects2'>
 <tmpl_loop name="alias_seo_redirects2">
         if ($http_host <tmpl_var name='alias_seo_redirect_operator'> "<tmpl_var name='alias_seo_redirect_origin_domain'>") {
diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master
index 3e7ec811da95967b9282316172b4ff6d1ac2e283..23144aafa072c688e53d60c607d9eb3f3c3cf923 100644
--- a/server/conf/vhost.conf.master
+++ b/server/conf/vhost.conf.master
@@ -395,16 +395,24 @@
 
 <tmpl_if name="rewrite_enabled">
 		RewriteEngine on
+<tmpl_if name='apache_version' op='>' value='2.2' format='version'>
+		RewriteEngine on
+		RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/
+		RewriteRule ^ - [END]
+</tmpl_if>
 <tmpl_if name='seo_redirect_enabled'>
 		RewriteCond %{HTTP_HOST} <tmpl_var name='seo_redirect_operator'>^<tmpl_var name='seo_redirect_origin_domain'>$ [NC]
+		<tmpl_if name='apache_version' op='<' value='2.4' format='version'>RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/</tmpl_if>
 		RewriteRule ^(.*)$ http<tmpl_if name='ssl_enabled'>s</tmpl_if>://<tmpl_var name='seo_redirect_target_domain'>$1 [R=301,NE,L]
 </tmpl_if>
 <tmpl_loop name="alias_seo_redirects">
 		RewriteCond %{HTTP_HOST} <tmpl_var name='alias_seo_redirect_operator'>^<tmpl_var name='alias_seo_redirect_origin_domain'>$ [NC]
+		<tmpl_if name='apache_version' op='<' value='2.4' format='version'>RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/</tmpl_if>
 		RewriteRule ^(.*)$ http<tmpl_if name='ssl_enabled'>s</tmpl_if>://<tmpl_var name='alias_seo_redirect_target_domain'>$1 [R=301,NE,L]
 </tmpl_loop>
 <tmpl_loop name="redirects">
 		RewriteCond %{HTTP_HOST}   <tmpl_var name='rewrite_domain'>$ [NC]
+		<tmpl_if name='apache_version' op='<' value='2.4' format='version'>RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/</tmpl_if>
 <tmpl_if name="rewrite_is_url" op="==" value="n">
 		RewriteCond %{REQUEST_URI} !^/webdav/
 		RewriteCond %{REQUEST_URI} !^/php5-fcgi/
@@ -418,6 +426,7 @@
 <tmpl_else>
 <tmpl_if name='rewrite_to_https' op='==' value='y'>
         RewriteCond %{HTTPS} off
+        <tmpl_if name='apache_version' op='<' value='2.4' format='version'>RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/</tmpl_if>
         RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 </tmpl_if>
 </tmpl_if>
diff --git a/server/lib/classes/cron.d/900-letsencrypt.inc.php b/server/lib/classes/cron.d/900-letsencrypt.inc.php
index 4ee72bd92d46dd02006b80ece1e6d430435590d3..f00adc21945d17dffe98451dd30866641e01772d 100644
--- a/server/lib/classes/cron.d/900-letsencrypt.inc.php
+++ b/server/lib/classes/cron.d/900-letsencrypt.inc.php
@@ -36,8 +36,8 @@ class cronjob_letsencrypt extends cronjob {
 	public function onRunJob() {
 		global $app, $conf;
 
-		if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt-renewer")) {
-			exec('/root/.local/share/letsencrypt/bin/letsencrypt-renewer');
+		if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt")) {
+			exec('/root/.local/share/letsencrypt/bin/letsencrypt renew');
 		}
 		
 		parent::onRunJob();
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 76528c23284dd5441973a43d17d1291811dc1691..52a86870a258b64bcc9efbe204b3a6167876612b 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -1121,6 +1121,7 @@ class apache2_plugin {
 			|| ($data['old']['domain'] != $data['new']['domain']) // we have domain update
 			|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
 			|| ($data['new']['type'] == 'subdomain') // we have new or update on subdomain
+			|| ($data['old']['type'] == 'alias' || $data['new']['type'] == 'alias') // we have new or update on aliasdomain
 		)) {
 			if(substr($domain, 0, 2) === '*.') {
 				// wildcard domain not yet supported by letsencrypt!
@@ -1135,6 +1136,7 @@ class apache2_plugin {
 			$temp_domains = array();
 			$lddomain = $domain;
 			$subdomains = null;
+			$aliasdomains = null;
 
 			//* be sure to have good domain
 			if($data['new']['subdomain'] == "www" OR $data['new']['subdomain'] == "*") {
@@ -1148,6 +1150,17 @@ class apache2_plugin {
 					$temp_domains[] = $subdomain['domain'];
 				}
 			}
+			
+			//* then, add alias domain if we have
+			$aliasdomains = $app->db->queryAllRecords('SELECT domain,subdomain FROM web_domain WHERE parent_domain_id = '.intval($data['new']['domain_id'])." AND active = 'y' AND type = 'alias'");
+			if(is_array($aliasdomains)) {
+				foreach($aliasdomains as $aliasdomain) {
+					$temp_domains[] = $aliasdomain['domain'];
+					if(isset($aliasdomain['subdomain']) && ! empty($aliasdomain['subdomain'])) {
+						$temp_domains[] = $aliasdomain['subdomain'] . "." . $aliasdomain['domain'];
+					}
+				}
+			}
 
 			// prevent duplicate
 			$temp_domains = array_unique($temp_domains);
@@ -1170,22 +1183,8 @@ class apache2_plugin {
 			if(!file_exists($crt_tmp_file) && !file_exists($key_tmp_file)) {
 				$app->log("Create Let's Encrypt SSL Cert for: $domain", LOGLEVEL_DEBUG);
 
-				if(is_dir($webroot . "/.well-known/acme-challenge/")) {
-					$app->log("Remove old challenge directory", LOGLEVEL_DEBUG);
-					$this->_exec("rm -rf " . $webroot . "/.well-known/acme-challenge/");
-				}
-
-				$app->log("Create challenge directory", LOGLEVEL_DEBUG);
-				$app->system->mkdirpath($webroot . "/.well-known/");
-				$app->system->chown($webroot . "/.well-known/", $data['new']['system_user']);
-				$app->system->chgrp($webroot . "/.well-known/", $data['new']['system_group']);
-				$app->system->mkdirpath($webroot . "/.well-known/acme-challenge");
-				$app->system->chown($webroot . "/.well-known/acme-challenge/", $data['new']['system_user']);
-				$app->system->chgrp($webroot . "/.well-known/acme-challenge/", $data['new']['system_group']);
-				$app->system->chmod($webroot . "/.well-known/acme-challenge", "g+s");
-				
 				if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt")) {
-					$this->_exec("/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path " . escapeshellarg($webroot));
+					$this->_exec("/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
 				}
 			};
 
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index d351bb27301a5bacbc116f6587e99000d024b179..33d55370de0fcfdbeb392895c18b3c11dd01d8e8 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -1238,6 +1238,7 @@ class nginx_plugin {
 			|| ($data['old']['domain'] != $data['new']['domain']) // we have domain update
 			|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
 			|| ($data['new']['type'] == 'subdomain') // we have new or update on subdomain
+			|| ($data['old']['type'] == 'alias' || $data['new']['type'] == 'alias') // we have new or update on alias domain
 		)) {
 
 			//* be sure to have good domain
@@ -1254,6 +1255,7 @@ class nginx_plugin {
 			$temp_domains = array();
 			$lddomain = $domain;
 			$subdomains = null;
+			$aliasdomains = null;
 
  			//* be sure to have good domain
  			if($data['new']['subdomain'] == "www" OR $data['new']['subdomain'] == "*") {
@@ -1267,7 +1269,18 @@ class nginx_plugin {
 					$temp_domains[] = $subdomain['domain'];
 				}
  			}
- 
+
+			//* then, add alias domain if we have
+			$aliasdomains = $app->db->queryAllRecords('SELECT domain,subdomain FROM web_domain WHERE parent_domain_id = '.intval($data['new']['domain_id'])." AND active = 'y' AND type = 'alias'");
+			if(is_array($aliasdomains)) {
+				foreach($aliasdomains as $aliasdomain) {
+					$temp_domains[] = $aliasdomain['domain'];
+					if(isset($aliasdomain['subdomain']) && ! empty($aliasdomain['subdomain'])) {
+						$temp_domains[] = $aliasdomain['subdomain'] . "." . $aliasdomain['domain'];
+					}
+				}
+			}
+
 			// prevent duplicate
 			$temp_domains = array_unique($temp_domains);
 
@@ -1290,31 +1303,17 @@ class nginx_plugin {
 			if(!file_exists($crt_tmp_file) && !file_exists($key_tmp_file)) {
 				$app->log("Create Let's Encrypt SSL Cert for: $domain", LOGLEVEL_DEBUG);
 
-				if(is_dir($webroot . "/.well-known/acme-challenge/")) {
-					$app->log("Remove old challenge directory", LOGLEVEL_DEBUG);
-					$this->_exec("rm -rf " . $webroot . "/.well-known/acme-challenge/");
-				}
-
-				$app->log("Create challenge directory", LOGLEVEL_DEBUG);
-				$app->system->mkdirpath($webroot . "/.well-known/");
-				$app->system->chown($webroot . "/.well-known/", $data['new']['system_user']);
-				$app->system->chgrp($webroot . "/.well-known/", $data['new']['system_group']);
-				$app->system->mkdirpath($webroot . "/.well-known/acme-challenge");
-				$app->system->chown($webroot . "/.well-known/acme-challenge/", $data['new']['system_user']);
-				$app->system->chgrp($webroot . "/.well-known/acme-challenge/", $data['new']['system_group']);
-				$app->system->chmod($webroot . "/.well-known/acme-challenge", "g+s");
-				
 				if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt")) {
-					$this->_exec("/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path " . escapeshellarg($webroot));
+					$this->_exec("/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
 				}
 			};
 
 			//* check is been correctly created
 			if(file_exists($crt_tmp_file) OR file_exists($key_tmp_file)) {
-					$date = date("YmdHis");
-//* TODO: check if is a symlink, if target same keep it, either remove it
+				$date = date("YmdHis");
+				//* TODO: check if is a symlink, if target same keep it, either remove it
 				if(is_file($key_file)) {
-					$app->system->copy($key_file, $key_file.'.old'.$date);
+					$app->system->copy($key_file, $key_file.'.old.'.$date);
 					$app->system->chmod($key_file.'.old.'.$date, 0400);
 					$app->system->unlink($key_file);
 				}