diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index 083de9510c095c0fe6ee6df1a96ba5dab74e9b7e..166d530899a5356a22d99c0a23c404ed4e65d01f 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -53,7 +53,7 @@ const char *sieve_error_script_location
 
 void sieve_errors_init(struct sieve_instance *svinst)
 {
-	svinst->system_ehandler = sieve_master_ehandler_create(svinst, 0);
+	svinst->system_ehandler = sieve_master_ehandler_create(svinst, NULL, 0);
 }
  
 void sieve_errors_deinit(struct sieve_instance *svinst)
@@ -259,6 +259,12 @@ void sieve_system_ehandler_set
 	sieve_error_handler_ref(ehandler);
 }
 
+struct sieve_error_handler *sieve_system_ehandler_get
+(struct sieve_instance *svinst)
+{
+	return svinst->system_ehandler; 
+}
+
 /*
  * User errors
  */
@@ -581,15 +587,42 @@ void sieve_error_handler_reset(struct sieve_error_handler *ehandler)
  * - Output errors directly to Dovecot master log
  */
 
+struct sieve_master_ehandler {
+	struct sieve_error_handler handler;
+
+	const char *prefix;
+};
+
+typedef void (*master_log_func_t)(const char *fmt, ...) ATTR_FORMAT(1, 2);
+
+static void sieve_master_vlog
+(struct sieve_error_handler *_ehandler, master_log_func_t log_func,
+	const char *location, const char *fmt, va_list args) 
+{
+	struct sieve_master_ehandler *ehandler =
+		(struct sieve_master_ehandler *) _ehandler;
+	string_t *str;
+
+	str = t_str_new(256);
+	if ( ehandler->prefix != NULL)
+		str_printfa(str, "%s: ", ehandler->prefix);
+
+	str_append(str, "sieve: ");
+
+	if ( location != NULL && *location != '\0' )
+		str_printfa(str, "%s: ", location);
+
+	str_vprintfa(str, fmt, args);
+
+	log_func("%s", str_c(str));
+}
+
 static void sieve_master_verror
-(struct sieve_error_handler *ehandler ATTR_UNUSED,
+(struct sieve_error_handler *ehandler,
 	unsigned int flags ATTR_UNUSED, const char *location, const char *fmt,
 	va_list args) 
 {
-	if ( location == NULL || *location == '\0' )
-		i_error("sieve: %s", t_strdup_vprintf(fmt, args));
-	else
-		i_error("sieve: %s: %s", location, t_strdup_vprintf(fmt, args));
+	sieve_master_vlog(ehandler, i_error, location, fmt, args);
 }
 
 static void sieve_master_vwarning
@@ -597,10 +630,7 @@ static void sieve_master_vwarning
 	unsigned int flags ATTR_UNUSED, const char *location, const char *fmt,
 	va_list args) 
 {
-	if ( location == NULL || *location == '\0' )
-		i_warning("sieve: %s", t_strdup_vprintf(fmt, args));
-	else
-		i_warning("sieve: %s: %s", location, t_strdup_vprintf(fmt, args));
+	sieve_master_vlog(ehandler, i_warning, location, fmt, args);
 }
 
 static void sieve_master_vinfo
@@ -608,10 +638,7 @@ static void sieve_master_vinfo
 	unsigned int flags ATTR_UNUSED, const char *location, const char *fmt,
 	va_list args) 
 {
-	if ( location == NULL || *location == '\0' )
-		i_info("sieve: %s", t_strdup_vprintf(fmt, args));
-	else
-		i_info("sieve: %s: %s", location, t_strdup_vprintf(fmt, args));
+	sieve_master_vlog(ehandler, i_info, location, fmt, args);
 }
 
 static void sieve_master_vdebug
@@ -619,32 +646,28 @@ static void sieve_master_vdebug
 	unsigned int flags ATTR_UNUSED, const char *location, const char *fmt,
 	va_list args) 
 {
-	if ( location == NULL || *location == '\0' )
-		i_debug("sieve: %s", t_strdup_vprintf(fmt, args));
-	else
-		i_debug("sieve: %s: %s", location, t_strdup_vprintf(fmt, args));
+	sieve_master_vlog(ehandler, i_debug, location, fmt, args);
 }
 
 struct sieve_error_handler *sieve_master_ehandler_create
-(struct sieve_instance *svinst, unsigned int max_errors) 
+(struct sieve_instance *svinst, const char *prefix, unsigned int max_errors) 
 {
 	pool_t pool;
-	struct sieve_error_handler *ehandler;
+	struct sieve_master_ehandler *ehandler;
 
-	/* Pool is not strictly necessary, but other handler types will need
-	 * a pool, so this one will have one too.
-	 */
-	pool = pool_alloconly_create
-		("master_error_handler", sizeof(struct sieve_error_handler));
-	ehandler = p_new(pool, struct sieve_error_handler, 1);
-	sieve_error_handler_init(ehandler, svinst, pool, max_errors);
+	pool = pool_alloconly_create("master_error_handler", 256);
+	ehandler = p_new(pool, struct sieve_master_ehandler, 1);
+	sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors);
 
-	ehandler->verror = sieve_master_verror;
-	ehandler->vwarning = sieve_master_vwarning;
-	ehandler->vinfo = sieve_master_vinfo;
-	ehandler->vdebug = sieve_master_vdebug;
+	ehandler->handler.verror = sieve_master_verror;
+	ehandler->handler.vwarning = sieve_master_vwarning;
+	ehandler->handler.vinfo = sieve_master_vinfo;
+	ehandler->handler.vdebug = sieve_master_vdebug;
 
-	return ehandler;
+	if ( prefix != NULL )
+		ehandler->prefix = p_strdup(pool, prefix);
+
+	return &ehandler->handler;
 }
 
 /* 
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index 36e8985b026b42e7b4c4602b005394f4b5b37164..d133ff8d05ee77912e746864a50a3510ce1b2a8d 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -54,6 +54,8 @@ void sieve_sys_debug
 
 void sieve_system_ehandler_set
 	(struct sieve_error_handler *ehandler);
+struct sieve_error_handler *sieve_system_ehandler_get
+	(struct sieve_instance *svinst);
 
 /*
  * Global (user+system) errors
@@ -131,8 +133,6 @@ void sieve_error_handler_accept_infolog
 	(struct sieve_error_handler *ehandler, bool enable);
 void sieve_error_handler_accept_debuglog
 	(struct sieve_error_handler *ehandler, bool enable);
-void sieve_error_handler_copy_masterlog
-	(struct sieve_error_handler *ehandler, bool enable);
 
 /*
  * Error handler statistics
@@ -158,7 +158,7 @@ void sieve_error_handler_reset(struct sieve_error_handler *ehandler);
 
 /* Write errors to dovecot master log */
 struct sieve_error_handler *sieve_master_ehandler_create
-	(struct sieve_instance *svinst, unsigned int max_errors);
+	(struct sieve_instance *svinst, const char *prefix, unsigned int max_errors);
 
 /* Write errors to stderr */
 struct sieve_error_handler *sieve_stderr_ehandler_create
diff --git a/src/plugins/lda-sieve/Makefile.am b/src/plugins/lda-sieve/Makefile.am
index 9994a64de05055eb8747cd9b28a89f9b024ce6cd..b89ed4b437d150758f112f0a22e40d7429d53567 100644
--- a/src/plugins/lda-sieve/Makefile.am
+++ b/src/plugins/lda-sieve/Makefile.am
@@ -12,9 +12,7 @@ lib90_sieve_plugin_la_LIBADD = \
 	$(top_builddir)/src/lib-sieve/libdovecot-sieve.la
 
 lib90_sieve_plugin_la_SOURCES = \
-	lda-sieve-log.c \
 	lda-sieve-plugin.c 
 
 noinst_HEADERS = \
-	lda-sieve-log.h \
 	lda-sieve-plugin.h
diff --git a/src/plugins/lda-sieve/lda-sieve-log.c b/src/plugins/lda-sieve/lda-sieve-log.c
deleted file mode 100644
index 482a88a90d4131955525206168d10c78a8c3e49b..0000000000000000000000000000000000000000
--- a/src/plugins/lda-sieve/lda-sieve-log.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright (c) 2002-2010 Pigeonhole authors, see the included COPYING file
- */
- 
-#include "lib.h"
-#include "str.h"
-#include "ostream.h"
-#include "mail-deliver.h"
-
-#include "sieve-common.h"
-#include "sieve-script.h"
-#include "sieve-error-private.h"
-
-#include "lda-sieve-log.h"
-
-/* 
- * Deliver log error handler
- */
-
-struct lda_sieve_log_ehandler {
-	struct sieve_error_handler handler;
-
-	struct mail_deliver_context *mdctx;
-};
-
-typedef void (*log_func_t)(const char *fmt, ...) ATTR_FORMAT(1, 2);
-
-static void lda_sieve_vlog
-(struct sieve_error_handler *_ehandler, log_func_t log_func,
-	const char *location, const char *fmt, va_list args) 
-{
-	struct lda_sieve_log_ehandler *ehandler =
-		(struct lda_sieve_log_ehandler *) _ehandler;
-	struct mail_deliver_context *mdctx = ehandler->mdctx;
-	string_t *str;
-
-	str = t_str_new(256);
-	if ( mdctx->session_id != NULL)
-		str_printfa(str, "%s: ", mdctx->session_id);
-
-	str_append(str, "sieve: ");
-
-	if ( location != NULL && *location != '\0' )
-		str_printfa(str, "%s: ", location);
-
-	str_vprintfa(str, fmt, args);
-
-	log_func("%s", str_c(str));
-}
-
-static void lda_sieve_log_verror
-(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED,
-	const char *location, const char *fmt, va_list args) 
-{
-	lda_sieve_vlog(ehandler, i_error, location, fmt, args);
-}
-static void lda_sieve_log_vwarning
-(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED,
-	const char *location, const char *fmt, va_list args) 
-{
-	lda_sieve_vlog(ehandler, i_warning, location, fmt, args);
-}
-static void lda_sieve_log_vinfo
-(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED,
-	const char *location, const char *fmt, va_list args) 
-{
-	lda_sieve_vlog(ehandler, i_info, location, fmt, args);
-}
-
-static void lda_sieve_log_vdebug
-(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED,
-	const char *location, const char *fmt, va_list args) 
-{
-	lda_sieve_vlog(ehandler, i_debug, location, fmt, args);
-}
-
-struct sieve_error_handler *lda_sieve_log_ehandler_create
-(struct sieve_instance *svinst, struct mail_deliver_context *mdctx,
-	unsigned int max_errors)
-{
-	pool_t pool;
-	struct lda_sieve_log_ehandler *ehandler;
-
-	pool = pool_alloconly_create("lda_sieve_log_error_handler", 256);
-	ehandler = p_new(pool, struct lda_sieve_log_ehandler, 1);
-	ehandler->mdctx = mdctx;
-
-	sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors);
-
-	ehandler->handler.verror = lda_sieve_log_verror;
-	ehandler->handler.vwarning = lda_sieve_log_vwarning;
-	ehandler->handler.vinfo = lda_sieve_log_vinfo;
-	ehandler->handler.vdebug = lda_sieve_log_vdebug;
-
-	return &(ehandler->handler);
-}
diff --git a/src/plugins/lda-sieve/lda-sieve-log.h b/src/plugins/lda-sieve/lda-sieve-log.h
deleted file mode 100644
index 4523b82f64e8bb71ec4fbdb6cf288c2a05e72f40..0000000000000000000000000000000000000000
--- a/src/plugins/lda-sieve/lda-sieve-log.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Copyright (c) 2002-2010 Pigeonhole authors, see the included COPYING file
- */
-
-#ifndef __LDA_SIEVE_LOG
-#define __LDA_SIEVE_LOG
-
-#include "lib.h"
-#include "mail-deliver.h"
-
-struct sieve_error_handler *lda_sieve_log_ehandler_create
-	(struct sieve_instance *svinst, struct mail_deliver_context *mdctx,
-		unsigned int max_errors);
-
-#endif /* __LDA_SIEVE_LOG */
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 0918e3f593607e13071dc69cd93b07359c4d8184..15c8166dc0fb06018803a4adf383ac83178fc8ab 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -15,7 +15,6 @@
 #include "sieve.h"
 
 #include "lda-sieve-plugin.h"
-#include "lda-sieve-log.h"
 
 #include <stdlib.h>
 #include <sys/stat.h>
@@ -27,8 +26,7 @@
 
 #define SIEVE_DEFAULT_PATH "~/.dovecot.sieve"
 
-#define LDA_SIEVE_MAX_USER_ERRORS 10
-#define LDA_SIEVE_MAX_SYSTEM_ERRORS 100
+#define LDA_SIEVE_MAX_USER_ERRORS 30
 
 /*
  * Global variables 
@@ -569,7 +567,9 @@ static int lda_sieve_run
 
 	array_append_array(&scripts, scripts_after);
 
-	/* Create error handlers */
+	/* Initialize error handlers */
+
+	srctx.master_ehandler = sieve_system_ehandler_get(svinst);
 
 	if ( user_script != NULL ) {
 		srctx.userlog = t_strconcat(user_script, ".log", NULL);
@@ -577,12 +577,6 @@ static int lda_sieve_run
 			(svinst, srctx.userlog, LDA_SIEVE_MAX_USER_ERRORS);
 	}
 
-	srctx.master_ehandler = lda_sieve_log_ehandler_create
-		(svinst, mdctx, LDA_SIEVE_MAX_SYSTEM_ERRORS);
-	sieve_system_ehandler_set(srctx.master_ehandler);
-
-	sieve_error_handler_accept_infolog(srctx.master_ehandler, TRUE);
-
 	/* Collect necessary message data */
 
 	memset(&msgdata, 0, sizeof(msgdata));
@@ -650,6 +644,7 @@ static int lda_sieve_deliver_mail
 (struct mail_deliver_context *mdctx, struct mail_storage **storage_r)
 {
 	struct sieve_instance *svinst;
+	struct sieve_error_handler *master_ehandler; 
 	const char *user_script, *default_script, *sieve_before, *sieve_after;
 	ARRAY_TYPE (const_string) scripts_before;
 	ARRAY_TYPE (const_string) scripts_after;
@@ -660,8 +655,18 @@ static int lda_sieve_deliver_mail
 
 	svinst = sieve_init(&lda_sieve_env, mdctx->dest_user, debug);
 
+	/* Initialize master error handler */
+
+	master_ehandler = sieve_master_ehandler_create(svinst, mdctx->session_id, 0);
+	sieve_system_ehandler_set(master_ehandler);
+
+	sieve_error_handler_accept_infolog(master_ehandler, TRUE);
+	sieve_error_handler_accept_debuglog(master_ehandler, debug);
+
 	*storage_r = NULL;
 
+	/* Find scripts and run them */
+
 	T_BEGIN { 
 		struct stat st;