diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index 56c96a1d7fe266cd1735df30f821db7b0906792b..6317b0db762b8009a652d1fc73ff749af3bdbd06 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -65,6 +65,74 @@ struct ext_include_interpreter_context {
 	bool returned;
 };
 
+/*
+ * Extension configuration
+ */
+
+/* Extension hooks */
+
+bool ext_include_load
+(const struct sieve_extension *ext, void **context)
+{
+	struct sieve_instance *svinst = ext->svinst;
+	struct ext_include_context *ctx;
+	const char *global_dir, *personal_dir, *home;
+
+	if ( *context != NULL ) {
+		ext_include_unload(ext);
+	}
+
+	/* Get directory for :global scripts */
+	global_dir = sieve_setting_get(svinst, "sieve_global_dir");
+
+	if ( global_dir == NULL && svinst->debug ) {
+		sieve_sys_debug(svinst, "include: sieve_global_dir is not set; "
+			"it is currently not possible to include `:global' scripts.");
+	}
+
+	/* Get directory for :personal scripts */
+ 	personal_dir = sieve_setting_get(svinst, "sieve_dir");
+
+	home = sieve_environment_get_homedir(svinst);
+
+	if ( personal_dir == NULL ) {
+		if ( home == NULL )	{
+			if ( svinst->debug ) {		
+				sieve_sys_debug(svinst, "include: sieve_dir is not set "
+					"and no home directory is set for the default `~/sieve'; "
+					"it is currently not possible to include `:personal' scripts.");
+			}
+		} else {
+			personal_dir = "~/sieve"; 
+		}
+	}
+
+	if ( home != NULL )
+		personal_dir = home_expand_tilde(personal_dir, home);	
+
+	ctx = i_new(struct ext_include_context, 1);
+	ctx->personal_dir = i_strdup(personal_dir);
+	ctx->global_dir = i_strdup(global_dir);
+
+	/* Extension dependencies */	
+	ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst);
+
+	*context = (void *)ctx;
+
+	return TRUE;
+}
+
+void ext_include_unload
+(const struct sieve_extension *ext)
+{
+	struct ext_include_context *ctx =
+		(struct ext_include_context *) ext->context;
+
+	i_free(ctx->personal_dir);
+	i_free(ctx->global_dir);
+	i_free(ctx);
+}
+
 /* 
  * Script access 
  */
@@ -74,42 +142,36 @@ const char *ext_include_get_script_directory
    const char *script_name)
 {
 	struct sieve_instance *svinst = ext->svinst;
-	const char *home = NULL, *sieve_dir = NULL;
+	struct ext_include_context *ctx =
+		(struct ext_include_context *) ext->context;
+	const char *sieve_dir;
 
 	switch ( location ) {
 	case EXT_INCLUDE_LOCATION_PERSONAL:
- 		sieve_dir = sieve_setting_get(svinst, "sieve_dir");
 
-		home = sieve_environment_get_homedir(svinst);
-
-		if ( sieve_dir == NULL ) {
-			if ( home == NULL )	{		
-				sieve_sys_error(svinst,
-					"include: sieve_dir and home not set for :personal script include "	
-					"(wanted script '%s')", str_sanitize(script_name, 80));
-				return NULL;
-			}
-
-			sieve_dir = "~/sieve"; 
+		if ( ctx->personal_dir == NULL ) {
+			sieve_sys_error(svinst, "include: sieve_dir is unconfigured; "
+				"include of `:personal' script `%s' is therefore not possible",
+				str_sanitize(script_name, 80));
+			return NULL;
 		}
 
-		if ( home != NULL )
-			sieve_dir = home_expand_tilde(sieve_dir, home);	
-
+		sieve_dir = ctx->personal_dir;
 		break;
-   	case EXT_INCLUDE_LOCATION_GLOBAL:
-		sieve_dir = sieve_setting_get(svinst, "sieve_global_dir");
 
-		if (sieve_dir == NULL) {
-			sieve_sys_error(svinst,
-				"include: sieve_global_dir not set for :global script include "	
-				"(wanted script '%s')", str_sanitize(script_name, 80));
+	case EXT_INCLUDE_LOCATION_GLOBAL:
+
+		if ( ctx->global_dir == NULL ) {
+			sieve_sys_error(svinst, "include: sieve_global_dir is unconfigured; "
+				"include of `:global' script `%s' is therefore not possible",
+				str_sanitize(script_name, 80));
 			return NULL;
 		}
 
+		sieve_dir = ctx->global_dir;
 		break;
 	default:
-		break;
+		i_unreached();
 	}
 
 	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 6e7659d22728448c3bf18d6467b2eebd31705b88..74d906d0a14f209801809882d4641642e29ef36c 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.h
+++ b/src/lib-sieve/plugins/include/ext-include-common.h
@@ -52,6 +52,11 @@ 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;
 
+bool ext_include_load
+	(const struct sieve_extension *ext, void **context);
+void ext_include_unload
+	(const struct sieve_extension *ext);
+
 /* 
  * Commands 
  */
@@ -95,6 +100,10 @@ const char *ext_include_get_script_directory
 struct ext_include_context {
 	/* Extension dependencies */
 	const struct sieve_extension *var_ext;
+
+	/* Configuration */
+ 	char *global_dir;
+	char *personal_dir;
 };
 
 static inline struct ext_include_context *ext_include_get_context
diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c
index 2aeefa5c66ced9e14f2896f42b90c4b1c82a79e2..12087472263a9effb441e789546f2bc61e74277e 100644
--- a/src/lib-sieve/plugins/include/ext-include.c
+++ b/src/lib-sieve/plugins/include/ext-include.c
@@ -50,10 +50,6 @@ static const struct sieve_operation_def *ext_include_operations[] = {
  
 /* Forward declaration */
 
-static bool ext_include_load
-	(const struct sieve_extension *ext, void **context);
-static void ext_include_unload
-	(const struct sieve_extension *ext);
 static bool ext_include_validator_load
 	(const struct sieve_extension *ext, struct sieve_validator *validator);
 static bool ext_include_generator_load
@@ -80,35 +76,6 @@ const struct sieve_extension_def include_extension = {
 	SIEVE_EXT_DEFINE_NO_OPERANDS
 };
 
-/* Extension hooks */
-
-static bool ext_include_load
-(const struct sieve_extension *ext, void **context)
-{
-	struct ext_include_context *ctx;
-
-	if ( *context != NULL ) {
-		ctx = (struct ext_include_context *) ext->context;
-	} else {
-		ctx =  i_new(struct ext_include_context, 1);
-	}
-
-	/* Extension dependencies */	
-	ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst);
-
-	*context = ctx;
-
-	return TRUE;
-}
-
-static void ext_include_unload
-(const struct sieve_extension *ext)
-{
-	struct ext_include_context *ctx = (struct ext_include_context *) ext->context;
-
-	i_free(ctx);
-}
-
 static bool ext_include_validator_load
 (const struct sieve_extension *ext, struct sieve_validator *valdtr)
 {
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index 966e430c51a699086d14c51d388793f566df91ef..5d2c2b88cf49c4b47a6f8615c50740254f6af255 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -49,7 +49,7 @@ const struct sieve_script_env *testsuite_scriptenv;
 static void print_help(void)
 {
 	printf(
-"Usage: testsuite [-E] [-d <dump-filename>]\n"
+"Usage: testsuite [-D] [-E] [-d <dump-filename>]\n"
 "                 [-t <trace-filename>] [-T <trace-option>]\n"
 "                 [-P <plugin>] [-x <extensions>]\n"
 "                 <scriptfile>\n"
@@ -91,7 +91,7 @@ int main(int argc, char **argv)
 	int ret, c;
 
 	sieve_tool = sieve_tool_init
-		("testsuite", &argc, &argv, "d:t:T:EP:", TRUE);
+		("testsuite", &argc, &argv, "d:t:T:EDP:", TRUE);
 
 	/* Parse arguments */
 	scriptfile = dumpfile = tracefile = NULL;
@@ -136,16 +136,10 @@ int main(int argc, char **argv)
 	/* Initialize mail user */
 	sieve_tool_set_homedir(sieve_tool, t_abspath(""));
 	
-	/* Finish tool initialization */
-	svinst = sieve_tool_init_finish(sieve_tool, FALSE);
-		
-	testsuite_init(svinst, log_stdout);
+	/* Initialize settings environment */
 	testsuite_settings_init();
 
-	printf("Test case: %s:\n\n", scriptfile);
-
-	/* Initialize environment */
-
+	/* Currently needed for include (FIXME) */
 	sieve_dir = strrchr(scriptfile, '/');
 	if ( sieve_dir == NULL )
 		sieve_dir= "./";
@@ -153,12 +147,17 @@ int main(int argc, char **argv)
 		sieve_dir = t_strdup_until(scriptfile, sieve_dir+1);
 	}
 
-	/* Currently needed for include (FIXME) */
 	testsuite_setting_set
 		("sieve_dir", t_strconcat(sieve_dir, "included", NULL));
 	testsuite_setting_set
 		("sieve_global_dir", t_strconcat(sieve_dir, "included-global", NULL));
 
+	/* Finish testsuite initialization */
+	svinst = sieve_tool_init_finish(sieve_tool, FALSE);	
+	testsuite_init(svinst, log_stdout);
+
+	printf("Test case: %s:\n\n", scriptfile);
+
 	/* Compile sieve script */
 	if ( (sbin = sieve_compile
 		(svinst, scriptfile, NULL, testsuite_log_main_ehandler, NULL)) != NULL ) {
diff --git a/tests/extensions/include/errors/included/action-fileinto.sieve b/tests/extensions/include/included/action-fileinto.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/action-fileinto.sieve
rename to tests/extensions/include/included/action-fileinto.sieve
diff --git a/tests/extensions/include/errors/included/action-reject.sieve b/tests/extensions/include/included/action-reject.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/action-reject.sieve
rename to tests/extensions/include/included/action-reject.sieve
diff --git a/tests/extensions/include/execute/included/actions-fileinto1.sieve b/tests/extensions/include/included/actions-fileinto1.sieve
similarity index 100%
rename from tests/extensions/include/execute/included/actions-fileinto1.sieve
rename to tests/extensions/include/included/actions-fileinto1.sieve
diff --git a/tests/extensions/include/execute/included/actions-fileinto2.sieve b/tests/extensions/include/included/actions-fileinto2.sieve
similarity index 100%
rename from tests/extensions/include/execute/included/actions-fileinto2.sieve
rename to tests/extensions/include/included/actions-fileinto2.sieve
diff --git a/tests/extensions/include/execute/included/actions-fileinto3.sieve b/tests/extensions/include/included/actions-fileinto3.sieve
similarity index 100%
rename from tests/extensions/include/execute/included/actions-fileinto3.sieve
rename to tests/extensions/include/included/actions-fileinto3.sieve
diff --git a/tests/extensions/include/errors/included/circular-one.sieve b/tests/extensions/include/included/circular-one.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/circular-one.sieve
rename to tests/extensions/include/included/circular-one.sieve
diff --git a/tests/extensions/include/errors/included/circular-three-2.sieve b/tests/extensions/include/included/circular-three-2.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/circular-three-2.sieve
rename to tests/extensions/include/included/circular-three-2.sieve
diff --git a/tests/extensions/include/errors/included/circular-three-3.sieve b/tests/extensions/include/included/circular-three-3.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/circular-three-3.sieve
rename to tests/extensions/include/included/circular-three-3.sieve
diff --git a/tests/extensions/include/errors/included/circular-three.sieve b/tests/extensions/include/included/circular-three.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/circular-three.sieve
rename to tests/extensions/include/included/circular-three.sieve
diff --git a/tests/extensions/include/errors/included/circular-two-2.sieve b/tests/extensions/include/included/circular-two-2.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/circular-two-2.sieve
rename to tests/extensions/include/included/circular-two-2.sieve
diff --git a/tests/extensions/include/errors/included/circular-two.sieve b/tests/extensions/include/included/circular-two.sieve
similarity index 100%
rename from tests/extensions/include/errors/included/circular-two.sieve
rename to tests/extensions/include/included/circular-two.sieve