diff --git a/Makefile.am b/Makefile.am
index a20839e4ee4dec87e7e4335065f138fe15fc06f6..dc3cc95f68c5a419ff1d4085b5a5a67d86fc43d5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -160,6 +160,7 @@ test_cases = \
 	tests/extensions/editheader/utf8.svtest \
 	tests/extensions/editheader/protected.svtest \
 	tests/extensions/editheader/errors.svtest \
+	tests/extensions/editheader/execute.svtest \
 	tests/extensions/duplicate/errors.svtest \
 	tests/extensions/duplicate/execute.svtest \
 	tests/extensions/duplicate/execute-vnd.svtest \
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index e075a73644eaf1b7e95991c8ec1830acaf25b494..7a95cd28b7e9682a3db288f848fc711bbb803933 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -1031,13 +1031,13 @@ static int _sieve_result_implicit_keep
 
 int sieve_result_implicit_keep
 (struct sieve_result *result,
-	struct sieve_error_handler *ehandler)
+	struct sieve_error_handler *ehandler, bool success)
 {
 	int ret;
 
 	_sieve_result_prepare_execution(result, ehandler);
 
-	ret = _sieve_result_implicit_keep(result, TRUE);
+	ret = _sieve_result_implicit_keep(result, !success);
 
 	result->action_env.ehandler = NULL;
 
diff --git a/src/lib-sieve/sieve-result.h b/src/lib-sieve/sieve-result.h
index ae63bc5373cab339f04d8e7df5275c8845746137..e2c2f5f3dc269012ae9579004a739d5dd88e562e 100644
--- a/src/lib-sieve/sieve-result.h
+++ b/src/lib-sieve/sieve-result.h
@@ -142,8 +142,9 @@ void sieve_result_set_failure_action
  * Result execution
  */
 
-int sieve_result_implicit_keep(struct sieve_result *result,
-	struct sieve_error_handler *ehandler);
+int sieve_result_implicit_keep
+	(struct sieve_result *result,
+		struct sieve_error_handler *ehandler, bool success);
 
 void sieve_result_mark_executed(struct sieve_result *result);
 
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 412047a653e78706128155fa867d41c452f919c0..5d28fd3549d86980d42941ff7e67d67c1e347861 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -560,7 +560,7 @@ int sieve_execute
 	} else if ( ret == SIEVE_EXEC_FAILURE ) {
 		/* Perform implicit keep if script failed with a normal runtime error */
 		switch ( sieve_result_implicit_keep
-			(result, action_ehandler) ) {
+			(result, action_ehandler, FALSE) ) {
 		case SIEVE_EXEC_OK:
 			if ( keep != NULL ) *keep = TRUE;
 			break;
@@ -653,7 +653,8 @@ static void sieve_multiscript_execute
 	if ( mscript->status > 0 ) {
 		mscript->status = sieve_result_execute(mscript->result, keep, ehandler);
 	} else {
-		if ( !sieve_result_implicit_keep(mscript->result, ehandler) )
+		if ( !sieve_result_implicit_keep
+			(mscript->result, ehandler, FALSE) )
 			mscript->status = SIEVE_EXEC_KEEP_FAILED;
 		else
 			if ( keep != NULL ) *keep = TRUE;
@@ -714,7 +715,7 @@ int sieve_multiscript_tempfail(struct sieve_multiscript **_mscript,
 			 * to implicit keep (FIXME)
 			 */
 			switch ( sieve_result_implicit_keep
-				(result, action_ehandler) ) {
+				(result, action_ehandler, FALSE) ) {
 			case SIEVE_EXEC_OK:
 				ret = SIEVE_EXEC_FAILURE;
 				break;
@@ -746,7 +747,7 @@ int sieve_multiscript_finish(struct sieve_multiscript **_mscript,
 			mscript->keep = TRUE;
 		} else {
 			switch ( sieve_result_implicit_keep
-				(result, action_ehandler) ) {
+				(result, action_ehandler, TRUE) ) {
 			case SIEVE_EXEC_OK:
 				mscript->keep = TRUE;
 				break;
diff --git a/tests/extensions/editheader/execute.svtest b/tests/extensions/editheader/execute.svtest
new file mode 100644
index 0000000000000000000000000000000000000000..ca33548e4a40c71cc7f14af3bdf8b7e3387e0915
--- /dev/null
+++ b/tests/extensions/editheader/execute.svtest
@@ -0,0 +1,45 @@
+require "vnd.dovecot.testsuite";
+require "include";
+require "variables";
+
+/*
+ * Multi script
+ */
+
+test_set "message" text:
+From: idiot@example.com
+To: idiot@example.org
+Subject: Frop!
+
+Frop.
+.
+;
+
+test_result_reset;
+test "Multi script" {
+	if not test_multiscript [
+		"execute/multiscript-before.sieve",
+		"execute/multiscript-personal.sieve",
+		"execute/multiscript-after.sieve"
+	] {
+		test_fail "failed to run all scripts";
+	}
+
+	test_message :folder "INBOX" 0;
+
+	if not header "subject" "Frop!" {
+		test_fail "keep not executed.";
+	}
+
+	if not header "X-Before" "before" {
+		test_fail "No X-Before header";
+	}
+
+	if not header "X-Personal" "personal" {
+		test_fail "No X-Personal header";
+	}
+
+	if not header "X-After" "after" {
+		test_fail "No X-After header";
+	}	
+}
diff --git a/tests/extensions/editheader/execute/multiscript-after.sieve b/tests/extensions/editheader/execute/multiscript-after.sieve
new file mode 100644
index 0000000000000000000000000000000000000000..f11f02dba1740e5994624d31f04bc11760088eb3
--- /dev/null
+++ b/tests/extensions/editheader/execute/multiscript-after.sieve
@@ -0,0 +1,4 @@
+require "editheader";
+
+addheader "X-After" "after";
+
diff --git a/tests/extensions/editheader/execute/multiscript-before.sieve b/tests/extensions/editheader/execute/multiscript-before.sieve
new file mode 100644
index 0000000000000000000000000000000000000000..5c8a988f2ee7b01c2aa2429f3d42f52af7bdcb7b
--- /dev/null
+++ b/tests/extensions/editheader/execute/multiscript-before.sieve
@@ -0,0 +1,4 @@
+require "editheader";
+
+addheader "X-Before" "before";
+
diff --git a/tests/extensions/editheader/execute/multiscript-personal.sieve b/tests/extensions/editheader/execute/multiscript-personal.sieve
new file mode 100644
index 0000000000000000000000000000000000000000..92e82ac4426ed0e76fb13ac94f6be5251d9d7aea
--- /dev/null
+++ b/tests/extensions/editheader/execute/multiscript-personal.sieve
@@ -0,0 +1,4 @@
+require "editheader";
+
+addheader "X-Personal" "personal";
+