diff --git a/src/lib-sieve/sieve-code-dumper.c b/src/lib-sieve/sieve-code-dumper.c
index c3d3825f4d775a982fc77be76a53db17a6ea81f5..3a478705ed51839d46481bab330bb2d75794424a 100644
--- a/src/lib-sieve/sieve-code-dumper.c
+++ b/src/lib-sieve/sieve-code-dumper.c
@@ -21,6 +21,15 @@
 
 #include "sieve-dump.h"
 
+/* 
+ * Code dumper extension
+ */
+
+struct sieve_code_dumper_extension_reg {
+	const struct sieve_code_dumper_extension *val_ext;
+	void *context;
+};
+
 struct sieve_code_dumper {
 	pool_t pool;
 					
@@ -34,7 +43,7 @@ struct sieve_code_dumper {
 	/* Dump environment */
 	struct sieve_dumptime_env *dumpenv; 
 	
-	ARRAY_DEFINE(ext_contexts, void *);
+	ARRAY_DEFINE(extensions, struct sieve_code_dumper_extension_reg);
 };
 
 struct sieve_code_dumper *sieve_code_dumper_create
@@ -50,8 +59,8 @@ struct sieve_code_dumper *sieve_code_dumper_create
 	dumper->pc = 0;
 	
 	/* Setup storage for extension contexts */		
-	p_array_init(&dumper->ext_contexts, pool, sieve_extensions_get_count());
-	
+	p_array_init(&dumper->extensions, pool, sieve_extensions_get_count());
+
 	return dumper;
 }
 
@@ -69,25 +78,42 @@ pool_t sieve_code_dumper_pool(struct sieve_code_dumper *dumper)
 
 /* EXtension support */
 
+void sieve_dump_extension_register
+(struct sieve_code_dumper *dumper, 
+	const struct sieve_code_dumper_extension *dump_ext, void *context)
+{
+	struct sieve_code_dumper_extension_reg reg = { dump_ext, context };
+	int ext_id = *dump_ext->ext->id;
+
+	if ( ext_id < 0 ) return;
+	
+	array_idx_set(&dumper->extensions, (unsigned int) ext_id, &reg);	
+}
+
 void sieve_dump_extension_set_context
 (struct sieve_code_dumper *dumper, const struct sieve_extension *ext, 
 	void *context)
 {
-	array_idx_set(&dumper->ext_contexts, (unsigned int) *ext->id, &context);	
+	struct sieve_code_dumper_extension_reg reg = { NULL, context };
+	int ext_id = *ext->id;
+
+	if ( ext_id < 0 ) return;
+	
+	array_idx_set(&dumper->extensions, (unsigned int) ext_id, &reg);	
 }
 
 void *sieve_dump_extension_get_context
 (struct sieve_code_dumper *dumper, const struct sieve_extension *ext) 
 {
 	int ext_id = *ext->id;
-	void * const *ctx;
+	const struct sieve_code_dumper_extension_reg *reg;
 
-	if  ( ext_id < 0 || ext_id >= (int) array_count(&dumper->ext_contexts) )
+	if  ( ext_id < 0 || ext_id >= (int) array_count(&dumper->extensions) )
 		return NULL;
 	
-	ctx = array_idx(&dumper->ext_contexts, (unsigned int) ext_id);		
+	reg = array_idx(&dumper->extensions, (unsigned int) ext_id);		
 
-	return *ctx;
+	return reg->context;
 }
 
 /* Dump functions */
diff --git a/src/lib-sieve/sieve-code-dumper.h b/src/lib-sieve/sieve-code-dumper.h
index 8906f9e9d6a4907b6cdcde10d43afd0ddf1ffabc..cad637a20a1e0ba811bd49faabbfbc1081a7326a 100644
--- a/src/lib-sieve/sieve-code-dumper.h
+++ b/src/lib-sieve/sieve-code-dumper.h
@@ -12,8 +12,19 @@ void sieve_code_dumper_free
 pool_t sieve_code_dumper_pool
 	(struct sieve_code_dumper *dumper);
 	
-/* EXtension support */
+/* 
+ * Extension support
+ */
 
+struct sieve_code_dumper_extension {
+	const struct sieve_extension *ext;	
+
+	void (*free)(struct sieve_code_dumper *dumper, void *context);
+};
+
+void sieve_dump_extension_register
+(struct sieve_code_dumper *dumper, 
+	const struct sieve_code_dumper_extension *dump_ext, void *context);
 void sieve_dump_extension_set_context
 	(struct sieve_code_dumper *dumper, const struct sieve_extension *ext, 
 		void *context);