diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c
index 1a0ea993e7779cbdd5a200a23b035e7a23f240e1..39e935e7dedf1ea7736fee329ee2ee7868f31bfa 100644
--- a/src/sieve-tools/sieve-test.c
+++ b/src/sieve-tools/sieve-test.c
@@ -126,6 +126,29 @@ static void duplicate_mark
 	i_info("marked duplicate for user %s.\n", senv->user->username);
 }
 
+/*
+ * Result logging
+ */
+
+static const char *
+result_amend_log_message(const struct sieve_script_env *senv,
+			 enum log_type log_type, const char *message)
+{
+	const struct sieve_message_data *msgdata = senv->script_context;
+	string_t *str;
+
+	if (log_type == LOG_TYPE_DEBUG)
+		return message;
+
+	str = t_str_new(256);
+	str_printfa(str, "msgid=%s", (msgdata->id == NULL ?
+				      "unspecified" : msgdata->id));
+	str_append(str, ": ");
+	str_append(str, message);
+
+	return str_c(str);
+}
+
 /*
  * Tool implementation
  */
@@ -143,7 +166,7 @@ int main(int argc, char **argv)
 	struct sieve_message_data msgdata;
 	struct sieve_script_env scriptenv;
 	struct sieve_exec_status estatus;
-	struct sieve_error_handler *ehandler, *action_ehandler;
+	struct sieve_error_handler *ehandler;
 	struct ostream *teststream = NULL;
 	struct sieve_trace_log *trace_log = NULL;
 	bool force_compile = FALSE, execute = FALSE;
@@ -153,7 +176,7 @@ int main(int argc, char **argv)
 	sieve_tool = sieve_tool_init
 		("sieve-test", &argc, &argv, "r:a:f:m:d:l:s:eCt:T:DP:x:u:", FALSE);
 
-	ehandler = action_ehandler = NULL;
+	ehandler = NULL;
 	t_array_init(&scriptfiles, 16);
 
 	/* Parse arguments */
@@ -299,13 +322,8 @@ int main(int argc, char **argv)
 		/* Create streams for test and trace output */
 
 		if ( !execute ) {
-			action_ehandler = NULL;
 			teststream = o_stream_create_fd(1, 0);
 			o_stream_set_no_error_handling(teststream, TRUE);
-		} else {
-			action_ehandler = sieve_prefix_ehandler_create
-				(ehandler, NULL, t_strdup_printf("msgid=%s",
-					( msgdata.id == NULL ? "unspecified" : msgdata.id )));
 		}
 
 		if ( tracefile != NULL ) {
@@ -327,8 +345,10 @@ int main(int argc, char **argv)
 		scriptenv.smtp_finish = sieve_smtp_finish;
 		scriptenv.duplicate_mark = duplicate_mark;
 		scriptenv.duplicate_check = duplicate_check;
+		scriptenv.result_amend_log_message = result_amend_log_message;
 		scriptenv.trace_log = trace_log;
 		scriptenv.trace_config = trace_config;
+		scriptenv.script_context = &msgdata;
 
 		i_zero(&estatus);
 		scriptenv.exec_status = &estatus;
@@ -343,7 +363,7 @@ int main(int argc, char **argv)
 			/* Execute/Test script */
 			if ( execute ) {
 				ret = sieve_execute(sbin, &msgdata, &scriptenv,
-					ehandler, action_ehandler, 0, NULL);
+					ehandler, ehandler, 0, NULL);
 			} else {
 				ret = sieve_test(sbin, &msgdata, &scriptenv,
 					ehandler, teststream, 0, NULL);
@@ -390,7 +410,7 @@ int main(int argc, char **argv)
 
 				/* Execute/Test script */
 				more = sieve_multiscript_run(mscript, sbin,
-					ehandler, action_ehandler, 0);
+					ehandler, ehandler, 0);
 			}
 
 			/* Execute/Test main script */
@@ -451,8 +471,6 @@ int main(int argc, char **argv)
 	}
 
 	/* Cleanup error handler */
-	if (action_ehandler != NULL)
-		sieve_error_handler_unref(&action_ehandler);
 	sieve_error_handler_unref(&ehandler);
 
 	sieve_tool_deinit(&sieve_tool);