diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c
index 390f5107c97b0fe351ee82782a4896b1bb677fd0..61d95f0e25ffca12527b71923d50a4092189bf01 100644
--- a/src/lib-sieve-tool/sieve-tool.c
+++ b/src/lib-sieve-tool/sieve-tool.c
@@ -27,8 +27,18 @@ static struct ioloop *ioloop;
 
 struct sieve_instance *sieve_instance;
 
-static const struct sieve_callbacks sieve_callbacks = {
-	NULL
+/*
+ * Settings management
+ */
+
+static const char *sieve_tool_get_setting
+(void *context ATTR_UNUSED, const char *identifier)
+{
+	return getenv(t_str_ucase(identifier));
+}
+
+static const struct sieve_callbacks sieve_tool_callbacks = {
+	sieve_tool_get_setting
 };
 
 /*
@@ -57,7 +67,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
 /* HACK */
 static bool _init_lib = FALSE;
 
-void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib) 
+void sieve_tool_init(const struct sieve_callbacks *callbacks, bool init_lib) 
 {
 	_init_lib = init_lib;
 
@@ -73,13 +83,14 @@ void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib)
 		lib_signals_ignore(SIGALRM, FALSE);
 	}
 
-	if ( (sieve_instance=sieve_init(&sieve_callbacks, NULL)) == NULL )
+	if ( callbacks == NULL ) callbacks = &sieve_tool_callbacks;
+
+	if ( (sieve_instance=sieve_init(callbacks, NULL)) == NULL )
 		i_fatal("failed to initialize sieve implementation\n");
 }
 
 void sieve_tool_deinit(void)
 {
-	sieve_deinit();
 	sieve_deinit(&sieve_instance);
 
 	if ( _init_lib ) {
diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h
index 80f12ef606cb51eff9087724dc1b915bba6d20ad..dacda5e51502f7ebd7db4f71f169205238ea0157 100644
--- a/src/lib-sieve-tool/sieve-tool.h
+++ b/src/lib-sieve-tool/sieve-tool.h
@@ -18,7 +18,7 @@ struct sieve_instance *sieve_instance;
  * Initialization
  */
 
-void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib);
+void sieve_tool_init(const struct sieve_callbacks *callbacks, bool init_lib);
 void sieve_tool_deinit(void);
 
 /*
diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am
index fed7eb2f6c0f8c9e34d71fc75d41d8b27b10157c..fcf02ea48058feea8eddec351914083c5552da7e 100644
--- a/src/lib-sieve/Makefile.am
+++ b/src/lib-sieve/Makefile.am
@@ -72,7 +72,6 @@ libsieve_la_LIBADD = $(plugins)
 libsieve_la_SOURCES = \
 	rfc2822.c \
 	sieve-limits.c \
-	sieve-settings.c \
 	sieve-message.c \
 	sieve-smtp.c \
 	sieve-lexer.c \
@@ -110,7 +109,6 @@ noinst_HEADERS = \
 	sieve-types.h \
 	sieve-common.h \
 	sieve-limits.h \
-	sieve-settings.h \
 	sieve-message.h \
 	sieve-smtp.h \
 	sieve-lexer.h \
diff --git a/src/lib-sieve/plugins/include/cmd-include.c b/src/lib-sieve/plugins/include/cmd-include.c
index 8e681652916b006f50b2bf9ece0ce069832e3e88..473c9e6c01689ef73e3cb127b359a457c4589ae7 100644
--- a/src/lib-sieve/plugins/include/cmd-include.c
+++ b/src/lib-sieve/plugins/include/cmd-include.c
@@ -234,7 +234,7 @@ static bool cmd_include_validate
 	}
 		
 	script_path = ext_include_get_script_directory
-		(ctx_data->location, script_name);
+		(this_ext, ctx_data->location, script_name);
 	if ( script_path == NULL ) {
 		sieve_argument_validate_error(valdtr, arg,
 			"include: %s location for included script '%s' is unavailable "
diff --git a/src/lib-sieve/plugins/include/ext-include-binary.c b/src/lib-sieve/plugins/include/ext-include-binary.c
index 3c02dc48d299c52c6532be6a9a0ee4cde276acd0..9d6711bf26257049788939ecd0403c7c781b8363 100644
--- a/src/lib-sieve/plugins/include/ext-include-binary.c
+++ b/src/lib-sieve/plugins/include/ext-include-binary.c
@@ -288,7 +288,8 @@ static bool ext_include_binary_open
 		}		
 		
 		/* Can we find/open the script dependency ? */
-		script_dir = ext_include_get_script_directory(location, str_c(script_name));		
+		script_dir = ext_include_get_script_directory
+			(ext, location, str_c(script_name));		
 		if ( script_dir == NULL || 
 			!(script=sieve_script_create_in_directory
 				(ext->svinst, script_dir, str_c(script_name), NULL, NULL)) ) {
diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index 4445c9b37ed372aefbcecd7c9ab5d0d31295e240..de16f8b81984716322c7734a2411253120cd271b 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -7,7 +7,6 @@
 #include "home-expand.h"
 
 #include "sieve-common.h"
-#include "sieve-settings.h"
 #include "sieve-error.h"
 #include "sieve-script.h"
 #include "sieve-ast.h"
@@ -69,16 +68,21 @@ struct ext_include_interpreter_context {
  */
 
 const char *ext_include_get_script_directory
-(enum ext_include_script_location location, const char *script_name)
+(const struct sieve_extension *ext, enum ext_include_script_location location,
+   const char *script_name)
 {
-	const char *home, *sieve_dir;
+	struct sieve_instance *svinst = ext->svinst;
+	const char *home = NULL, *sieve_dir = NULL;
 
 	switch ( location ) {
 	case EXT_INCLUDE_LOCATION_PERSONAL:
-		sieve_dir = sieve_setting_get("dir");
-		home = getenv("HOME");
+ 		sieve_dir = sieve_get_setting(svinst, "sieve_dir");
+
+		if ( sieve_dir == NULL ) {
+			home = sieve_get_setting(svinst, "home");
+
+			if ( home == NULL ) home = getenv("HOME");
 
-		if (sieve_dir == NULL) {
 			if ( home == NULL )	{		
 				sieve_sys_error(
 					"include: sieve_dir and home not set for :personal script include "	
@@ -94,7 +98,7 @@ const char *ext_include_get_script_directory
 
 		break;
    	case EXT_INCLUDE_LOCATION_GLOBAL:
-		sieve_dir = sieve_setting_get("global_dir");
+		sieve_dir = sieve_get_setting(svinst, "global_dir");
 
 		if (sieve_dir == NULL) {
 			sieve_sys_error(
@@ -105,7 +109,7 @@ const char *ext_include_get_script_directory
 
 		break;
 	default:
-		return NULL;
+		break;
 	}
 
 	return sieve_dir;
diff --git a/src/lib-sieve/plugins/include/ext-include-common.h b/src/lib-sieve/plugins/include/ext-include-common.h
index ac367694cf2ccfd6c936cb4cf722c9933b47c168..6eb10cdc9a4362e71fd85d787945ae2ae38ab806 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.h
+++ b/src/lib-sieve/plugins/include/ext-include-common.h
@@ -52,16 +52,6 @@ static inline const char *ext_include_script_location_name
 extern const struct sieve_extension_def include_extension;
 extern const struct sieve_binary_extension include_binary_ext;
 
-struct ext_include_context {
-	const struct sieve_extension *var_ext;
-};
-
-static inline struct ext_include_context *ext_include_get_context
-(const struct sieve_extension *ext)
-{
-	return (struct ext_include_context *) ext->context;
-}
-
 /* 
  * Commands 
  */
@@ -93,12 +83,26 @@ extern const struct sieve_operation_def global_operation;
  */
 
 const char *ext_include_get_script_directory
-	(enum ext_include_script_location location, const char *script_name);
+	(const struct sieve_extension *ext,
+		enum ext_include_script_location location, const char *script_name);
 
 /* 
  * Context 
  */
  
+/* Extension context */
+
+struct ext_include_context {
+	/* Extension dependencies */
+	const struct sieve_extension *var_ext;
+};
+
+static inline struct ext_include_context *ext_include_get_context
+(const struct sieve_extension *ext)
+{
+	return (struct ext_include_context *) ext->context;
+}
+
 /* AST Context */
 
 struct ext_include_ast_context {
diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c
index edaa23c3bc3baeb02873979de12efd47e3d17a5c..90b40ad80c5419e09e900317cd83069795347005 100644
--- a/src/lib-sieve/plugins/include/ext-include.c
+++ b/src/lib-sieve/plugins/include/ext-include.c
@@ -84,8 +84,10 @@ static bool ext_include_load
 (const struct sieve_extension *ext, void **context)
 {
 	struct ext_include_context *ctx = i_new(struct ext_include_context, 1);
-	
+
+	/* Extension dependencies */	
 	ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst);
+
 	*context = ctx;
 
 	return TRUE;
@@ -95,6 +97,7 @@ static void ext_include_unload
 (const struct sieve_extension *ext)
 {
 	struct ext_include_context *ctx = (struct ext_include_context *) ext->context;
+
 	i_free(ctx);
 }
 
diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
index fe7e8a09b4f857dd140d12c7ace727b8757595ed..367b11f3e5f83943a30e230337c2f618022aaf7c 100644
--- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c
+++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
@@ -13,7 +13,6 @@
  
 #include "sieve-common.h"
 
-#include "sieve-settings.h"
 #include "sieve-code.h"
 #include "sieve-address.h"
 #include "sieve-extensions.h"
@@ -51,7 +50,7 @@ static struct sieve_operand_def subaddress_operand;
 
 static bool ext_subaddress_load
 	(const struct sieve_extension *ext, void **context);
-static bool ext_subaddress_unload
+static void ext_subaddress_unload
 	(const struct sieve_extension *ext);
 static bool ext_subaddress_validator_load
 	(const struct sieve_extension *ext, struct sieve_validator *validator);
@@ -70,7 +69,7 @@ static bool ext_subaddress_load
 (const struct sieve_extension *ext, void **context)
 {
 	struct ext_subaddress_config *config;
-	const char *sep = getenv("SIEVE_SUBADDRESS_SEP");
+	const char *sep = sieve_get_setting(ext->svinst, "sieve_subaddress_sep");
 
 	if ( sep == NULL )
 		sep = SUBADDRESS_DEFAULT_SEP;
@@ -83,7 +82,7 @@ static bool ext_subaddress_load
 	return TRUE;
 }
 
-static bool ext_subaddress_unload
+static void ext_subaddress_unload
 (const struct sieve_extension *ext)
 {
 	struct ext_subaddress_config *config =
diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h
index fbd44044af42dbaced66a8740d3ff0f87252a343..e92f83d4be96d3a61fc11864d312acde8e91a204 100644
--- a/src/lib-sieve/sieve-common.h
+++ b/src/lib-sieve/sieve-common.h
@@ -15,9 +15,9 @@
  * Types
  */
 
-typedef size_t        sieve_size_t; 
-typedef uint32_t      sieve_offset_t;
-typedef uint32_t      sieve_number_t;
+typedef size_t sieve_size_t; 
+typedef uint32_t sieve_offset_t;
+typedef uint32_t sieve_number_t;
 
 #define SIEVE_MAX_NUMBER ((sieve_number_t) -1)
 
@@ -135,13 +135,30 @@ bool sieve_validate
  */
 
 struct sieve_instance {
+	/* Main engine pool */
 	pool_t pool;
 
+	/* Callbacks */
 	const struct sieve_callbacks *callbacks;
-
 	void *context;
 
+	/* Extension registry */
 	struct sieve_extension_registry *ext_reg;
 };
 
+/*
+ * Settings
+ */
+
+static inline const char *sieve_get_setting
+(struct sieve_instance *svinst, const char *identifier)
+{
+	const struct sieve_callbacks *callbacks = svinst->callbacks;
+
+	if ( callbacks == NULL || callbacks->get_setting == NULL )
+		return NULL;
+
+	return callbacks->get_setting(svinst->context, identifier);
+}
+
 #endif /* __SIEVE_COMMON_H */
diff --git a/src/lib-sieve/sieve-settings.c b/src/lib-sieve/sieve-settings.c
deleted file mode 100644
index afe0ccaefda605cb324e14ff75ffea4676b77b0c..0000000000000000000000000000000000000000
--- a/src/lib-sieve/sieve-settings.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file 
- */
-
-#include "lib.h"
-
-#include "sieve-common.h"
-#include "sieve-extensions.h"
-
-#include "sieve-settings.h"
-
-static sieve_settings_func_t sieve_settings_func = NULL;
-
-/*
- * Initialization
- */
-
-void sieve_settings_init(sieve_settings_func_t settings_func)
-{
-	sieve_settings_func = settings_func;
-}
-
-/*
- * Retrieval
- */
- 
-static const char *_sieve_setting_get_env_name
-(const struct sieve_extension *ext, const char *identifier)
-{
-	if ( ext == NULL )
-		return t_str_lcase(t_strconcat("sieve_", identifier, NULL));
-	
-	return t_str_lcase(t_strconcat("sieve_", ext->name, "_", identifier, NULL));
-}
-
-const char *sieve_setting_get(const char *identifier)
-{
-	if ( sieve_settings_func == NULL )
-		return NULL;
-
-	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)
-{
-	if ( sieve_settings_func == NULL )
-		return NULL;
-
-	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
deleted file mode 100644
index 6ea82863bf0cb14d974c8f92ea8617b30b287056..0000000000000000000000000000000000000000
--- a/src/lib-sieve/sieve-settings.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file 
- */
-
-#ifndef __SIEVE_SETTINGS_H
-#define __SIEVE_SETTINGS_H
-
-#include "sieve-common.h"
-
-typedef const char *(*sieve_settings_func_t)(const char *identifier);
-
-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);
-
-#endif /* __SIEVE_SETTINGS_H */
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index a4da11a2f2eaf89cd1029c758697fb07e6455e14..2da9f3107df2100434e70ed350c26900e6b6ef8a 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -6,7 +6,6 @@
 #include "istream.h"
 #include "buffer.h"
 
-#include "sieve-settings.h"
 #include "sieve-extensions.h"
 
 #include "sieve-script.h"
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 6272fc16f40ecd4a0682c6bf5e73448064d4836f..b13e066b92de0207e45c9e32ba4d27e0ef9d7262 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -12,7 +12,6 @@ struct sieve_binary;
 #include "sieve-config.h"
 #include "sieve-types.h"
 #include "sieve-error.h"
-#include "sieve-settings.h"
 
 /*
  * Main Sieve library interface
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 1b4126c4a84e0f2b87e8684c41135f6e563dc763..357b9b782a85a9bd17420b9cb2856af32a9b3a43 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -12,7 +12,6 @@
 #include "lda-settings.h"
 
 #include "sieve.h"
-#include "sieve-settings.h"
 
 #include "lda-sieve-plugin.h"
 
@@ -54,7 +53,6 @@ static const struct sieve_callbacks lda_sieve_callbacks = {
     lda_sieve_get_setting
 };
 
-
 /*
  * Mail transmission
  */
@@ -603,7 +601,6 @@ static int lda_sieve_deliver_mail
 	ARRAY_TYPE (const_string) scripts_before;
 	ARRAY_TYPE (const_string) scripts_after;
 	bool debug = mdctx->dest_user->mail_debug;
-	const char *extensions = NULL;
 	int ret = 0;
 
 	*storage_r = NULL;
diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c
index 2de0e9570162145bc0ced5bb334cece7d982ee05..f6bd4b3e04c4c533d0d7144f2fe92b9c68a3d59e 100644
--- a/src/sieve-tools/sievec.c
+++ b/src/sieve-tools/sievec.c
@@ -72,7 +72,7 @@ int main(int argc, char **argv) {
 	}
 	
 	if ( outfile == NULL && dump )
-		outfile = "-";
+		outfile = "-";	
 
 	if ( extensions != NULL ) {
 		sieve_set_extensions(sieve_instance, extensions);
diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am
index fb8c9f5501c4f9bec8db3cc6675bf48167186759..740d0a72b85b09e27d247cca8b6d8d2f7cb0ab11 100644
--- a/src/testsuite/Makefile.am
+++ b/src/testsuite/Makefile.am
@@ -56,6 +56,7 @@ testsuite_SOURCES = \
 	testsuite-smtp.c \
 	testsuite-mailstore.c \
 	testsuite-binary.c \
+	testsuite-settings.c \
 	$(commands) \
 	$(tests) \
 	ext-testsuite.c \
@@ -73,5 +74,6 @@ noinst_HEADERS = \
 	testsuite-result.h \
 	testsuite-smtp.h \
 	testsuite-mailstore.h \
-	testsuite-binary.h
+	testsuite-binary.h \
+	testsuite-settings.h
 
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index 82ee2af0ec37e54ce0e176e52db3c33e3229a8b0..eb9583d56983d1cc6c7af92bc5488c467777619b 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -51,11 +51,15 @@ const struct sieve_script_env *testsuite_scriptenv;
  * Testsuite initialization 
  */
 
+static const struct sieve_callbacks testsuite_sieve_callbacks = {
+	testsuite_setting_get
+};
+
 static void testsuite_tool_init(const char *extensions) 
 {
 	testsuite_settings_init();
 
-	sieve_tool_init(testsuite_setting_get, FALSE);
+	sieve_tool_init(&testsuite_sieve_callbacks);
 
 	sieve_extensions_set_string(sieve_instance, extensions);