diff --git a/src/lib-sieve/plugins/imap4flags/tag-flags.c b/src/lib-sieve/plugins/imap4flags/tag-flags.c
index bd85baabf3f7e7b0189b6c5d0e8afc8da0c95ee9..0536b829f00fa55e5b356879d9f98f93b1f70c63 100644
--- a/src/lib-sieve/plugins/imap4flags/tag-flags.c
+++ b/src/lib-sieve/plugins/imap4flags/tag-flags.c
@@ -74,14 +74,12 @@ seff_flags_pre_execute(const struct sieve_side_effect *seffect,
 
 const struct sieve_side_effect_def flags_side_effect = {
 	SIEVE_OBJECT("flags", &flags_side_effect_operand, 0),
-	&act_store,
-
-	seff_flags_dump_context,
-	seff_flags_read_context,
-	seff_flags_merge,
-	seff_flags_print,
-	seff_flags_pre_execute,
-	NULL, NULL, NULL
+	.to_action = &act_store,
+	.dump_context = seff_flags_dump_context,
+	.read_context = seff_flags_read_context,
+	.merge = seff_flags_merge,
+	.print = seff_flags_print,
+	.pre_execute = seff_flags_pre_execute
 };
 
 /*
diff --git a/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c b/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c
index 026c697bf23226faecb7142c1fbfb197d5eddc17..04977d9a52468ae1940f7206073393131ca5546f 100644
--- a/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c
+++ b/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c
@@ -50,6 +50,7 @@ seff_mailbox_create_pre_execute(const struct sieve_side_effect *seffect,
 
 const struct sieve_side_effect_def mailbox_create_side_effect = {
 	SIEVE_OBJECT("create", &mailbox_create_operand, 0),
+	.precedence = 100,
 	.to_action = &act_store,
 	.print = seff_mailbox_create_print,
 	.pre_execute = seff_mailbox_create_pre_execute
diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h
index e86c688c840c7c7db96c8fd92e239b32d936faa5..4c9017ec6c6a1002816b11fd6bf2bc3da3e42ccf 100644
--- a/src/lib-sieve/sieve-actions.h
+++ b/src/lib-sieve/sieve-actions.h
@@ -103,6 +103,10 @@ struct sieve_action {
 struct sieve_side_effect_def {
 	struct sieve_object_def obj_def;
 
+	/* Precedence (side effects with higher value are executed first) */
+
+	unsigned int precedence;
+
 	/* The action it is supposed to link to */
 	const struct sieve_action_def *to_action;
 
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index dcb9e21c1875be42124b086e5827cb2b9722bae0..9a90d903b997d031b7dfc7fc7159bf9398c09a7e 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -1604,13 +1604,24 @@ sieve_side_effects_list_create(struct sieve_result *result)
 void sieve_side_effects_list_add(struct sieve_side_effects_list *list,
 				 const struct sieve_side_effect *seffect)
 {
-	struct sieve_result_side_effect *reffect;
+	struct sieve_result_side_effect *reffect, *reffect_pos;
 
 	/* Prevent duplicates */
 	reffect = list->first_effect;
+	reffect_pos = NULL;
 	while (reffect != NULL) {
-		if (reffect->seffect.def == seffect->def)
+		const struct sieve_side_effect_def *ref_def = reffect->seffect.def;
+		const struct sieve_side_effect_def *sef_def = seffect->def;
+
+		if (sef_def == ref_def) {
+			/* already listed */
+			i_assert(reffect_pos == NULL);
 			return;
+		}
+		if (sef_def->precedence > ref_def->precedence) {
+			/* insert it before this position */
+			reffect_pos = reffect;
+		}
 
 		reffect = reffect->next;
 	}
@@ -1619,17 +1630,25 @@ void sieve_side_effects_list_add(struct sieve_side_effects_list *list,
 	reffect = p_new(list->result->pool, struct sieve_result_side_effect, 1);
 	reffect->seffect = *seffect;
 
-	/* Add */
-	if (list->first_effect == NULL) {
-		list->first_effect = reffect;
-		list->last_effect = reffect;
-		reffect->prev = NULL;
-		reffect->next = NULL;
+	if (reffect_pos != NULL) {
+		/* Insert */
+		reffect->next = reffect_pos;
+		reffect_pos->prev = reffect;
+		if (list->first_effect == reffect_pos)
+			list->first_effect = reffect;
 	} else {
-		list->last_effect->next = reffect;
-		reffect->prev = list->last_effect;
-		list->last_effect = reffect;
-		reffect->next = NULL;
+		/* Add */
+		if ( list->first_effect == NULL ) {
+			list->first_effect = reffect;
+			list->last_effect = reffect;
+			reffect->prev = NULL;
+			reffect->next = NULL;
+		} else {
+			list->last_effect->next = reffect;
+			reffect->prev = list->last_effect;
+			list->last_effect = reffect;
+			reffect->next = NULL;
+		}
 	}
 }