diff --git a/install/tpl/debian6_dovecot.conf.master b/install/tpl/debian6_dovecot.conf.master
index 4286689cd448ef52004801a89570730b3ac36384..a112712690d663db76537911af3f9e04e9ced29e 100644
--- a/install/tpl/debian6_dovecot.conf.master
+++ b/install/tpl/debian6_dovecot.conf.master
@@ -57,7 +57,13 @@ plugin {
   # the maildir quota does not need to be set.
   # You do not need: quota = maildir
 
+  # no longer needed, as 'sieve' is in userdb extra fields:
   sieve=/var/vmail/%d/%n/.sieve
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
+  sieve_max_redirects = 25
 }
 
 
diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master
index 973ada2f997191b2f2e401ffe2c1123fe69b1068..c82ac59a383e99985e80e651c70f2df5705ead0c 100644
--- a/install/tpl/debian6_dovecot2.conf.master
+++ b/install/tpl/debian6_dovecot2.conf.master
@@ -24,7 +24,13 @@ userdb {
 }
 plugin {
   quota = dict:user::file:/var/vmail/%d/%n/.quotausage
+
+  # no longer needed, as 'sieve' is in userdb extra fields:
   sieve=/var/vmail/%d/%n/.sieve
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
   sieve_max_redirects = 25
 }
 service auth {
diff --git a/install/tpl/debian_dovecot.conf.master b/install/tpl/debian_dovecot.conf.master
index 8d6022502f042fee8fd22d0d2c3ec92da559d64c..f91959a1f5fd3958cef2ebbc24fbdf7478f4fe7c 100644
--- a/install/tpl/debian_dovecot.conf.master
+++ b/install/tpl/debian_dovecot.conf.master
@@ -682,7 +682,7 @@ protocol managesieve {
   # the sieve storage directory. This must match the SIEVE setting used by
   # deliver (refer to http://wiki.dovecot.org/LDA/Sieve#location for more
   # info). Variable substitution with % is recognized.
-  sieve=~/.dovecot.sieve
+  sieve=~/.sieve
 
   # This specifies the path to the directory where the uploaded scripts must
   # be stored. In terms of '%' variable substitution it is identical to
@@ -1144,4 +1144,9 @@ plugin {
   # they're moved to a 3rd namespace. The mails won't be counted in quota,
   # and they're not deleted automatically (use a cronjob or something).
   #lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
+  sieve_max_redirects = 25
 }
diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master
index d4fc7ebd0f2a481e6407ae856b9c8d9192639db9..25c586118c26c7ab2e8106c627f0d8a4edaf5f4f 100644
--- a/install/tpl/debian_dovecot2.conf.master
+++ b/install/tpl/debian_dovecot2.conf.master
@@ -23,7 +23,13 @@ userdb {
 }
 plugin {
   quota = dict:user::file:/var/vmail/%d/%n/.quotausage
+
+  # no longer needed, as 'sieve' is in userdb extra fields:
   sieve=/var/vmail/%d/%n/.sieve
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
   sieve_max_redirects = 25
 }
 service auth {
diff --git a/install/tpl/fedora_dovecot.conf.master b/install/tpl/fedora_dovecot.conf.master
index cfac8564141d0d4dc8b30564a34d7707fa6a97f6..e6879549864e944d94620856be7e12e266ed0381 100644
--- a/install/tpl/fedora_dovecot.conf.master
+++ b/install/tpl/fedora_dovecot.conf.master
@@ -1300,11 +1300,16 @@ plugin {
   # 
   # Location of the active script. When ManageSieve is used this is actually 
   # a symlink pointing to the active script in the sieve storage directory. 
-  #sieve=~/.dovecot.sieve
-  #
+  sieve=~/.sieve
+
   # The path to the directory where the personal Sieve scripts are stored. For 
   # ManageSieve this is where the uploaded scripts are stored.
   sieve_dir=~/sieve
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
+  sieve_max_redirects = 25
 }
 
 # Config files can also be included. deliver doesn't support them currently.
diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master
index dbef641fdf966867a8059570133848bd2e0c5434..9fd5ed92c28334b7e4733e5db0bf127b24f0b2b1 100644
--- a/install/tpl/fedora_dovecot2.conf.master
+++ b/install/tpl/fedora_dovecot2.conf.master
@@ -21,7 +21,14 @@ userdb {
 }
 plugin {
   quota = dict:user::file:/var/vmail/%d/%n/.quotausage
+
+  # no longer needed, as 'sieve' is in userdb extra fields:
   sieve=/var/vmail/%d/%n/.sieve
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
+  sieve_max_redirects = 25
 }
 service auth {
   unix_listener /var/spool/postfix/private/auth {
diff --git a/install/tpl/opensuse_dovecot.conf.master b/install/tpl/opensuse_dovecot.conf.master
index 9d345fa911af48198caf1d322b32ca460d99be59..1eacf4c3a31c1e35562a19477d641b2ef442a2c4 100644
--- a/install/tpl/opensuse_dovecot.conf.master
+++ b/install/tpl/opensuse_dovecot.conf.master
@@ -1274,11 +1274,16 @@ plugin {
   # 
   # Location of the active script. When ManageSieve is used this is actually 
   # a symlink pointing to the active script in the sieve storage directory. 
-  sieve=~/.dovecot.sieve
-  #
+  sieve=~/.sieve
+
   # The path to the directory where the personal Sieve scripts are stored. For 
   # ManageSieve this is where the uploaded scripts are stored.
   sieve_dir=~/sieve
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
+  sieve_max_redirects = 25
 }
 
 # Config files can also be included. deliver doesn't support them currently.
diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master
index a1bdfa1f91ccbf09e906f22e1a8fa5b87e7750c4..94e658aecc3c16ddd04bee8c75bbcabd81441ff0 100644
--- a/install/tpl/opensuse_dovecot2.conf.master
+++ b/install/tpl/opensuse_dovecot2.conf.master
@@ -21,7 +21,14 @@ userdb {
 }
 plugin {
   quota = dict:user::file:/var/vmail/%d/%n/.quotausage
+
+  # no longer needed, as 'sieve' is in userdb extra fields:
   sieve=/var/vmail/%d/%n/.sieve
+
+  sieve_after=/var/vmail/%d/%n/.ispconfig.sieve
+  sieve_max_script_size = 2M
+  sieve_max_actions = 100
+  sieve_max_redirects = 25
 }
 service auth {
   unix_listener /var/spool/postfix/private/auth {
diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master
index 13c08dd56b18987573c18fd1fe1aee432db17e44..f72cd11d1f68539269e262e727db68bfb79fd1f9 100644
--- a/server/conf/sieve_filter.master
+++ b/server/conf/sieve_filter.master
@@ -1,3 +1,6 @@
+# This sieve script is generated by ISPConfig, any changes made will be overwritten.
+# You can create and activate a per-user sieve script (manually or via managesieve),
+# which will execute before this.
 require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"];
 
 <tmpl_if name="cc">
@@ -36,4 +39,4 @@ vacation  :days 1
   # :addresses ["test@test.int", "till@test.int"]
   <tmpl_var name='addresses'>
   "<tmpl_var name='autoresponder_text'>";
-</tmpl_if>
\ No newline at end of file
+</tmpl_if>
diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master
index 5244693102ce0778964ce2e25b61c377b1b2bf8a..edd4060b9f8012ad874a6e0aafcdac30187cba59 100644
--- a/server/conf/sieve_filter_1.2.master
+++ b/server/conf/sieve_filter_1.2.master
@@ -1,3 +1,6 @@
+# This sieve script is generated by ISPConfig, any changes made will be overwritten.
+# You can create and activate a per-user sieve script (manually or via managesieve),
+# which will execute before this.
 require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"];
 
 <tmpl_if name="move_junk" op="==" value="y">
diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php
index 2c16601f5024d8d74242b4fb25b29f43e13b918c..9c9939655c7dd3cdc802ee1a44521d385eb86845 100644
--- a/server/plugins-available/maildeliver_plugin.inc.php
+++ b/server/plugins-available/maildeliver_plugin.inc.php
@@ -98,9 +98,16 @@ class maildeliver_plugin {
 			$app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG);
 
 			$sieve_file = $data["new"]["maildir"].'/.sieve';
-			$sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve';
-			if(is_file($sieve_file)) unlink($sieve_file)  or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN);
+			$sieve_file_svbin = $data["new"]["maildir"].'/.sieve.svbin';
+			$old_sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve';
+			$sieve_file_isp = $data["new"]["maildir"].'/.ispconfig.sieve';
+			$sieve_file_isp_svbin = $data["new"]["maildir"].'/.ispconfig.svbin';
+			if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp)  or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN);
+			// cleanup .sieve file if it is now a broken link
+			if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file)  or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN);
+			if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin)  or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN);
 			if(is_file($sieve_file_isp)) unlink($sieve_file_isp)  or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN);
+			if(is_file($sieve_file_isp_svbin)) unlink($sieve_file_isp_svbin)  or $app->log("Unable to delete file: $sieve_file_isp_svbin", LOGLEVEL_WARN);
 			$app->load('tpl');
 
 			//* Select sieve filter file for dovecot version
@@ -221,16 +228,13 @@ class maildeliver_plugin {
 			if ( is_file($sieve_file_isp) ) {
 				$app->system->chown($sieve_file_isp,$mail_config['mailuser_name'],false);
 				$app->system->chgrp($sieve_file_isp,$mail_config['mailuser_group'],false);
+
+				$app->system->exec_safe("sievec ?", "$sieve_file_isp");
+				if ( is_file($sieve_file_isp_svbin) ) {
+					$app->system->chown($sieve_file_isp_svbin,$mail_config['mailuser_name'],false);
+					$app->system->chgrp($sieve_file_isp_svbin,$mail_config['mailuser_group'],false);
+				}
 			}
-			chdir($data["new"]["maildir"]);
-			//* create symlink to activate sieve script
-			symlink("sieve/ispconfig.sieve", ".sieve")  or $app->log("Unable to create symlink to active sieve filter", LOGLEVEL_WARN);
-			if (is_link(".sieve")) {
-				$app->system->chown(".sieve",$mail_config['mailuser_name'],true);
-				$app->system->chgrp(".sieve",$mail_config['mailuser_group'],true);
-			}
-			$app->system->chown($sieve_file,$mail_config['mailuser_name'],true);
-			$app->system->chgrp($sieve_file,$mail_config['mailuser_group'],true);
 
 			unset($tpl);
 
@@ -241,9 +245,16 @@ class maildeliver_plugin {
 		global $app, $conf;
 
 		$sieve_file = $data["old"]["maildir"].'/.sieve';
-		$sieve_file_isp = $data["old"]["maildir"].'/sieve/ispconfig.sieve';
-		if(is_file($sieve_file)) unlink($sieve_file)  or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN);
+		$sieve_file_svbin = $data["old"]["maildir"].'/.sieve.svbin';
+		$old_sieve_file_isp = $data["old"]["maildir"].'/sieve/ispconfig.sieve';
+		$sieve_file_isp = $data["old"]["maildir"].'/.ispconfig.sieve';
+		$sieve_file_isp_svbin = $data["old"]["maildir"].'/.ispconfig.svbin';
+		if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp)  or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN);
+		// cleanup .sieve file if it is now a broken link
+		if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file)  or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN);
+		if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin)  or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN);
 		if(is_file($sieve_file_isp)) unlink($sieve_file_isp)  or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN);
+		if(is_file($sieve_file_isp_svbin)) unlink($sieve_file_isp_svbin)  or $app->log("Unable to delete file: $sieve_file_isp_svbin", LOGLEVEL_WARN);
 	}