diff --git a/TODO b/TODO
index ce4533369b0ab7cdbd70f05f443a52cb203cfc7a..6f2d23202dbf12cc80bbc9df98801d789b108305 100644
--- a/TODO
+++ b/TODO
@@ -91,8 +91,6 @@ Next (in order of descending priority/precedence):
 	  through IMAP (no specification for something like this is available; we will 
 	  have to provide our own)
 * Variables extension: implement compile time evaluation of constant values
-* Make the engine and its extensions much more configurable. Possibly this can 
-  be merged with Dovecot's new master config implementation.
 * Add development documentation, i.e. comment on library functions and document
   the binary and byte-code format. 
 * Give the byte code format some more thought, it is currently quite rough and
diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c
index 61d95f0e25ffca12527b71923d50a4092189bf01..a14d6c059da100dbd24f83d8efdeba181596d97f 100644
--- a/src/lib-sieve-tool/sieve-tool.c
+++ b/src/lib-sieve-tool/sieve-tool.c
@@ -31,13 +31,20 @@ struct sieve_instance *sieve_instance;
  * Settings management
  */
 
-static const char *sieve_tool_get_setting
+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 = {
+const char *sieve_tool_get_homedir
+(void *context ATTR_UNUSED)
+{
+	return getenv("HOME");
+}
+
+const struct sieve_callbacks sieve_tool_callbacks = {
+	sieve_tool_get_homedir,
 	sieve_tool_get_setting
 };
 
diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h
index dacda5e51502f7ebd7db4f71f169205238ea0157..0958aa2c4a7e492874526b05474afc9cc8a0cbea 100644
--- a/src/lib-sieve-tool/sieve-tool.h
+++ b/src/lib-sieve-tool/sieve-tool.h
@@ -14,6 +14,11 @@
 
 struct sieve_instance *sieve_instance;
 
+const char *sieve_tool_get_setting(void *context, const char *identifier);
+const char *sieve_tool_get_homedir(void *context);
+
+const struct sieve_callbacks sieve_tool_callbacks;
+
 /*
  * Initialization
  */
diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index 0941f9d068227c5825d8c9b2ea6176541afe56ce..ce0a7f7165920bf6a6b7ffd1a90bf0e4738fcc53 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -79,9 +79,7 @@ const char *ext_include_get_script_directory
 	case EXT_INCLUDE_LOCATION_PERSONAL:
  		sieve_dir = sieve_get_setting(svinst, "sieve_dir");
 
-		home = sieve_get_setting(svinst, "home");
-
-		if ( home == NULL ) home = getenv("HOME");
+		home = sieve_get_homedir(svinst);
 
 		if ( sieve_dir == NULL ) {
 			if ( home == NULL )	{		
diff --git a/src/lib-sieve/sieve-settings.h b/src/lib-sieve/sieve-settings.h
index e0cd91187c9ca2fcc1e7e8f85042296325930a6a..2acf1f487f6e4a36533e3785a23c56ccd03c7141 100644
--- a/src/lib-sieve/sieve-settings.h
+++ b/src/lib-sieve/sieve-settings.h
@@ -6,6 +6,10 @@
 
 #include "sieve-common.h"
 
+/*
+ * Settings
+ */
+
 static inline const char *sieve_get_setting
 (struct sieve_instance *svinst, const char *identifier)
 {
@@ -25,4 +29,19 @@ bool sieve_get_int_setting
 (struct sieve_instance *svinst, const char *identifier,
 	long long int *value_r);
 
+/*
+ * Home directory
+ */
+
+static inline const char *sieve_get_homedir
+(struct sieve_instance *svinst)
+{
+	const struct sieve_callbacks *callbacks = svinst->callbacks;
+
+	if ( callbacks == NULL || callbacks->get_homedir == NULL )
+		return NULL;
+
+	return callbacks->get_homedir(svinst->context);
+}
+
 #endif /* __SIEVE_SETTINGS_H */
diff --git a/src/lib-sieve/sieve-types.h b/src/lib-sieve/sieve-types.h
index ea4445b99ebc8efaa174b7ee45b3077826a3e05b..519d2354d0a3355d801825932c7cac858fd1aae3 100644
--- a/src/lib-sieve/sieve-types.h
+++ b/src/lib-sieve/sieve-types.h
@@ -30,6 +30,7 @@ struct sieve_exec_status;
  */
 
 struct sieve_callbacks {
+	const char *(*get_homedir)(void *context);
 	const char *(*get_setting)(void *context, const char *identifier);
 };
 
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 6f615c1db3ae4a7b5872a1be1d0cd722e87a8145..9f99a4ec14482d77a8d2aea4288e9d288123db53 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -38,6 +38,21 @@ static deliver_mail_func_t *next_deliver_mail;
  * Settings handling
  */
 
+static const char *lda_sieve_get_homedir
+(void *context)
+{
+	struct mail_user *mail_user = (struct mail_user *) context;
+	const char *home = NULL;
+
+	if ( mail_user == NULL )
+		return NULL;
+
+	if ( mail_user_get_home(mail_user, &home) <= 0 )
+		return NULL;
+
+	return home;
+}
+
 static const char *lda_sieve_get_setting
 (void *context, const char *identifier)
 {
@@ -50,6 +65,7 @@ static const char *lda_sieve_get_setting
 }
 
 static const struct sieve_callbacks lda_sieve_callbacks = {
+	lda_sieve_get_homedir,
     lda_sieve_get_setting
 };
 
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index 3c6a4ee2e91a32580008b746c078e4f74f03e5b9..4e5b638bb1bed02fc479a1fad79d757c4eeb01f7 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -51,6 +51,7 @@ const struct sieve_script_env *testsuite_scriptenv;
  */
 
 static const struct sieve_callbacks testsuite_sieve_callbacks = {
+	sieve_tool_get_homedir,
 	testsuite_setting_get
 };