diff --git a/TODO b/TODO
index b7f0e6a0f2a2471cc82340f8f5ec8034cf77749b..07bcd6632f3432381286eaa9f964386af4c957d7 100644
--- a/TODO
+++ b/TODO
@@ -1,10 +1,9 @@
 Next (in order of descending priority/precedence):
 
 * Finish the test suite for the base functionality
-* Improve debugging and error handling:
-	- Variables: dump variable identifiers in stead of storage indexes
 * Make sure cmusieve can be replaced seamlessly with the new plugin.
 * Final issues:
+	- FIXME hunting
 	- Fix amd64 logging segfault
 	- Fix/Report issues listed in 'doc/rfc/RFC Controversy.txt'
 
diff --git a/src/lib-sieve/plugins/include/ext-include-binary.c b/src/lib-sieve/plugins/include/ext-include-binary.c
index 34e759a52ceb41bfe348fc225f31a8b0738fc6b0..fc5525ef44d36ab882fc373cd3e73d7107ed587d 100644
--- a/src/lib-sieve/plugins/include/ext-include-binary.c
+++ b/src/lib-sieve/plugins/include/ext-include-binary.c
@@ -411,3 +411,16 @@ bool ext_include_binary_dump(struct sieve_dumptime_env *denv)
 	return TRUE;
 }
 
+bool ext_include_code_dump
+(const struct sieve_dumptime_env *denv, sieve_size_t *address ATTR_UNUSED)
+{
+	struct sieve_binary *sbin = denv->sbin;
+	struct ext_include_binary_context *binctx = 
+		ext_include_binary_get_context(sbin);
+	
+	sieve_ext_variables_dump_set_scope(denv, &include_extension, binctx->global_vars);
+
+	return TRUE;
+}
+
+
diff --git a/src/lib-sieve/plugins/include/ext-include-binary.h b/src/lib-sieve/plugins/include/ext-include-binary.h
index 7f5988ff08b72b02c04618e97422cfdd9e06a039..32c86c73ef95b18dee7009c83c961180b443a48a 100644
--- a/src/lib-sieve/plugins/include/ext-include-binary.h
+++ b/src/lib-sieve/plugins/include/ext-include-binary.h
@@ -56,6 +56,8 @@ unsigned int ext_include_binary_script_get_count
  */
 
 bool ext_include_binary_dump(struct sieve_dumptime_env *denv);
+bool ext_include_code_dump
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address ATTR_UNUSED);
 		
 #endif /* __EXT_INCLUDE_BINARY_H */
 
diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c
index 244c539f2eec2c41724e4e559edd90658a7766ee..58f3f63ad71f0fe413bdc341f981d28bfe4e456b 100644
--- a/src/lib-sieve/plugins/include/ext-include.c
+++ b/src/lib-sieve/plugins/include/ext-include.c
@@ -67,7 +67,7 @@ const struct sieve_extension include_extension = {
 	ext_include_interpreter_load,
 	ext_include_binary_load, 
 	ext_include_binary_dump,
-	NULL,
+	ext_include_code_dump,
 	SIEVE_EXT_DEFINE_OPERATIONS(ext_include_operations),
 	SIEVE_EXT_DEFINE_NO_OPERANDS
 };
diff --git a/src/lib-sieve/plugins/variables/ext-variables-dump.c b/src/lib-sieve/plugins/variables/ext-variables-dump.c
index 8c5cf9427876c55a18d0e355aa564193336be0b3..b4845dab666ec2c63d4aaa79da3b9d8676641b09 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-dump.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-dump.c
@@ -18,7 +18,28 @@
  
 struct ext_variables_dump_context {
 	struct sieve_variable_scope *main_scope;
-}; 
+	ARRAY_DEFINE(ext_scopes, struct sieve_variable_scope *);
+};
+
+static struct ext_variables_dump_context *ext_variables_dump_get_context
+	(const struct sieve_dumptime_env *denv)
+{
+	struct sieve_code_dumper *dumper = denv->cdumper;
+	struct ext_variables_dump_context *dctx = sieve_dump_extension_get_context
+		(dumper, &variables_extension);
+	pool_t pool;
+
+	if ( dctx == NULL ) {
+		/* Create dumper context */
+		pool = sieve_code_dumper_pool(dumper);
+		dctx = p_new(pool, struct ext_variables_dump_context, 1);
+		p_array_init(&dctx->ext_scopes, pool, sieve_extensions_get_count());
+	
+		sieve_dump_extension_set_context(dumper, &variables_extension, dctx);
+	}
+
+	return dctx;
+} 
  
 bool ext_variables_code_dump
 (const struct sieve_dumptime_env *denv, sieve_size_t *address)
@@ -59,16 +80,25 @@ bool ext_variables_code_dump
 		(void) sieve_variable_scope_declare(main_scope, str_c(identifier));
 	}
 	
-	/* Create dumper context */
-	dctx = p_new(sieve_code_dumper_pool(dumper), 
-		struct ext_variables_dump_context, 1);
+	dctx = ext_variables_dump_get_context(denv);
 	dctx->main_scope = main_scope;
 	
-	sieve_dump_extension_set_context(dumper, &variables_extension, dctx);
-	
 	return TRUE;
 }
 
+/*
+ * Scope registry
+ */
+
+void sieve_ext_variables_dump_set_scope
+(const struct sieve_dumptime_env *denv, const struct sieve_extension *ext, 
+	struct sieve_variable_scope *scope)
+{
+	struct ext_variables_dump_context *dctx = ext_variables_dump_get_context(denv);
+
+	array_idx_set(&dctx->ext_scopes, (unsigned int) *ext->id, &scope);	
+}
+
 /*
  * Variable identifier dump
  */
@@ -77,15 +107,27 @@ const char *ext_variables_dump_get_identifier
 (const struct sieve_dumptime_env *denv, const struct sieve_extension *ext,
 	unsigned int index)
 {
-	struct sieve_code_dumper *dumper = denv->cdumper;
-	struct ext_variables_dump_context *dctx = sieve_dump_extension_get_context
-		(dumper, &variables_extension);
+	struct ext_variables_dump_context *dctx = ext_variables_dump_get_context(denv);	
+	struct sieve_variable_scope *scope;
 	struct sieve_variable *var;
 
-	if ( ext != NULL )
+	if ( ext == NULL )
+		scope = dctx->main_scope;
+	else {
+		struct sieve_variable_scope *const *ext_scope;
+		int ext_id = *ext->id;
+
+		if  ( ext_id < 0 || ext_id >= (int) array_count(&dctx->ext_scopes) )
+			return NULL;
+	
+		ext_scope = array_idx(&dctx->ext_scopes, (unsigned int) ext_id);
+		scope = *ext_scope;			
+	}
+
+	if ( scope == NULL )
 		return NULL;
 			
-	var = sieve_variable_scope_get_indexed(dctx->main_scope, index);
+	var = sieve_variable_scope_get_indexed(scope, index);
 	
 	return var->identifier;
 }
diff --git a/src/lib-sieve/plugins/variables/sieve-ext-variables.h b/src/lib-sieve/plugins/variables/sieve-ext-variables.h
index 7d6b067a53917824a95b4277085e5cc6c255f1c1..4fd7639b68801d0431d8481c1a4a2edc30a2418c 100644
--- a/src/lib-sieve/plugins/variables/sieve-ext-variables.h
+++ b/src/lib-sieve/plugins/variables/sieve-ext-variables.h
@@ -151,4 +151,12 @@ struct sieve_variables_modifier {
 void sieve_variables_modifier_register
 	(struct sieve_validator *valdtr, const struct sieve_variables_modifier *smodf);
 
+/*
+ * Code dumping
+ */
+
+void sieve_ext_variables_dump_set_scope
+(const struct sieve_dumptime_env *denv, const struct sieve_extension *ext, 
+	struct sieve_variable_scope *scope);
+
 #endif /* __SIEVE_EXT_VARIABLES_H */