diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c
index 557bc9c6f4cbce68e14dc58ede7b7b020fe88682..32e7eb54c49cba823a3a4ecb298e4e4aee257a69 100644
--- a/src/lib-sieve/sieve-address-parts.c
+++ b/src/lib-sieve/sieve-address-parts.c
@@ -152,63 +152,27 @@ void sieve_address_parts_link_tags
 }
 
 /*
- * Binary context:
- *
- * FIXME: This code will be duplicated across all extensions that introduce 
- * a registry of some kind in the binary. 
+ * Binary context
  */
 
-struct addrp_binary_context {
-	ARRAY_DEFINE(addrp_extensions, 
-		const struct sieve_address_part_extension *); 
-};
-
-static inline struct addrp_binary_context *
-	get_binary_context(struct sieve_binary *sbin)
+static inline const struct sieve_address_part_extension *
+	sieve_address_part_extension_get(struct sieve_binary *sbin, int ext_id)
 {
-	return (struct addrp_binary_context *) 
-		sieve_binary_extension_get_context(sbin, ext_my_id);
-}
-
-static const struct sieve_address_part_extension *
-sieve_address_part_extension_get
-	(struct sieve_binary *sbin, int ext_id)
-{
-	struct addrp_binary_context *ctx = get_binary_context(sbin);
-	
-	if ( (ctx != NULL) && (ext_id > 0) && 
-		(ext_id < (int) array_count(&ctx->addrp_extensions)) ) {
-		const struct sieve_address_part_extension * const *ext;
-
-		ext = array_idx(&ctx->addrp_extensions, (unsigned int) ext_id);
-
-		return *ext;
-	}
-	
-	return NULL;
+	return (const struct sieve_address_part_extension *)
+		sieve_binary_registry_get_object(sbin, ext_my_id, ext_id);
 }
 
 void sieve_address_part_extension_set
 	(struct sieve_binary *sbin, int ext_id,
 		const struct sieve_address_part_extension *ext)
 {
-	struct addrp_binary_context *ctx = get_binary_context(sbin);
-
-	array_idx_set(&ctx->addrp_extensions, (unsigned int) ext_id, &ext);
+	sieve_binary_registry_set_object
+		(sbin, ext_my_id, ext_id, (const void *) ext);
 }
 
 static bool addrp_binary_load(struct sieve_binary *sbin)
 {
-	pool_t pool = sieve_binary_pool(sbin);
-	
-	struct addrp_binary_context *ctx = 
-		p_new(pool, struct addrp_binary_context, 1);
-	
-	/* Setup comparator registry */
-	p_array_init(&ctx->addrp_extensions, pool, 4);
-
-	sieve_binary_extension_set_context
-		(sbin, ext_my_id, ctx);
+	sieve_binary_registry_init(sbin, ext_my_id);
 	
 	return TRUE;
 }
diff --git a/src/lib-sieve/sieve-binary.c b/src/lib-sieve/sieve-binary.c
index bda76c6e98a163c925f0658772f736453517418e..782905cba545af35cd21d41d1d34693a89bd3e4a 100644
--- a/src/lib-sieve/sieve-binary.c
+++ b/src/lib-sieve/sieve-binary.c
@@ -367,3 +367,54 @@ bool sieve_binary_read_string
 	return TRUE;
 }
 
+/* Binary registry */
+
+struct sieve_binary_registry {
+	ARRAY_DEFINE(objects, const void *); 
+};
+
+static inline struct sieve_binary_registry *
+	get_binary_registry(struct sieve_binary *sbin, int ext_id)
+{
+	return (struct sieve_binary_registry *) 
+		sieve_binary_extension_get_context(sbin, ext_id);
+}
+
+const void *sieve_binary_registry_get_object
+	(struct sieve_binary *sbin, int ext_id, int id)
+{
+	struct sieve_binary_registry *reg = get_binary_registry(sbin, ext_id);
+	
+	if ( (reg != NULL) && (id > 0) && 
+		(id < (int) array_count(&reg->objects)) ) {
+		const void * const *obj;
+
+		obj = array_idx(&reg->objects, (unsigned int) id);
+
+		return *obj;
+	}
+	
+	return NULL;
+}
+
+void sieve_binary_registry_set_object
+	(struct sieve_binary *sbin, int ext_id, int id, const void *object)
+{
+	struct sieve_binary_registry *reg = get_binary_registry(sbin, ext_id);
+
+	array_idx_set(&reg->objects, (unsigned int) id, &object);
+}
+
+void sieve_binary_registry_init(struct sieve_binary *sbin, int ext_id)
+{
+	pool_t pool = sieve_binary_pool(sbin);
+	
+	struct sieve_binary_registry *reg = 
+		p_new(pool, struct sieve_binary_registry, 1);
+	
+	/* Setup match-type registry */
+	p_array_init(&reg->objects, pool, 4);
+
+	sieve_binary_extension_set_context(sbin, ext_id, (void *) reg);
+}
+
diff --git a/src/lib-sieve/sieve-binary.h b/src/lib-sieve/sieve-binary.h
index b9818b62a632d5fe260b6ca57fccc214654e5453..dc0bd9dd8a723b3357c6c7c73f12f73ab1f8b04d 100644
--- a/src/lib-sieve/sieve-binary.h
+++ b/src/lib-sieve/sieve-binary.h
@@ -78,4 +78,14 @@ bool sieve_binary_read_integer
 bool sieve_binary_read_string
   (struct sieve_binary *binary, sieve_size_t *address, string_t **str);
 
+/* 
+ * Default registry context (used at various occasions)
+ */
+ 
+const void *sieve_binary_registry_get_object
+	(struct sieve_binary *sbin, int ext_id, int id);
+void sieve_binary_registry_set_object
+	(struct sieve_binary *sbin, int ext_id, int id, const void *object);
+void sieve_binary_registry_init(struct sieve_binary *sbin, int ext_id);
+
 #endif
diff --git a/src/lib-sieve/sieve-comparators.c b/src/lib-sieve/sieve-comparators.c
index 5eecf10bde3d4cdd2f3180408b920dc77e22c466..a85d3bdbabf1753410ef19ce06ec0d9ae8f2eeda 100644
--- a/src/lib-sieve/sieve-comparators.c
+++ b/src/lib-sieve/sieve-comparators.c
@@ -159,57 +159,27 @@ bool cmp_validator_load(struct sieve_validator *validator)
 }
 
 /*
- * Interpreter context:
+ * Binary context
  */
 
-struct cmp_binary_context {
-	ARRAY_DEFINE(cmp_extensions, 
-		const struct sieve_comparator_extension *); 
-};
-
-static inline struct cmp_binary_context *
-	get_binary_context(struct sieve_binary *sbin)
-{
-	return (struct cmp_binary_context *) 
-		sieve_binary_extension_get_context(sbin, ext_my_id);
-}
-
-static const struct sieve_comparator_extension *sieve_comparator_extension_get
-	(struct sieve_binary *sbin, int ext_id)
+static inline const struct sieve_comparator_extension *
+	sieve_comparator_extension_get(struct sieve_binary *sbin, int ext_id)
 {
-	struct cmp_binary_context *ctx = get_binary_context(sbin);
-	
-	if ( ext_id > 0 && ext_id < (int) array_count(&ctx->cmp_extensions) ) {
-		const struct sieve_comparator_extension * const *ext;
-
-		ext = array_idx(&ctx->cmp_extensions, (unsigned int) ext_id);
-
-		return *ext;
-	}
-	
-	return NULL;
+	return (const struct sieve_comparator_extension *)
+		sieve_binary_registry_get_object(sbin, ext_my_id, ext_id);
 }
 
 void sieve_comparator_extension_set
 	(struct sieve_binary *sbin, int ext_id,
 		const struct sieve_comparator_extension *ext)
 {
-	struct cmp_binary_context *ctx = get_binary_context(sbin);
-
-	array_idx_set(&ctx->cmp_extensions, (unsigned int) ext_id, &ext);
+	sieve_binary_registry_set_object
+		(sbin, ext_my_id, ext_id, (const void *) ext);
 }
 
 static bool cmp_binary_load(struct sieve_binary *sbin)
 {
-	pool_t pool = sieve_binary_pool(sbin);
-	
-	struct cmp_binary_context *ctx = 
-		p_new(pool, struct cmp_binary_context, 1);
-	
-	/* Setup comparator registry */
-	p_array_init(&ctx->cmp_extensions, pool, 4);
-
-	sieve_binary_extension_set_context(sbin, ext_my_id, ctx);
+	sieve_binary_registry_init(sbin, ext_my_id);
 	
 	return TRUE;
 }
diff --git a/src/lib-sieve/sieve-match-types.c b/src/lib-sieve/sieve-match-types.c
index 563bc2d91387c93ca65544cfe768cd79b678d5ed..b36eadc061bc71bfdfe6c6c6be9c060a1b1a0dca 100644
--- a/src/lib-sieve/sieve-match-types.c
+++ b/src/lib-sieve/sieve-match-types.c
@@ -151,61 +151,27 @@ void sieve_match_types_link_tags
 }
 
 /*
- * Interpreter context:
- *
- * FIXME: This code will be duplicated across all extensions that introduce 
- * a registry of some kind in the binary. 
+ * Binary context
  */
 
-struct mtch_binary_context {
-	ARRAY_DEFINE(mtch_extensions, 
-		const struct sieve_match_type_extension *); 
-};
-
-static inline struct mtch_binary_context *
-	get_binary_context(struct sieve_binary *sbin)
-{
-	return (struct mtch_binary_context *) 
-		sieve_binary_extension_get_context(sbin, ext_my_id);
-}
-
-static const struct sieve_match_type_extension *sieve_match_type_extension_get
+static inline const struct sieve_match_type_extension *sieve_match_type_extension_get
 	(struct sieve_binary *sbin, int ext_id)
-{
-	struct mtch_binary_context *ctx = get_binary_context(sbin);
-	
-	if ( (ctx != NULL) && (ext_id > 0) && 
-		(ext_id < (int) array_count(&ctx->mtch_extensions)) ) {
-		const struct sieve_match_type_extension * const *ext;
-
-		ext = array_idx(&ctx->mtch_extensions, (unsigned int) ext_id);
-
-		return *ext;
-	}
-	
-	return NULL;
+{	
+	return (const struct sieve_match_type_extension *)
+		sieve_binary_registry_get_object(sbin, ext_my_id, ext_id);
 }
 
 void sieve_match_type_extension_set
 	(struct sieve_binary *sbin, int ext_id,
 		const struct sieve_match_type_extension *ext)
 {
-	struct mtch_binary_context *ctx = get_binary_context(sbin);
-
-	array_idx_set(&ctx->mtch_extensions, (unsigned int) ext_id, &ext);
+	sieve_binary_registry_set_object
+		(sbin, ext_my_id, ext_id, (const void *) ext);
 }
 
 static bool mtch_binary_load(struct sieve_binary *sbin)
 {
-	pool_t pool = sieve_binary_pool(sbin);
-	
-	struct mtch_binary_context *ctx = 
-		p_new(pool, struct mtch_binary_context, 1);
-	
-	/* Setup match-type registry */
-	p_array_init(&ctx->mtch_extensions, pool, 4);
-
-	sieve_binary_extension_set_context(sbin, ext_my_id, ctx);
+	sieve_binary_registry_init(sbin, ext_my_id);
 	
 	return TRUE;
 }