diff --git a/configure.in b/configure.in
index 7c91b43102a3e4d188adf9c9c78d138d1f139637..ff495a54276bfc86e074cff2c6f76edaedf2679e 100644
--- a/configure.in
+++ b/configure.in
@@ -105,13 +105,13 @@ if test $have_dovecot_sources = yes; then
   LIBDOVECOT_INCLUDE=' \
     -I$(dovecot_incdir) \
     -I$(dovecot_incdir)/src/lib \
+    -I$(dovecot_incdir)/src/lib-dict \
     -I$(dovecot_incdir)/src/lib-mail \
     -I$(dovecot_incdir)/src/lib-storage \
     -I$(dovecot_incdir)/src/lib-imap \
     -I$(dovecot_incdir)/src/lib-master'
 
   LIBDOVECOT_LDA_INCLUDE=' \
-    -I$(dovecot_incdir)/src/lib-dict \
     -I$(dovecot_incdir)/src/lib-lda \
     -I$(dovecot_incdir)/src/lda'
 
@@ -130,8 +130,8 @@ else
   LIBDOVECOT_STORAGE='$(dovecot_libdir)/libdovecot-storage.la'
 
   LIBDOVECOT_INCLUDE='-I$(dovecot_incdir)'
-  LIBDOVECOT_LDA_INCLUDE='-I$(dovecot_incdir)'
-  LIBDOVECOT_STORAGE_INCLUDE='-I$(dovecot_incdir)'
+  LIBDOVECOT_LDA_INCLUDE=''
+  LIBDOVECOT_STORAGE_INCLUDE=''
 fi
 
 dovecot_pkglibexecdir='$(libexecdir)/dovecot'
diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c
index f39a00f706e4ac98345a86301385869361272fd7..6b69ec7f7adceafb1d3dcf1dff84484b1f917f76 100644
--- a/src/lib-sieve-tool/sieve-tool.c
+++ b/src/lib-sieve-tool/sieve-tool.c
@@ -3,12 +3,16 @@
 
 #include "lib.h"
 #include "lib-signals.h"
+#include "array.h"
 #include "ioloop.h"
 #include "ostream.h"
 #include "hostpid.h"
+#include "dict.h"
 #include "mail-storage.h"
 
 #include "sieve.h"
+#include "sieve-plugins.h"
+
 #include "sieve-tool.h"
 
 #include <stdio.h>
@@ -74,7 +78,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
 /* HACK */
 static bool _init_lib = FALSE;
 
-void sieve_tool_init(const struct sieve_environment *env, bool init_lib) 
+void sieve_tool_init(bool init_lib) 
 {
 	_init_lib = init_lib;
 
@@ -89,7 +93,10 @@ void sieve_tool_init(const struct sieve_environment *env, bool init_lib)
 		lib_signals_ignore(SIGPIPE, TRUE);
 		lib_signals_ignore(SIGALRM, FALSE);
 	}
+}
 
+void sieve_tool_sieve_init(const struct sieve_environment *env)
+{
 	if ( env == NULL ) env = &sieve_tool_sieve_env;
 
 	if ( (sieve_instance=sieve_init(env, NULL)) == NULL )
@@ -159,6 +166,27 @@ void sieve_tool_get_envelope_data
 		*sender = "sender@example.com";
 }
 
+void sieve_tool_load_plugins(ARRAY_TYPE(const_string) *plugins)
+{
+	unsigned int i, count;
+	const char * const*_plugins;
+
+	_plugins = array_get(plugins, &count);
+	for ( i = 0; i < count; i++ ) {
+		const char *path, *file = strrchr(_plugins[i], '/');
+
+		if ( file != NULL ) {
+			path = t_strdup_until(_plugins[i], file);
+			file = file+1;
+		} else {
+			path = NULL;
+			file = _plugins[i];
+		}
+
+		sieve_plugins_load(sieve_instance, path, file);		
+	}
+}
+
 /*
  * Sieve script handling
  */
diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h
index 4b0286da6c2c3102566510db010aebfbd9c76b58..e3708105edcd05705f1c933c4f4539cd80fb4be0 100644
--- a/src/lib-sieve-tool/sieve-tool.h
+++ b/src/lib-sieve-tool/sieve-tool.h
@@ -23,7 +23,8 @@ const struct sieve_environment sieve_tool_env;
  * Initialization
  */
 
-void sieve_tool_init(const struct sieve_environment *env, bool init_lib);
+void sieve_tool_init(bool init_lib);
+void sieve_tool_sieve_init(const struct sieve_environment *env);
 void sieve_tool_deinit(void);
 
 /*
@@ -35,6 +36,8 @@ const char *sieve_tool_get_user(void);
 void sieve_tool_get_envelope_data
 	(struct mail *mail, const char **recipient, const char **sender);
 
+void sieve_tool_load_plugins(ARRAY_TYPE(const_string) *plugins);
+
 /*
  * Sieve script handling
  */
diff --git a/src/plugins/lda-sieve/Makefile.am b/src/plugins/lda-sieve/Makefile.am
index fb5940b7e680c0e65548d8db0b5094a5478ec57e..2432e11ad4261aabed25a94c817b3ac35b8a7a2a 100644
--- a/src/plugins/lda-sieve/Makefile.am
+++ b/src/plugins/lda-sieve/Makefile.am
@@ -1,6 +1,7 @@
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/lib-sieve \
 	$(LIBDOVECOT_INCLUDE) \
+	$(LIBDOVECOT_DICT_INCLUDE) \
 	$(LIBDOVECOT_LDA_INCLUDE)
 
 lib90_sieve_plugin_la_LDFLAGS = -module -avoid-version
diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c
index f18e0b1d292494087bba3716e657757020d39a23..9f2db1b40b7830b09dfa074bbefce816dba4d585 100644
--- a/src/sieve-tools/sieve-filter.c
+++ b/src/sieve-tools/sieve-filter.c
@@ -231,7 +231,7 @@ int main(int argc, char **argv)
 	const char *user, *home, *folder;
 	int i;
 
-	sieve_tool_init(NULL, FALSE);
+	sieve_tool_init();
 	
 	/* Parse arguments */
 	scriptfile = recipient = sender = extensions = src_mailstore = dst_mailstore 
@@ -276,6 +276,8 @@ int main(int argc, char **argv)
 		i_fatal("Missing <mailstore> argument");
 	}
 
+	sieve_tool_sieve_init(NULL, FALSE);
+
 	if ( extensions != NULL ) {
 		sieve_set_extensions(sieve_instance, extensions);
 	}
diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c
index c2ff765f5246ef39c552c1db2b5a360cacb48100..a16287ea00f3c5b159360f74cbda909e12834366 100644
--- a/src/sieve-tools/sieve-test.c
+++ b/src/sieve-tools/sieve-test.c
@@ -48,7 +48,8 @@ static void print_help(void)
 "Usage: sieve-test [-c] [-d <dump-filename>] [-e] [-f <envelope-sender>]\n"
 "                  [-l <mail-location>] [-m <default-mailbox>]\n" 
 "                  [-r <recipient-address>] [-s <script-file>]\n"
-"                  [-t] [-x <extensions>] <script-file> <mail-file>\n"
+"                  [-t] [-P <plugin>] [-x <extensions>]\n"
+"                  <script-file> <mail-file>\n"
 	);
 }
 
@@ -107,7 +108,8 @@ int main(int argc, char **argv)
 	struct mail_storage_service_user *service_user;
 	struct mail_storage_service_input service_input;
 	struct mail_user *mail_user_dovecot = NULL;
-	ARRAY_DEFINE(scriptfiles, const char *);
+	ARRAY_TYPE (const_string) scriptfiles;
+	ARRAY_TYPE (const_string) plugins;
 	const char *scriptfile, *recipient, *sender, *mailbox, *dumpfile, *mailfile, 
 		*mailloc, *extensions; 
 	const char *user, *home, *errstr;
@@ -125,11 +127,12 @@ int main(int argc, char **argv)
 	int ret, c;
 
 	master_service = master_service_init("sieve-test", 
-		MASTER_SERVICE_FLAG_STANDALONE, &argc, &argv, "r:f:m:d:l:x:s:ect");
+		MASTER_SERVICE_FLAG_STANDALONE, &argc, &argv, "r:f:m:d:l:x:s:ectP:");
 
-	sieve_tool_init(NULL, FALSE);
+	sieve_tool_init(FALSE);
 
 	t_array_init(&scriptfiles, 16);
+	t_array_init(&plugins, 4);
 
 	user = getenv("USER");
 	
@@ -171,6 +174,15 @@ int main(int argc, char **argv)
 				array_append(&scriptfiles, &file, 1);
 			}
 			break;
+		case 'P': 
+			/* Plugin */
+			{
+				const char *plugin;			
+
+				plugin = t_strdup(optarg);
+				array_append(&plugins, &plugin, 1);
+			}
+			break;
 		case 'e':
 			execute = TRUE;
 			break;
@@ -206,6 +218,12 @@ int main(int argc, char **argv)
 		i_fatal_status(EX_USAGE, "Unknown argument: %s", argv[optind]);
 	}
 
+	sieve_tool_sieve_init(NULL);
+
+	if ( array_count(&plugins) > 0 ) {
+		sieve_tool_load_plugins(&plugins);
+	}
+
 	if ( extensions != NULL ) {
 		sieve_set_extensions(sieve_instance, extensions);
 	}
diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c
index ed52f85a3be31d28b7ac5b8f7359a158a41483df..32f0a029fd170c0a16a9d300b0df5c3f26421788 100644
--- a/src/sieve-tools/sievec.c
+++ b/src/sieve-tools/sievec.c
@@ -2,6 +2,7 @@
  */
 
 #include "lib.h"
+#include "array.h"
 
 #include "sieve.h"
 #include "sieve-extensions.h"
@@ -26,7 +27,8 @@
 static void print_help(void)
 {
 	printf(
-"Usage: sievec [-d] [-x <extensions>] <script-file> [<out-file>]\n"
+"Usage: sievec [-d] [-P <plugin>] [-x <extensions>] \n"
+"              <script-file> [<out-file>]\n"
 	);
 }
 
@@ -34,14 +36,18 @@ static void print_help(void)
  * Tool implementation
  */
 
-int main(int argc, char **argv) {
+int main(int argc, char **argv) 
+{
+	ARRAY_TYPE(const_string) plugins;
 	int i;
 	struct stat st;
 	struct sieve_binary *sbin;
 	bool dump = FALSE;
 	const char *scriptfile, *outfile, *extensions;
 		
-	sieve_tool_init(NULL, TRUE);	
+	sieve_tool_init(TRUE);
+
+	t_array_init(&plugins, 4);	
 		
 	scriptfile = outfile = extensions = NULL;
 	for (i = 1; i < argc; i++) {
@@ -56,6 +62,18 @@ int main(int argc, char **argv) {
 				i_fatal("Missing -x argument");
 			}
 			extensions = argv[i];
+		} else if (strcmp(argv[i], "-P") == 0) {
+			const char *plugin;
+
+			/* scriptfile executed before main script */
+			i++;
+			if (i == argc) {
+				print_help();
+				i_fatal("Missing -P argument");
+			}
+
+			plugin = t_strdup(argv[i]);
+			array_append(&plugins, &plugin, 1);
 		} else if ( scriptfile == NULL ) {
 			scriptfile = argv[i];
 		} else if ( outfile == NULL ) {
@@ -74,6 +92,12 @@ int main(int argc, char **argv) {
 	if ( outfile == NULL && dump )
 		outfile = "-";	
 
+	sieve_tool_sieve_init(NULL);
+
+	if ( array_count(&plugins) > 0 ) {
+		sieve_tool_load_plugins(&plugins);
+	}
+
 	if ( extensions != NULL ) {
 		sieve_set_extensions(sieve_instance, extensions);
 	}
diff --git a/src/sieve-tools/sieved.c b/src/sieve-tools/sieved.c
index 084ed34b622b2cc99fd733c26955f7a9e0051ff9..5f5055b6c4f299bbb20836078112f56f828e8c80 100644
--- a/src/sieve-tools/sieved.c
+++ b/src/sieve-tools/sieved.c
@@ -2,6 +2,7 @@
  */
 
 #include "lib.h"
+#include "array.h"
 
 #include "sieve.h"
 #include "sieve-extensions.h"
@@ -24,7 +25,8 @@
 static void print_help(void)
 {
 	printf(
-"Usage: sieved [-x <extensions>] <sieve-binary> [<out-file>]\n"
+"Usage: sieved [-P <plugin>] [-x <extensions>]\n"
+"              <sieve-binary> [<out-file>]\n"
 	);
 }
 
@@ -32,12 +34,16 @@ static void print_help(void)
  * Tool implementation
  */
 
-int main(int argc, char **argv) {
+int main(int argc, char **argv) 
+{
+	ARRAY_TYPE(const_string) plugins;
 	int i;
 	struct sieve_binary *sbin;
 	const char *binfile, *outfile, *extensions;
 	
-	sieve_tool_init(NULL, TRUE);
+	sieve_tool_init(TRUE);
+
+	t_array_init(&plugins, 4);
 	
 	binfile = outfile = extensions = NULL;
 	for (i = 1; i < argc; i++) {
@@ -49,6 +55,18 @@ int main(int argc, char **argv) {
 				i_fatal("Missing -x argument");
 			}
 			extensions = argv[i];
+		} else if (strcmp(argv[i], "-P") == 0) {
+			const char *plugin;
+
+			/* scriptfile executed before main script */
+			i++;
+			if (i == argc) {
+				print_help();
+				i_fatal("Missing -P argument");
+			}
+
+			plugin = t_strdup(argv[i]);
+			array_append(&plugins, &plugin, 1);
 		} else if ( binfile == NULL ) {
 			binfile = argv[i];
 		} else if ( outfile == NULL ) {
@@ -64,6 +82,12 @@ int main(int argc, char **argv) {
 		i_fatal("missing <sieve-binary> argument");
 	}
 
+	sieve_tool_sieve_init(NULL);
+
+	if ( array_count(&plugins) > 0 ) {
+		sieve_tool_load_plugins(&plugins);
+	}
+
 	if ( extensions != NULL ) {
 		sieve_set_extensions(sieve_instance, extensions);
 	}
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index 65512e7b8fe83a460d6c247293c40b5921c16069..30287cf4d2424d878ac3184bdce144a37fde1dcd 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -47,7 +47,7 @@ const struct sieve_script_env *testsuite_scriptenv;
 #define DEFAULT_ENVELOPE_SENDER "MAILER-DAEMON"
 
 /*
- * Testsuite initialization 
+ * Testsuite Sieve environment
  */
 
 static const struct sieve_environment testsuite_sieve_env = {
@@ -55,26 +55,6 @@ static const struct sieve_environment testsuite_sieve_env = {
 	testsuite_setting_get
 };
 
-static void testsuite_tool_init(const char *extensions, bool log_stdout) 
-{
-	testsuite_settings_init();
-
-	sieve_tool_init(&testsuite_sieve_env, FALSE);
-
-	sieve_extensions_set_string(sieve_instance, extensions);
-
-	testsuite_init(sieve_instance, log_stdout);
-}
-
-static void testsuite_tool_deinit(void)
-{
-	testsuite_deinit();
-	
-	sieve_tool_deinit();
-
-	testsuite_settings_deinit();
-}
-
 /*
  * Testsuite execution
  */
@@ -82,7 +62,9 @@ static void testsuite_tool_deinit(void)
 static void print_help(void)
 {
 	printf(
-"Usage: testsuite [-t][-E][-d <dump filename>] <scriptfile>\n"
+"Usage: testsuite [-t] [-E] [-d <dump filename>]\n"
+"                 [-P <plugin>] [-x <extensions>]\n"
+"                 <scriptfile>\n"
 	);
 }
 
@@ -134,6 +116,7 @@ int main(int argc, char **argv)
 	struct mail_user *mail_user_dovecot;
 	const char *scriptfile, *dumpfile, *extensions; 
 	const char *user, *home, *errstr;
+	ARRAY_TYPE(const_string) plugins;
 	struct sieve_binary *sbin;
 	const char *sieve_dir;
 	bool trace = FALSE, log_stdout = FALSE;
@@ -144,6 +127,10 @@ int main(int argc, char **argv)
 
 	user = getenv("USER");
 
+	sieve_tool_init(FALSE);
+
+	t_array_init(&plugins, 4);
+
 	/* Parse arguments */
 	scriptfile = dumpfile = extensions = NULL;
 
@@ -205,7 +192,11 @@ int main(int argc, char **argv)
 		i_fatal("%s", errstr);
 
 	/* Initialize testsuite */
-	testsuite_tool_init(extensions, log_stdout);
+	testsuite_settings_init();
+	sieve_tool_sieve_init(&testsuite_sieve_env);
+	sieve_tool_load_plugins(&plugins);
+	sieve_extensions_set_string(sieve_instance, extensions);
+	testsuite_init(sieve_instance, log_stdout);
 
 	printf("Test case: %s:\n\n", scriptfile);
 
@@ -214,8 +205,9 @@ int main(int argc, char **argv)
 	sieve_dir = strrchr(scriptfile, '/');
 	if ( sieve_dir == NULL )
 		sieve_dir= "./";
-	else
+	else {
 		sieve_dir = t_strdup_until(scriptfile, sieve_dir+1);
+	}
 
 	/* Currently needed for include (FIXME) */
 	testsuite_setting_set
@@ -290,7 +282,9 @@ int main(int argc, char **argv)
 		mail_user_unref(&mail_user_dovecot);
 
 	/* De-initialize testsuite */
-	testsuite_tool_deinit();  
+	testsuite_deinit();	
+	testsuite_settings_deinit();
+	sieve_tool_deinit();
 
 	mail_storage_service_user_free(&service_user);
 	mail_storage_service_deinit(&storage_service);