diff --git a/src/plugins/imapsieve/imap-sieve-storage.c b/src/plugins/imapsieve/imap-sieve-storage.c
index acfe2474ffd0e2a3975e38876671628639444812..ab164a2bc0d54b05e862b93b5dc8d48e3080050a 100644
--- a/src/plugins/imapsieve/imap-sieve-storage.c
+++ b/src/plugins/imapsieve/imap-sieve-storage.c
@@ -79,6 +79,11 @@ struct imap_sieve_user {
 	bool expunge_discarded:1;
 };
 
+struct imap_sieve_mailbox {
+	union mailbox_module_context module_ctx;
+	struct imap_sieve_user *user;
+};
+
 struct imap_sieve_mailbox_event {
 	uint32_t dest_mail_uid, src_mail_uid;
 	unsigned int save_seq;
@@ -458,10 +463,10 @@ imap_sieve_mailbox_copy(struct mail_save_context *ctx, struct mail *mail)
 	struct mail_storage *storage = t->box->storage;
 	struct mail_user *user = storage->user;
 	struct imap_sieve_user *isuser = IMAP_SIEVE_USER_CONTEXT_REQUIRE(user);
-	union mailbox_module_context *lbox = IMAP_SIEVE_CONTEXT_REQUIRE(t->box);
+	struct imap_sieve_mailbox *isbox = IMAP_SIEVE_CONTEXT_REQUIRE(t->box);
 	struct imap_sieve_mailbox_transaction *ismt = IMAP_SIEVE_CONTEXT(t);
 
-	if (lbox->super.copy(ctx, mail) < 0)
+	if (isbox->module_ctx.super.copy(ctx, mail) < 0)
 		return -1;
 
 	if (ismt != NULL && !isuser->sieve_active &&
@@ -484,12 +489,12 @@ static int imap_sieve_mailbox_save_finish(struct mail_save_context *ctx)
 	struct mailbox_transaction_context *t = ctx->transaction;
 	struct mailbox *box = t->box;
 	struct imap_sieve_mailbox_transaction *ismt = IMAP_SIEVE_CONTEXT(t);
-	union mailbox_module_context *lbox = IMAP_SIEVE_CONTEXT_REQUIRE(box);
+	struct imap_sieve_mailbox *isbox = IMAP_SIEVE_CONTEXT_REQUIRE(box);
 	struct mail_user *user = box->storage->user;
 	struct imap_sieve_user *isuser = IMAP_SIEVE_USER_CONTEXT_REQUIRE(user);
 	struct mail *dest_mail = ctx->copying_via_save ? NULL : ctx->dest_mail;
 
-	if (lbox->super.save_finish(ctx) < 0)
+	if (isbox->module_ctx.super.save_finish(ctx) < 0)
 		return -1;
 
 	if (ismt != NULL && !isuser->sieve_active &&
@@ -510,7 +515,7 @@ imap_sieve_mailbox_transaction_begin(struct mailbox *box,
 				     enum mailbox_transaction_flags flags,
 				     const char *reason)
 {
-	union mailbox_module_context *lbox = IMAP_SIEVE_CONTEXT_REQUIRE(box);
+	struct imap_sieve_mailbox *isbox = IMAP_SIEVE_CONTEXT_REQUIRE(box);
 	struct mail_user *user = box->storage->user;
 	struct imap_sieve_user *isuser = IMAP_SIEVE_USER_CONTEXT(user);
 	struct mailbox_transaction_context *t;
@@ -518,7 +523,7 @@ imap_sieve_mailbox_transaction_begin(struct mailbox *box,
 	pool_t pool;
 
 	/* Commence parent transaction */
-	t = lbox->super.transaction_begin(box, flags, reason);
+	t = isbox->module_ctx.super.transaction_begin(box, flags, reason);
 
 	if (isuser == NULL || isuser->sieve_active ||
 	    isuser->cur_cmd == IMAP_SIEVE_CMD_NONE)
@@ -789,11 +794,11 @@ imap_sieve_mailbox_transaction_commit(
 	struct mailbox *box = t->box;
 	struct mail_user *user = box->storage->user;
 	struct imap_sieve_mailbox_transaction *ismt = IMAP_SIEVE_CONTEXT(t);
-	union mailbox_module_context *lbox = IMAP_SIEVE_CONTEXT_REQUIRE(t->box);
+	struct imap_sieve_mailbox *isbox = IMAP_SIEVE_CONTEXT_REQUIRE(t->box);
 	struct imap_sieve_user *isuser = IMAP_SIEVE_USER_CONTEXT_REQUIRE(user);
 	int ret = 0;
 
-	if ((lbox->super.transaction_commit(t, changes_r)) < 0)
+	if ((isbox->module_ctx.super.transaction_commit(t, changes_r)) < 0)
 		ret = -1;
 	else if (ismt != NULL) {
 		isuser->sieve_active = TRUE;
@@ -812,9 +817,9 @@ static void
 imap_sieve_mailbox_transaction_rollback(struct mailbox_transaction_context *t)
 {
 	struct imap_sieve_mailbox_transaction *ismt = IMAP_SIEVE_CONTEXT(t);
-	union mailbox_module_context *lbox = IMAP_SIEVE_CONTEXT_REQUIRE(t->box);
+	struct imap_sieve_mailbox *isbox = IMAP_SIEVE_CONTEXT_REQUIRE(t->box);
 
-	lbox->super.transaction_rollback(t);
+	isbox->module_ctx.super.transaction_rollback(t);
 
 	if (ismt != NULL)
 		imap_sieve_mailbox_transaction_free(ismt);
@@ -825,22 +830,23 @@ static void imap_sieve_mailbox_allocated(struct mailbox *box)
 	struct mail_user *user = box->storage->user;
 	struct imap_sieve_user *isuser = IMAP_SIEVE_USER_CONTEXT_REQUIRE(user);
 	struct mailbox_vfuncs *v = box->vlast;
-	union mailbox_module_context *lbox;
+	struct imap_sieve_mailbox *isbox;
 
 	if (isuser->client == NULL || isuser->sieve_active ||
 	    (box->flags & MAILBOX_FLAG_READONLY) != 0)
 		return;
 
-	lbox = p_new(box->pool, union mailbox_module_context, 1);
-	lbox->super = *v;
-	box->vlast = &lbox->super;
+	isbox = p_new(box->pool, struct imap_sieve_mailbox, 1);
+	isbox->user = isuser;
+	isbox->module_ctx.super = *v;
+	box->vlast = &isbox->module_ctx.super;
 
 	v->copy = imap_sieve_mailbox_copy;
 	v->save_finish = imap_sieve_mailbox_save_finish;
 	v->transaction_begin = imap_sieve_mailbox_transaction_begin;
 	v->transaction_commit = imap_sieve_mailbox_transaction_commit;
 	v->transaction_rollback = imap_sieve_mailbox_transaction_rollback;
-	MODULE_CONTEXT_SET_SELF(box, imap_sieve_storage_module, lbox);
+	MODULE_CONTEXT_SET(box, imap_sieve_storage_module, isbox);
 }
 
 /*