diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index 96302d13d23112b50421bcb13ad1c098f2dfa634..48605df0d41067e65718bea3fcdd8c31904fcc1d 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -285,7 +285,7 @@ struct sieve_error_handler *sieve_master_ehandler_create
 	return ehandler;	
 }
 
-struct sieve_error_handler _sieve_system_ehandler = {
+struct sieve_error_handler _sieve_system_ehandler_object = {
         NULL, 0, 0, 0, 0,
 	FALSE,
 	TRUE,
@@ -295,7 +295,20 @@ struct sieve_error_handler _sieve_system_ehandler = {
 	NULL
 };
 
-struct sieve_error_handler *sieve_system_ehandler = &_sieve_system_ehandler;
+struct sieve_error_handler *_sieve_system_ehandler = &_sieve_system_ehandler_object;
+
+void sieve_system_ehandler_set(struct sieve_error_handler *ehandler)
+{
+	sieve_error_handler_unref(&_sieve_system_ehandler);
+	_sieve_system_ehandler = ehandler;
+	sieve_error_handler_ref(_sieve_system_ehandler);
+}
+
+void sieve_system_ehandler_reset(void)
+{
+	sieve_error_handler_unref(&_sieve_system_ehandler);
+	_sieve_system_ehandler = &_sieve_system_ehandler_object;	
+}
 
 /* 
  * STDERR error handler
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index d449dbac4d2d28a27e814f749bfb07794f9226bd..4ee103e01c07344cd0d1b8e0e2c80add2635bc73 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -28,11 +28,14 @@ typedef void (*sieve_error_vfunc_t)
  * System errors
  */
 
-extern struct sieve_error_handler *sieve_system_ehandler;
+extern struct sieve_error_handler *_sieve_system_ehandler;
 
-#define sieve_sys_error(...) sieve_error(sieve_system_ehandler, NULL, __VA_ARGS__ )
-#define sieve_sys_warning(...) sieve_warning(sieve_system_ehandler, NULL, __VA_ARGS__ )
-#define sieve_sys_info(...) sieve_info(sieve_system_ehandler, NULL, __VA_ARGS__ )
+#define sieve_sys_error(...) sieve_error(_sieve_system_ehandler, NULL, __VA_ARGS__ )
+#define sieve_sys_warning(...) sieve_warning(_sieve_system_ehandler, NULL, __VA_ARGS__ )
+#define sieve_sys_info(...) sieve_info(_sieve_system_ehandler, NULL, __VA_ARGS__ )
+
+void sieve_system_ehandler_set(struct sieve_error_handler *ehandler);
+void sieve_system_ehandler_reset(void);
 
 /*
  * Main error functions
diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c
index d74038692e0d55224d3bde3b1ca3754f479ed2aa..cbb1d559b03721cc1f716cadfba379f4d8d948b5 100644
--- a/src/sieve-tools/sieve-filter.c
+++ b/src/sieve-tools/sieve-filter.c
@@ -10,11 +10,14 @@
 #include "env-util.h"
 
 #include "sieve.h"
+#include "sieve-extensions.h"
 #include "sieve-binary.h"
 
 #include "mail-raw.h"
 #include "sieve-tool.h"
 
+#include "sieve-ext-debug.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -187,6 +190,14 @@ int main(int argc, char **argv)
 		sieve_set_extensions(extensions);
 	}
 
+	/* Register tool-specific extensions */
+	(void) sieve_extension_register(&debug_extension, TRUE);
+
+	/* Create error handler */
+	ehandler = sieve_stderr_ehandler_create(0);
+	sieve_system_ehandler_set(ehandler);
+	sieve_error_handler_accept_infolog(ehandler, TRUE);
+
 	/* Compile main sieve script */
 	if ( force_compile ) {
 		main_sbin = sieve_tool_script_compile(scriptfile, NULL);
@@ -226,7 +237,7 @@ int main(int argc, char **argv)
 	box = mailbox_open(&storage, mailbox, NULL, open_flags);
 	if ( box == NULL ) {
 		i_fatal("Couldn't open mailbox '%s': %s", 
-				mailbox, mail_storage_get_last_error(storage, &error));
+			mailbox, mail_storage_get_last_error(storage, &error));
 	}
 
 	if ( mailbox == NULL )
@@ -246,20 +257,17 @@ int main(int argc, char **argv)
 	scriptenv.trace_stream = NULL;
 	scriptenv.exec_status = &estatus;
 
-	/* Create error handler */
-	ehandler = sieve_stderr_ehandler_create(0);	
-	sieve_error_handler_accept_infolog(ehandler, TRUE);
-
 	/* Apply Sieve filter to all messages found */
 	filter_mailbox(box, main_sbin, &scriptenv, ehandler, user);
 	
-	/* Cleanup error handler */
-	sieve_error_handler_unref(&ehandler);
-
-  /* Close the mailbox */
+	/* Close the mailbox */
 	if ( box != NULL )
 		mailbox_close(&box);
 
+	/* Cleanup error handler */
+	sieve_error_handler_unref(&ehandler);
+	sieve_system_ehandler_reset();	
+
 	/* De-initialize mail user object */
 	if ( mail_user != NULL )
 		mail_user_unref(&mail_user);
diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c
index 8029e45dfe025d26169def0e3dbdd00d32f95fb1..828361ba75de4e696c4304ec1de523d892a1cf1d 100644
--- a/src/sieve-tools/sieve-test.c
+++ b/src/sieve-tools/sieve-test.c
@@ -206,6 +206,11 @@ int main(int argc, char **argv)
 	/* Register tool-specific extensions */
 	(void) sieve_extension_register(&debug_extension, TRUE);
 	
+	/* Create error handler */
+	ehandler = sieve_stderr_ehandler_create(0);
+	sieve_system_ehandler_set(ehandler);
+	sieve_error_handler_accept_infolog(ehandler, TRUE);
+
 	/* Compile main sieve script */
 	if ( force_compile ) {
 		main_sbin = sieve_tool_script_compile(scriptfile, NULL);
@@ -278,10 +283,6 @@ int main(int argc, char **argv)
 		scriptenv.trace_stream = ( trace ? teststream : NULL );
 		scriptenv.exec_status = &estatus;
 	
-		/* Create error handler */
-		ehandler = sieve_stderr_ehandler_create(0);	
-		sieve_error_handler_accept_infolog(ehandler, TRUE);
-
 		/* Run the test */
 		ret = 1;
 		if ( array_count(&scriptfiles) == 0 ) {
@@ -383,9 +384,6 @@ int main(int argc, char **argv)
 		sieve_close(&sbin);
 		if ( main_sbin != NULL ) sieve_close(&main_sbin);
 		
-		/* Cleanup error handler */
-		sieve_error_handler_unref(&ehandler);
-
 		/* De-initialize raw mail object */
 		mail_raw_close(mailr);
 		mail_raw_deinit();
@@ -399,6 +397,10 @@ int main(int argc, char **argv)
 		mail_users_deinit();
 	}
 
+	/* Cleanup error handler */
+	sieve_error_handler_unref(&ehandler);
+	sieve_system_ehandler_reset();
+
 	sieve_tool_deinit();
 	
 	return 0;
diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c
index 3e407b9563c888cd59b0a0a816bfbba9ee3c9215..9ba488ec2d2153373d565b92e3ff7523046677f1 100644
--- a/src/sieve-tools/sievec.c
+++ b/src/sieve-tools/sievec.c
@@ -4,9 +4,12 @@
 #include "lib.h"
 
 #include "sieve.h"
+#include "sieve-extensions.h"
 #include "sieve-script.h"
 #include "sieve-tool.h"
 
+#include "sieve-ext-debug.h"
+
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -73,6 +76,9 @@ int main(int argc, char **argv) {
 		sieve_set_extensions(extensions);
 	}
 
+	/* Register tool-specific extensions */
+	(void) sieve_extension_register(&debug_extension, TRUE);
+
 	if ( stat(scriptfile, &st) == 0 && S_ISDIR(st.st_mode) ) {
 		/* Script directory */
 		DIR *dirp;
@@ -119,7 +125,7 @@ int main(int argc, char **argv) {
 			}
 		}
    
-   	/* Close the directory */
+		/* Close the directory */
 		if ( closedir(dirp) < 0 ) 
 			i_fatal("closedir(%s) failed: %m", scriptfile);
  	
diff --git a/src/sieve-tools/sieved.c b/src/sieve-tools/sieved.c
index 5447e3b14a2060b70f4d0b9d8d1c980e38a1f902..33166797971f5ebbccd1d80ba51224ac5497aa0b 100644
--- a/src/sieve-tools/sieved.c
+++ b/src/sieve-tools/sieved.c
@@ -4,9 +4,12 @@
 #include "lib.h"
 
 #include "sieve.h"
+#include "sieve-extensions.h"
 #include "sieve-binary.h"
 #include "sieve-tool.h"
 
+#include "sieve-ext-debug.h"
+
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -63,6 +66,9 @@ int main(int argc, char **argv) {
 	if ( extensions != NULL ) {
 		sieve_set_extensions(extensions);
 	}
+
+	/* Register tool-specific extensions */
+	(void) sieve_extension_register(&debug_extension, TRUE);
 		
 	sbin = sieve_binary_open(binfile, NULL);