diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index a88cae7243a0e00778596254e22d007be2e0ee77..923ebc8b86ceacda0ccfe81d6660b2e2ac919747 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -36,6 +36,7 @@ struct event_category event_category_sieve_action = {
 struct sieve_result_action {
 	struct sieve_action action;
 
+	struct sieve_error_handler *ehandler;
 	void *tr_context;
 	int status;
 
@@ -911,9 +912,11 @@ static void
 sieve_action_execution_pre(struct sieve_result_execution *rexec,
 			   struct sieve_result_action *ract)
 {
+	if (ract->ehandler == NULL)
+		ract->ehandler = rexec->ehandler;
 	rexec->action_env.action = &ract->action;
 	rexec->action_env.event = ract->action.event;
-	rexec->action_env.ehandler = rexec->ehandler;
+	rexec->action_env.ehandler = ract->ehandler;
 }
 
 static void
@@ -1204,6 +1207,7 @@ sieve_result_implicit_keep_execute(struct sieve_result_execution *rexec,
 	if (rexec->keep_equiv_action != NULL)
 		return;
 
+	ract_keep->ehandler = rexec->ehandler;
 	rexec->keep_success = success;
 	rexec->keep_status = status;