diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c
index bb4596fc1a1ed0e98ef14116dd5c8444a7e941c3..b415906f4f2cfb9fcb75051b40c9a2d78c5a78d7 100644
--- a/src/lib-sieve-tool/sieve-tool.c
+++ b/src/lib-sieve-tool/sieve-tool.c
@@ -49,7 +49,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
 /* HACK */
 static bool _init_lib = FALSE;
 
-void sieve_tool_init(bool init_lib) 
+void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib) 
 {
 	_init_lib = init_lib;
 
@@ -65,7 +65,7 @@ void sieve_tool_init(bool init_lib)
 		lib_signals_ignore(SIGALRM, FALSE);
 	}
 
-	if ( !sieve_init() ) 
+	if ( !sieve_init(settings_func) ) 
 		i_fatal("failed to initialize sieve implementation\n");
 }
 
diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h
index 4c7dbd43e61c4f4fd7db4c73e040b7b9e52af179..e9c2b535f750138fefe71c39ebd2353b138b479f 100644
--- a/src/lib-sieve-tool/sieve-tool.h
+++ b/src/lib-sieve-tool/sieve-tool.h
@@ -4,13 +4,15 @@
 #ifndef __SIEVE_TOOL_H
 #define __SIEVE_TOOL_H
 
+#include "sieve-common.h"
+
 /* Functionality common to all Sieve command line tools. */
 
 /*
  * Initialization
  */
 
-void sieve_tool_init(bool init_lib);
+void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib);
 void sieve_tool_deinit(void);
 
 /*
diff --git a/src/lib-sieve/sieve-settings.c b/src/lib-sieve/sieve-settings.c
index b6217a8c054af93f9609e53ee42cb88fb3ffe948..afe0ccaefda605cb324e14ff75ffea4676b77b0c 100644
--- a/src/lib-sieve/sieve-settings.c
+++ b/src/lib-sieve/sieve-settings.c
@@ -2,29 +2,21 @@
  */
 
 #include "lib.h"
-#include "mail-user.h"
-#include "master-service.h"
-#include "master-service-settings.h"
 
 #include "sieve-common.h"
 #include "sieve-extensions.h"
 
 #include "sieve-settings.h"
 
-#include <stdlib.h>
-
-static struct mail_user *_settings_user; 
-static struct master_service *_settings_service;
+static sieve_settings_func_t sieve_settings_func = NULL;
 
 /*
  * Initialization
  */
 
-void sieve_settings_init
-(struct master_service *service, struct mail_user *user) 
+void sieve_settings_init(sieve_settings_func_t settings_func)
 {
-	_settings_user = user;
-	_settings_service = service;
+	sieve_settings_func = settings_func;
 }
 
 /*
@@ -42,48 +34,17 @@ static const char *_sieve_setting_get_env_name
 
 const char *sieve_setting_get(const char *identifier)
 {
-	const char *value = mail_user_plugin_getenv
-		(_settings_user, _sieve_setting_get_env_name(NULL, identifier));
-
-	printf("GET(%s) = %s\n", identifier, value);
+	if ( sieve_settings_func == NULL )
+		return NULL;
 
-	return value;
+	return sieve_settings_func(_sieve_setting_get_env_name(NULL, identifier));
 }
 
 const char *sieve_setting_get_ext
 (const struct sieve_extension *ext, const char *identifier)
 {
-	return mail_user_plugin_getenv
-		(_settings_user, _sieve_setting_get_env_name(ext, identifier));
-}
-
-void sieve_setting_set(const char *identifier, const char *value)
-{
-	const char *setting;
-
-	if ( _settings_service == NULL ) return;
-
-	setting = t_strconcat("plugin/", 
-		_sieve_setting_get_env_name(NULL, identifier), "=", value, NULL);
-	
-	printf("%s\n", setting);
-
-	if ( master_service_set(_settings_service, setting) < 0 )
-		i_unreached();
-}
-
-void sieve_setting_set_ext
-(const struct sieve_extension *ext, const char *identifier, const char *value)
-{
-	const char *setting;
-
-	if ( _settings_service == NULL ) return;
-
-	setting = t_strconcat("plugin/", 
-		_sieve_setting_get_env_name(NULL, identifier), "=", value, NULL);
-	
-	printf("%s\n", setting);
+	if ( sieve_settings_func == NULL )
+		return NULL;
 
-	if ( master_service_set(_settings_service, setting) < 0 )
-		i_unreached();
+	return sieve_settings_func(_sieve_setting_get_env_name(ext, identifier));
 }
diff --git a/src/lib-sieve/sieve-settings.h b/src/lib-sieve/sieve-settings.h
index 1a869aa3ee253518e8f13988aa64f10ffb44894f..6ea82863bf0cb14d974c8f92ea8617b30b287056 100644
--- a/src/lib-sieve/sieve-settings.h
+++ b/src/lib-sieve/sieve-settings.h
@@ -6,22 +6,12 @@
 
 #include "sieve-common.h"
 
-struct mail_user;
-struct master_service;
+typedef const char *(*sieve_settings_func_t)(const char *identifier);
 
-void sieve_settings_init
-	(struct master_service *service, struct mail_user *user);
-
-/*
- * Retrieval
- */
+void sieve_settings_init(sieve_settings_func_t settings_func);
  
 const char *sieve_setting_get(const char *identifier);
 const char *sieve_setting_get_ext
 	(const struct sieve_extension *ext, const char *identifier);
 
-void sieve_setting_set(const char *identifier, const char *value);
-void sieve_setting_set_ext
-	(const struct sieve_extension *ext, const char *identifier, const char *value);
-
 #endif /* __SIEVE_SETTINGS_H */
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 3c6848bcf0fe8c17d5c52a5a528790bfe34930aa..4f7cac4482b63bdf91f821db3753f5e690e23934 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -6,6 +6,7 @@
 #include "istream.h"
 #include "buffer.h"
 
+#include "sieve-settings.h"
 #include "sieve-extensions.h"
 
 #include "sieve-script.h"
@@ -35,8 +36,10 @@
  * Main Sieve library interface
  */
 
-bool sieve_init(void)
+bool sieve_init(sieve_settings_func_t settings_func)
 {
+	sieve_settings_init(settings_func);
+
 	return sieve_extensions_init();
 }
 
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 5aa953d260455d472e4a0910568053a9c3285433..fbdcacd1a77a249592e0e681418894af1b8b8f37 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -12,6 +12,7 @@ struct sieve_binary;
 #include "sieve-config.h"
 #include "sieve-types.h"
 #include "sieve-error.h"
+#include "sieve-settings.h"
 
 /*
  * Main Sieve library interface
@@ -21,7 +22,7 @@ struct sieve_binary;
  *   Initializes the sieve engine. Must be called before any sieve functionality
  *   is used.
  */
-bool sieve_init(void);
+bool sieve_init(sieve_settings_func_t settings_func);
 
 /* sieve_deinit():
  *   Frees all memory allocated by the sieve engine. 
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 1e9bc0642c28a32b533e8c0f70ae587c164a25c0..c7240d1b24444517e9ec3b8a103fb0347871c2a8 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -34,6 +34,19 @@
  */
 
 static deliver_mail_func_t *next_deliver_mail;
+struct mail_user *lda_sieve_mail_user = NULL; 
+
+/*
+ * Settings handling
+ */
+
+static const char *lda_sieve_setting_get(const char *identifier)
+{
+	if ( lda_sieve_mail_user == NULL )
+		return NULL;
+
+	return mail_user_plugin_getenv(lda_sieve_mail_user, identifier);	
+}
 
 /*
  * Mail transmission
@@ -127,7 +140,7 @@ static const char *lda_sieve_get_default_path(struct mail_user *user)
 	const char *script_path;
 
 	/* Use global script path, if one exists */
-	script_path = sieve_setting_get("global_path");
+	script_path = mail_user_plugin_getenv(user, "global_path");
 	if (script_path == NULL) {
 		/* For backwards compatibility */
 		script_path = mail_user_plugin_getenv(user, "global_script_path");
@@ -564,7 +577,7 @@ static int lda_sieve_deliver_mail
 
 	*storage_r = NULL;
 
-	sieve_settings_init(NULL, mdctx->dest_user);
+	lda_sieve_mail_user = mdctx->dest_user;
 
 	extensions = sieve_setting_get("extensions");
 	if ( extensions != NULL ) {
@@ -665,7 +678,7 @@ static int lda_sieve_deliver_mail
 void sieve_plugin_init(void)
 {
 	/* Initialize Sieve engine */
-	sieve_init();
+	sieve_init(lda_sieve_setting_get);
 
 	/* Hook into the delivery process */
 	next_deliver_mail = deliver_mail;
diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c
index 298c729fd47fec2714ee5e11d39ebdd3a6ea4fff..9b72f8261e1836a4a83aa4293381b076e6f2c994 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();
+	sieve_tool_init(NULL, FALSE);
 	
 	/* Parse arguments */
 	scriptfile = recipient = sender = extensions = src_mailstore = dst_mailstore 
diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c
index dd28e7d2bb7edab62d13b05990189e74fea97222..ffba6f172ebf531a6d6454aeab3a9890b64348ed 100644
--- a/src/sieve-tools/sieve-test.c
+++ b/src/sieve-tools/sieve-test.c
@@ -124,7 +124,7 @@ int main(int argc, char **argv)
 	service = master_service_init("sieve-test", MASTER_SERVICE_FLAG_STANDALONE,
                       argc, argv);
 
-	sieve_tool_init(FALSE);
+	sieve_tool_init(NULL, FALSE);
 
 	t_array_init(&scriptfiles, 16);
 
diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c
index b30c035a987497107be90951ed3ad2d8ff861927..5143a4c748922afa7da4ee86291e2477506a0c0c 100644
--- a/src/sieve-tools/sievec.c
+++ b/src/sieve-tools/sievec.c
@@ -41,7 +41,7 @@ int main(int argc, char **argv) {
 	bool dump = FALSE;
 	const char *scriptfile, *outfile, *extensions;
 		
-	sieve_tool_init(TRUE);	
+	sieve_tool_init(NULL, TRUE);	
 		
 	scriptfile = outfile = extensions = NULL;
 	for (i = 1; i < argc; i++) {
diff --git a/src/sieve-tools/sieved.c b/src/sieve-tools/sieved.c
index f687a9cddd38a626d91a80c1b6b4332d4235d297..1b1e7c90ef887d981fb9bd163fa4e6e630408dd2 100644
--- a/src/sieve-tools/sieved.c
+++ b/src/sieve-tools/sieved.c
@@ -37,7 +37,7 @@ int main(int argc, char **argv) {
 	struct sieve_binary *sbin;
 	const char *binfile, *outfile, *extensions;
 	
-	sieve_tool_init(TRUE);
+	sieve_tool_init(NULL, TRUE);
 	
 	binfile = outfile = extensions = NULL;
 	for (i = 1; i < argc; i++) {
diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am
index d722fdab26df0321921ddd0d2ce3710bccbbbc81..fb8c9f5501c4f9bec8db3cc6675bf48167186759 100644
--- a/src/testsuite/Makefile.am
+++ b/src/testsuite/Makefile.am
@@ -45,6 +45,7 @@ tests = \
 
 testsuite_SOURCES = \
 	testsuite-common.c \
+	testsuite-settings.c \
 	testsuite-objects.c \
 	testsuite-substitutions.c \
 	testsuite-arguments.c \
@@ -62,6 +63,7 @@ testsuite_SOURCES = \
 
 noinst_HEADERS = \
 	testsuite-common.h \
+	testsuite-settings.h \
 	testsuite-objects.h \
 	testsuite-substitutions.h \
 	testsuite-arguments.h \
diff --git a/src/testsuite/testsuite-common.c b/src/testsuite/testsuite-common.c
index 2d8a8dd1f1ea8bc6c7560c9e38240ccd2d8ea194..21f573a9cb01efdd6e117dcd3fbc44eba98517c5 100644
--- a/src/testsuite/testsuite-common.c
+++ b/src/testsuite/testsuite-common.c
@@ -24,6 +24,7 @@
 #include "sieve-dump.h"
 
 #include "testsuite-common.h"
+#include "testsuite-settings.h"
 #include "testsuite-objects.h"
 #include "testsuite-log.h"
 #include "testsuite-script.h"
diff --git a/src/testsuite/testsuite-script.c b/src/testsuite/testsuite-script.c
index 7e4ea3b1e13da6c29b39ddcc5d6b8df7dfcb1822..27d51022e4ed5b766d250287cff591521e54c935 100644
--- a/src/testsuite/testsuite-script.c
+++ b/src/testsuite/testsuite-script.c
@@ -12,6 +12,7 @@
 #include "sieve-result.h"
 
 #include "testsuite-common.h"
+#include "testsuite-settings.h"
 #include "testsuite-log.h"
 #include "testsuite-result.h"
 
@@ -48,8 +49,10 @@ static struct sieve_binary *_testsuite_script_compile(const char *script_path)
 		sieve_dir = t_strdup_until(script_path, sieve_dir+1);
 
 	/* Currently needed for include (FIXME) */
-	sieve_setting_set("dir", t_strconcat(sieve_dir, "included", NULL));
-    sieve_setting_set("global_dir", t_strconcat(sieve_dir, "included-global", NULL));
+	testsuite_setting_set
+		("sieve_dir", t_strconcat(sieve_dir, "included", NULL));
+	testsuite_setting_set
+		("sieve_global_dir", t_strconcat(sieve_dir, "included-global", NULL));
 	
 	if ( (sbin = sieve_compile(script_path, NULL, testsuite_log_ehandler)) == NULL )
 		return NULL;
diff --git a/src/testsuite/testsuite-settings.c b/src/testsuite/testsuite-settings.c
new file mode 100644
index 0000000000000000000000000000000000000000..a038529f1c75de12202108d6d282c5fa696cc358
--- /dev/null
+++ b/src/testsuite/testsuite-settings.c
@@ -0,0 +1,72 @@
+#include "lib.h"
+#include "hash.h"
+#include "imem.h"
+#include "strfuncs.h"
+
+#include "sieve-common.h"
+#include "sieve-settings.h"
+
+#include "testsuite-common.h"
+#include "testsuite-settings.h"
+
+struct testsuite_setting {
+	char *identifier;
+	char *value;
+};
+
+static struct hash_table *settings; 
+
+void testsuite_settings_init(void)
+{
+	settings = hash_table_create
+		(default_pool, default_pool, 0, str_hash, (hash_cmp_callback_t *)strcmp);
+}
+
+void testsuite_settings_deinit(void)
+{
+	struct hash_iterate_context *itx = 
+		hash_table_iterate_init(settings);
+	void *key; 
+	void *value;
+	
+	while ( hash_table_iterate(itx, &key, &value) ) {
+		struct testsuite_setting *setting = (struct testsuite_setting *) value;
+
+		i_free(setting->identifier);
+		i_free(setting->value);
+		i_free(setting);
+	}
+
+	hash_table_iterate_deinit(&itx); 	
+
+	hash_table_destroy(&settings);
+}
+
+const char *testsuite_setting_get(const char *identifier)
+{
+	struct testsuite_setting *setting = (struct testsuite_setting *) 
+		hash_table_lookup(settings, identifier);
+
+	if ( setting == NULL ) {
+		return NULL;
+	}
+
+	return setting->value;
+}
+
+void testsuite_setting_set(const char *identifier, const char *value)
+{
+	struct testsuite_setting *setting = (struct testsuite_setting *) 
+		hash_table_lookup(settings, identifier);
+
+	if ( setting != NULL ) {
+		i_free(setting->value);
+		setting->value = i_strdup(value);
+	} else {
+		setting = i_new(struct testsuite_setting, 1);
+		setting->identifier = i_strdup(identifier);
+		setting->value = i_strdup(value);
+	
+		hash_table_insert(settings, (void *) identifier, (void *) setting);
+	}
+}
diff --git a/src/testsuite/testsuite-settings.h b/src/testsuite/testsuite-settings.h
new file mode 100644
index 0000000000000000000000000000000000000000..69e31c453b13d536b5ae0dbdc5521ef1ceaf9ff5
--- /dev/null
+++ b/src/testsuite/testsuite-settings.h
@@ -0,0 +1,12 @@
+#ifndef __TESTSUITE_SETTINGS_H
+#define __TESTSUITE_SETTINGS_H
+
+#include "sieve-common.h"
+
+void testsuite_settings_init(void);
+void testsuite_settings_deinit(void);
+
+const char *testsuite_setting_get(const char *identifier);
+void testsuite_setting_set(const char *identifier, const char *value);
+
+#endif /* __TESTSUITE_SETTINGS_H */
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index ea053e9f184426f57c4239e00876a0bd6fb70fc4..f21e82cea5030c6f471783b7aabd63d68524feba 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -25,6 +25,7 @@
 #include "sieve-tool.h"
 
 #include "testsuite-common.h"
+#include "testsuite-settings.h"
 #include "testsuite-result.h"
 #include "testsuite-message.h"
 #include "testsuite-smtp.h"
@@ -50,12 +51,11 @@ const struct sieve_script_env *testsuite_scriptenv;
  * Testsuite initialization 
  */
 
-static void testsuite_tool_init
-(struct master_service *service, struct mail_user *mail_user, const char *extensions) 
+static void testsuite_tool_init(const char *extensions) 
 {
-	sieve_settings_init(service, mail_user);
+	testsuite_settings_init();
 
-	sieve_tool_init(FALSE);
+	sieve_tool_init(testsuite_setting_get, FALSE);
 
 	sieve_extensions_set_string(extensions);
 	(void) sieve_extension_register(&testsuite_extension, TRUE);
@@ -68,6 +68,8 @@ static void testsuite_tool_deinit(void)
 	testsuite_deinit();
 	
 	sieve_tool_deinit();
+
+	testsuite_settings_deinit();
 }
 
 /*
@@ -192,7 +194,7 @@ int main(int argc, char **argv)
 		(service, &input, NULL, service_flags);
 
 	/* Initialize testsuite */
-	testsuite_tool_init(service, mail_user_dovecot, extensions);
+	testsuite_tool_init(extensions);
 
 	printf("Test case: %s:\n\n", scriptfile);
 
@@ -205,8 +207,10 @@ int main(int argc, char **argv)
 		sieve_dir = t_strdup_until(scriptfile, sieve_dir+1);
 
 	/* Currently needed for include (FIXME) */
-	sieve_setting_set("dir", t_strconcat(sieve_dir, "included", NULL));
-	sieve_setting_set("global_dir", t_strconcat(sieve_dir, "included-global", NULL));
+	testsuite_setting_set
+		("sieve_dir", t_strconcat(sieve_dir, "included", NULL));
+	testsuite_setting_set
+		("sieve_global_dir", t_strconcat(sieve_dir, "included-global", NULL));
 
 	/* Compile sieve script */
 	if ( (sbin = sieve_tool_script_compile(scriptfile, NULL)) != NULL ) {