diff --git a/src/lib-sieve/plugins/environment/ext-environment-common.c b/src/lib-sieve/plugins/environment/ext-environment-common.c
index c7f5f625a6a58c18c18471b71605791bd1061fa2..382749f64efa0cf309e2bb56b30b835277163e7b 100644
--- a/src/lib-sieve/plugins/environment/ext-environment-common.c
+++ b/src/lib-sieve/plugins/environment/ext-environment-common.c
@@ -16,7 +16,7 @@ struct ext_environment_interpreter_context;
  * Core environment items
  */
 
-static const struct sieve_environment_item *core_env_items[] = {
+static const struct sieve_environment_item_def *core_env_items[] = {
 	&domain_env_item,
 	&host_env_item,
 	&location_env_item,
@@ -28,8 +28,10 @@ static const struct sieve_environment_item *core_env_items[] = {
 static unsigned int core_env_items_count = N_ELEMENTS(core_env_items);
 
 static void
-sieve_environment_item_insert(struct ext_environment_interpreter_context *ctx,
-			      const struct sieve_environment_item *item);
+sieve_environment_item_insert(
+	struct ext_environment_interpreter_context *ctx,
+	struct sieve_interpreter *interp, const struct sieve_extension *ext,
+	const struct sieve_environment_item_def *item_def);
 
 /*
  * Validator context
@@ -108,8 +110,10 @@ void ext_environment_interpreter_init(const struct sieve_extension *this_ext,
 	/* Create our context */
 	ctx = ext_environment_interpreter_context_get(this_ext, interp);
 
-	for (i = 0; i < core_env_items_count; i++)
-		sieve_environment_item_insert(ctx, core_env_items[i]);
+	for (i = 0; i < core_env_items_count; i++) {
+		sieve_environment_item_insert(ctx, interp, this_ext,
+					      core_env_items[i]);
+	}
 
 	ctx->active = TRUE;
 }
@@ -128,25 +132,36 @@ bool sieve_ext_environment_is_active(const struct sieve_extension *env_ext,
  */
 
 static void
-sieve_environment_item_insert(struct ext_environment_interpreter_context *ctx,
-			      const struct sieve_environment_item *item)
+sieve_environment_item_insert(
+	struct ext_environment_interpreter_context *ctx,
+	struct sieve_interpreter *interp, const struct sieve_extension *ext,
+	const struct sieve_environment_item_def *item_def)
 {
-	if (!item->prefix)
-		hash_table_insert(ctx->name_items, item->name, item);
+	pool_t pool = sieve_interpreter_pool(interp);
+	struct sieve_environment_item *item_mod;
+
+	item_mod = p_new(pool, struct sieve_environment_item, 1);
+	item_mod->def = item_def;
+	item_mod->ext = ext;
+
+	const struct sieve_environment_item *item = item_mod;
+	if (!item_def->prefix)
+		hash_table_insert(ctx->name_items, item_def->name, item);
 	else
 		array_append(&ctx->prefix_items, &item, 1);
 }
 
-void sieve_environment_item_register(const struct sieve_extension *env_ext,
-				     struct sieve_interpreter *interp,
-				     const struct sieve_environment_item *item)
+void sieve_environment_item_register(
+	const struct sieve_extension *env_ext, struct sieve_interpreter *interp,
+	const struct sieve_extension *ext,
+	const struct sieve_environment_item_def *item_def)
 {
 	struct ext_environment_interpreter_context *ctx;
 
 	i_assert(sieve_extension_is(env_ext, environment_extension));
 	ctx = ext_environment_interpreter_context_get(env_ext, interp);
 
-	sieve_environment_item_insert(ctx, item);
+	sieve_environment_item_insert(ctx, interp, ext, item_def);
 }
 
 /*
@@ -165,9 +180,9 @@ ext_environment_item_lookup(struct ext_environment_interpreter_context *ctx,
 		return item;
 
 	array_foreach_elem(&ctx->prefix_items, item) {
-		i_assert(item->prefix);
+		i_assert(item->def->prefix);
 
-		if (str_begins(name, item->name, &suffix)) {
+		if (str_begins(name, item->def->name, &suffix)) {
 			if (*suffix == '.')
 				++suffix;
 
@@ -193,10 +208,11 @@ ext_environment_item_get_value(const struct sieve_extension *env_ext,
 	if (item == NULL)
 		return NULL;
 
-	if (item->value != NULL)
-		return item->value;
-	if (item->get_value != NULL)
-		return item->get_value(renv, name);
+	i_assert(item->def != NULL);
+	if (item->def->value != NULL)
+		return item->def->value;
+	if (item->def->get_value != NULL)
+		return item->def->get_value(renv, item, name);
 	return NULL;
 }
 
@@ -212,6 +228,7 @@ ext_environment_item_get_value(const struct sieve_extension *env_ext,
 
 static const char *
 envit_domain_get_value(const struct sieve_runtime_env *renv,
+		       const struct sieve_environment_item *item ATTR_UNUSED,
 		       const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
@@ -219,7 +236,7 @@ envit_domain_get_value(const struct sieve_runtime_env *renv,
 	return eenv->svinst->domainname;
 }
 
-const struct sieve_environment_item domain_env_item = {
+const struct sieve_environment_item_def domain_env_item = {
 	.name = "domain",
 	.get_value = envit_domain_get_value,
 };
@@ -232,6 +249,7 @@ const struct sieve_environment_item domain_env_item = {
 
 static const char *
 envit_host_get_value(const struct sieve_runtime_env *renv,
+		     const struct sieve_environment_item *item ATTR_UNUSED,
 		     const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
@@ -239,7 +257,7 @@ envit_host_get_value(const struct sieve_runtime_env *renv,
 	return eenv->svinst->hostname;
 }
 
-const struct sieve_environment_item host_env_item = {
+const struct sieve_environment_item_def host_env_item = {
 	.name = "host",
 	.get_value = envit_host_get_value,
 };
@@ -257,6 +275,7 @@ const struct sieve_environment_item host_env_item = {
 
 static const char *
 envit_location_get_value(const struct sieve_runtime_env *renv,
+			 const struct sieve_environment_item *item ATTR_UNUSED,
 			 const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
@@ -274,7 +293,7 @@ envit_location_get_value(const struct sieve_runtime_env *renv,
 	return NULL;
 }
 
-const struct sieve_environment_item location_env_item = {
+const struct sieve_environment_item_def location_env_item = {
 	.name = "location",
 	.get_value = envit_location_get_value
 };
@@ -289,6 +308,7 @@ const struct sieve_environment_item location_env_item = {
 
 static const char *
 envit_phase_get_value(const struct sieve_runtime_env *renv,
+		      const struct sieve_environment_item *item ATTR_UNUSED,
 		      const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
@@ -306,7 +326,7 @@ envit_phase_get_value(const struct sieve_runtime_env *renv,
 	return NULL;
 }
 
-const struct sieve_environment_item phase_env_item = {
+const struct sieve_environment_item_def phase_env_item = {
 	.name = "phase",
 	.get_value = envit_phase_get_value
 };
@@ -316,7 +336,7 @@ const struct sieve_environment_item phase_env_item = {
     The product name associated with the Sieve interpreter.
  */
 
-const struct sieve_environment_item name_env_item = {
+const struct sieve_environment_item_def name_env_item = {
 	.name = "name",
 	.value = PIGEONHOLE_NAME" Sieve"
 };
@@ -328,7 +348,7 @@ const struct sieve_environment_item name_env_item = {
    in the context of the product name given by the "name" item.
  */
 
-const struct sieve_environment_item version_env_item = {
+const struct sieve_environment_item_def version_env_item = {
 	.name = "version",
 	.value = PIGEONHOLE_VERSION,
 };
diff --git a/src/lib-sieve/plugins/environment/ext-environment-common.h b/src/lib-sieve/plugins/environment/ext-environment-common.h
index 288b82e378cb63076ce8b0f2e8d5fd6ec395d2d9..f7e7fa67461f70da848105e529d6b2a8ee846a1d 100644
--- a/src/lib-sieve/plugins/environment/ext-environment-common.h
+++ b/src/lib-sieve/plugins/environment/ext-environment-common.h
@@ -29,12 +29,12 @@ extern const struct sieve_operation_def tst_environment_operation;
  * Environment items
  */
 
-extern const struct sieve_environment_item domain_env_item;
-extern const struct sieve_environment_item host_env_item;
-extern const struct sieve_environment_item location_env_item;
-extern const struct sieve_environment_item phase_env_item;
-extern const struct sieve_environment_item name_env_item;
-extern const struct sieve_environment_item version_env_item;
+extern const struct sieve_environment_item_def domain_env_item;
+extern const struct sieve_environment_item_def host_env_item;
+extern const struct sieve_environment_item_def location_env_item;
+extern const struct sieve_environment_item_def phase_env_item;
+extern const struct sieve_environment_item_def name_env_item;
+extern const struct sieve_environment_item_def version_env_item;
 
 /*
  * Initialization
diff --git a/src/lib-sieve/plugins/environment/sieve-ext-environment.h b/src/lib-sieve/plugins/environment/sieve-ext-environment.h
index e4a6ca6460bf443d9ff901eb505daf6d6c292420..c248d1e90e776e43fc76e768013bbd81a1880805 100644
--- a/src/lib-sieve/plugins/environment/sieve-ext-environment.h
+++ b/src/lib-sieve/plugins/environment/sieve-ext-environment.h
@@ -34,18 +34,27 @@ bool sieve_ext_environment_is_active(const struct sieve_extension *env_ext,
  * Environment item
  */
 
-struct sieve_environment_item {
+struct sieve_environment_item;
+
+struct sieve_environment_item_def {
 	const char *name;
 	bool prefix;
 
 	const char *value;
 	const char *(*get_value)(const struct sieve_runtime_env *renv,
+				 const struct sieve_environment_item *item,
 				 const char *name);
 };
 
-void sieve_environment_item_register(const struct sieve_extension *env_ext,
-				     struct sieve_interpreter *interp,
-				     const struct sieve_environment_item *item);
+struct sieve_environment_item {
+	const struct sieve_environment_item_def *def;
+	const struct sieve_extension *ext;
+};
+
+void sieve_environment_item_register(
+	const struct sieve_extension *env_ext, struct sieve_interpreter *interp,
+	const struct sieve_extension *ext,
+	const struct sieve_environment_item_def *item_def);
 const char *
 ext_environment_item_get_value(const struct sieve_extension *env_ext,
 			       const struct sieve_runtime_env *renv,
diff --git a/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c b/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c
index 87dd218a2602e1024fc11eb0e188f62a4c09fd1b..43361b438391ce65f6f0da7b45f03294e0fc241c 100644
--- a/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c
+++ b/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c
@@ -26,8 +26,10 @@
 /* default_mailbox */
 
 static const char *
-envit_default_mailbox_get_value(const struct sieve_runtime_env *renv,
-				const char *name ATTR_UNUSED)
+envit_default_mailbox_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 
@@ -35,7 +37,7 @@ envit_default_mailbox_get_value(const struct sieve_runtime_env *renv,
 	return eenv->scriptenv->default_mailbox;
 }
 
-const struct sieve_environment_item default_mailbox_env_item = {
+const struct sieve_environment_item_def default_mailbox_env_item = {
 	.name = "vnd.dovecot.default-mailbox",
 	.get_value = envit_default_mailbox_get_value,
 };
@@ -44,6 +46,7 @@ const struct sieve_environment_item default_mailbox_env_item = {
 
 static const char *
 envit_username_get_value(const struct sieve_runtime_env *renv,
+			 const struct sieve_environment_item *item ATTR_UNUSED,
 			 const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
@@ -51,7 +54,7 @@ envit_username_get_value(const struct sieve_runtime_env *renv,
 	return eenv->svinst->username;
 }
 
-const struct sieve_environment_item username_env_item = {
+const struct sieve_environment_item_def username_env_item = {
 	.name = "vnd.dovecot.username",
 	.get_value = envit_username_get_value,
 };
@@ -59,7 +62,9 @@ const struct sieve_environment_item username_env_item = {
 /* config.* */
 
 static const char *
-envit_config_get_value(const struct sieve_runtime_env *renv, const char *name)
+envit_config_get_value(const struct sieve_runtime_env *renv,
+		       const struct sieve_environment_item *item ATTR_UNUSED,
+		       const char *name)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 
@@ -70,7 +75,7 @@ envit_config_get_value(const struct sieve_runtime_env *renv, const char *name)
 				 t_strconcat("sieve_env_", name, NULL));
 }
 
-const struct sieve_environment_item config_env_item = {
+const struct sieve_environment_item_def config_env_item = {
 	.name = "vnd.dovecot.config",
 	.prefix = TRUE,
 	.get_value = envit_config_get_value,
@@ -85,10 +90,10 @@ void ext_vnd_environment_items_register(const struct sieve_extension *ext,
 {
 	struct ext_vnd_environment_context *extctx = ext->context;
 
-	sieve_environment_item_register(extctx->env_ext, renv->interp,
+	sieve_environment_item_register(extctx->env_ext, renv->interp, ext,
 					&default_mailbox_env_item);
-	sieve_environment_item_register(extctx->env_ext, renv->interp,
+	sieve_environment_item_register(extctx->env_ext, renv->interp, ext,
 					&username_env_item);
-	sieve_environment_item_register(extctx->env_ext, renv->interp,
+	sieve_environment_item_register(extctx->env_ext, renv->interp, ext,
 					&config_env_item);
 }
diff --git a/src/plugins/imapsieve/ext-imapsieve-environment.c b/src/plugins/imapsieve/ext-imapsieve-environment.c
index bc6958eec64334b65031511138b638582baa7264..79f851bd26187df21a7f40641c4b7e34bdb173c6 100644
--- a/src/plugins/imapsieve/ext-imapsieve-environment.c
+++ b/src/plugins/imapsieve/ext-imapsieve-environment.c
@@ -22,15 +22,17 @@
 /* imap.user */
 
 static const char *
-envit_imap_user_get_value(const struct sieve_runtime_env *renv,
-			  const char *name ATTR_UNUSED)
+envit_imap_user_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 
 	return eenv->svinst->username;
 }
 
-const struct sieve_environment_item imap_user_env_item = {
+const struct sieve_environment_item_def imap_user_env_item = {
 	.name = "imap.user",
 	.get_value = envit_imap_user_get_value
 };
@@ -38,8 +40,10 @@ const struct sieve_environment_item imap_user_env_item = {
 /* imap.email */
 
 static const char *
-envit_imap_email_get_value(const struct sieve_runtime_env *renv,
-			   const char *name ATTR_UNUSED)
+envit_imap_email_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 	const struct smtp_address *user_email =
@@ -50,7 +54,7 @@ envit_imap_email_get_value(const struct sieve_runtime_env *renv,
 	return smtp_address_encode(user_email);
 }
 
-const struct sieve_environment_item imap_email_env_item = {
+const struct sieve_environment_item_def imap_email_env_item = {
 	.name = "imap.email",
 	.get_value = envit_imap_email_get_value
 };
@@ -58,8 +62,10 @@ const struct sieve_environment_item imap_email_env_item = {
 /* imap.cause */
 
 static const char *
-envit_imap_cause_get_value(const struct sieve_runtime_env *renv,
-			   const char *name ATTR_UNUSED)
+envit_imap_cause_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 	const struct sieve_script_env *senv = eenv->scriptenv;
@@ -69,7 +75,7 @@ envit_imap_cause_get_value(const struct sieve_runtime_env *renv,
 	return isctx->event.cause;
 }
 
-const struct sieve_environment_item imap_cause_env_item = {
+const struct sieve_environment_item_def imap_cause_env_item = {
 	.name = "imap.cause",
 	.get_value = envit_imap_cause_get_value
 };
@@ -77,8 +83,10 @@ const struct sieve_environment_item imap_cause_env_item = {
 /* imap.mailbox */
 
 static const char *
-envit_imap_mailbox_get_value(const struct sieve_runtime_env *renv,
-			     const char *name ATTR_UNUSED)
+envit_imap_mailbox_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 	const struct sieve_message_data *msgdata = eenv->msgdata;
@@ -86,7 +94,7 @@ envit_imap_mailbox_get_value(const struct sieve_runtime_env *renv,
 	return mailbox_get_vname(msgdata->mail->box);
 }
 
-const struct sieve_environment_item imap_mailbox_env_item = {
+const struct sieve_environment_item_def imap_mailbox_env_item = {
 	.name = "imap.mailbox",
 	.get_value = envit_imap_mailbox_get_value
 };
@@ -95,8 +103,10 @@ const struct sieve_environment_item imap_mailbox_env_item = {
 /* imap.changedflags */
 
 static const char *
-envit_imap_changedflags_get_value(const struct sieve_runtime_env *renv,
-				  const char *name ATTR_UNUSED)
+envit_imap_changedflags_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 	const struct sieve_script_env *senv = eenv->scriptenv;
@@ -106,7 +116,7 @@ envit_imap_changedflags_get_value(const struct sieve_runtime_env *renv,
 	return isctx->event.changed_flags;
 }
 
-const struct sieve_environment_item imap_changedflags_env_item = {
+const struct sieve_environment_item_def imap_changedflags_env_item = {
 	.name = "imap.changedflags",
 	.get_value = envit_imap_changedflags_get_value
 };
@@ -114,8 +124,10 @@ const struct sieve_environment_item imap_changedflags_env_item = {
 /* vnd.dovecot.mailbox-from */
 
 static const char *
-envit_vnd_mailbox_from_get_value(const struct sieve_runtime_env *renv,
-				 const char *name ATTR_UNUSED)
+envit_vnd_mailbox_from_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 	const struct sieve_script_env *senv = eenv->scriptenv;
@@ -125,7 +137,7 @@ envit_vnd_mailbox_from_get_value(const struct sieve_runtime_env *renv,
 	return mailbox_get_vname(isctx->event.src_mailbox);
 }
 
-const struct sieve_environment_item vnd_mailbox_from_env_item = {
+const struct sieve_environment_item_def vnd_mailbox_from_env_item = {
 	.name = "vnd.dovecot.mailbox-from",
 	.get_value = envit_vnd_mailbox_from_get_value
 };
@@ -133,8 +145,10 @@ const struct sieve_environment_item vnd_mailbox_from_env_item = {
 /* vnd.dovecot.mailbox-to */
 
 static const char *
-envit_vnd_mailbox_to_get_value(const struct sieve_runtime_env *renv,
-			       const char *name ATTR_UNUSED)
+envit_vnd_mailbox_to_get_value(
+	const struct sieve_runtime_env *renv,
+	const struct sieve_environment_item *item ATTR_UNUSED,
+	const char *name ATTR_UNUSED)
 {
 	const struct sieve_execute_env *eenv = renv->exec_env;
 	const struct sieve_script_env *senv = eenv->scriptenv;
@@ -144,7 +158,7 @@ envit_vnd_mailbox_to_get_value(const struct sieve_runtime_env *renv,
 	return mailbox_get_vname(isctx->event.dest_mailbox);
 }
 
-const struct sieve_environment_item vnd_mailbox_to_env_item = {
+const struct sieve_environment_item_def vnd_mailbox_to_env_item= {
 	.name = "vnd.dovecot.mailbox-to",
 	.get_value = envit_vnd_mailbox_to_get_value
 };
@@ -159,15 +173,15 @@ void ext_imapsieve_environment_items_register(
 	struct ext_imapsieve_context *extctx = ext->context;
 	const struct sieve_extension *env_ext = extctx->ext_environment;
 
-	sieve_environment_item_register(env_ext, renv->interp,
+	sieve_environment_item_register(env_ext, renv->interp, ext,
 					&imap_user_env_item);
-	sieve_environment_item_register(env_ext, renv->interp,
+	sieve_environment_item_register(env_ext, renv->interp, ext,
 					&imap_email_env_item);
-	sieve_environment_item_register(env_ext, renv->interp,
+	sieve_environment_item_register(env_ext, renv->interp, ext,
 					&imap_cause_env_item);
-	sieve_environment_item_register(env_ext, renv->interp,
+	sieve_environment_item_register(env_ext, renv->interp, ext,
 					&imap_mailbox_env_item);
-	sieve_environment_item_register(env_ext, renv->interp,
+	sieve_environment_item_register(env_ext, renv->interp, ext,
 					&imap_changedflags_env_item);
 }
 
@@ -177,8 +191,8 @@ void ext_imapsieve_environment_vendor_items_register(
 	struct ext_imapsieve_context *extctx = ext->context;
 	const struct sieve_extension *env_ext = extctx->ext_environment;
 
-	sieve_environment_item_register(env_ext, renv->interp,
+	sieve_environment_item_register(env_ext, renv->interp, ext,
 					&vnd_mailbox_from_env_item);
-	sieve_environment_item_register(env_ext, renv->interp,
+	sieve_environment_item_register(env_ext, renv->interp, ext,
 					&vnd_mailbox_to_env_item);
 }