diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index 65975cb179eba0f8132a758930d1c55d56e314e3..d7785e7174b4e76d502d4fdf87f780c0cecc1072 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -377,7 +377,7 @@ void sieve_vdebug
 
 void sieve_vcritical
 (struct sieve_instance *svinst, struct sieve_error_handler *ehandler,
-	const char *location, const char *prefix, const char *fmt, va_list args)
+	const char *location, const char *user_prefix, const char *fmt, va_list args)
 {
 	char str[256];
 	struct tm *tm; 
@@ -394,12 +394,12 @@ void sieve_vcritical
 
 	tm = localtime(&ioloop_time);
 	
-	if ( prefix == NULL || *prefix == '\0' ) {
+	if ( user_prefix == NULL || *user_prefix == '\0' ) {
 		sieve_direct_error(svinst, ehandler, 0, location, "%s",  
 			( strftime(str, sizeof(str), CRITICAL_MSG_STAMP, tm) > 0 ? 
 				str : CRITICAL_MSG ));	
 	} else { 
-		sieve_direct_error(svinst, ehandler, 0, location, "%s: %s", prefix,  
+		sieve_direct_error(svinst, ehandler, 0, location, "%s: %s", user_prefix,  
 			( strftime(str, sizeof(str), CRITICAL_MSG_STAMP, tm) > 0 ? 
 				str : CRITICAL_MSG ));
 	}	
@@ -455,13 +455,13 @@ void sieve_debug
 
 void sieve_critical
 (struct sieve_instance *svinst, struct sieve_error_handler *ehandler,
-	const char *location, const char *prefix, const char *fmt, ...)
+	const char *location, const char *user_prefix, const char *fmt, ...)
 {
 	va_list args;
 	va_start(args, fmt);
 	
 	T_BEGIN {
-		sieve_vcritical(svinst, ehandler, location, prefix, fmt, args);
+		sieve_vcritical(svinst, ehandler, location, user_prefix, fmt, args);
 	} T_END;
 	
 	va_end(args);
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index d133ff8d05ee77912e746864a50a3510ce1b2a8d..9bdb5e3ecdd3939a3b222ee497b6715308e9e9d1 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -106,7 +106,8 @@ void sieve_vdebug
 		const char *fmt, va_list args);
 void sieve_vcritical
 	(struct sieve_instance *svinst, struct sieve_error_handler *ehandler,
-		const char *location, const char *prefix, const char *fmt, va_list args);
+		const char *location, const char *user_prefix, const char *fmt,
+		va_list args);
 
 void sieve_error
 	(struct sieve_error_handler *ehandler, const char *location, 
@@ -122,7 +123,7 @@ void sieve_debug
 		const char *fmt, ...) ATTR_FORMAT(3, 4);
 void sieve_critical
 	(struct sieve_instance *svinst, struct sieve_error_handler *ehandler,
-		const char *location, const char *prefix, const char *fmt, ...)
+		const char *location, const char *user_prefix, const char *fmt, ...)
 		ATTR_FORMAT(5, 6);
 
 /*
diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index 92e66fe7a09bfabb7b71277b2f97c8b50479f78a..52e7ade1f7deedd9dcc9324d128f95d62bded770 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -316,6 +316,25 @@ void sieve_runtime_log
 	va_end(args);
 }
 
+void sieve_runtime_critical
+(const struct sieve_runtime_env *renv, const char *location,
+	const char *user_prefix, const char *fmt, ...)
+{
+	va_list args;
+
+	va_start(args, fmt);
+
+	T_BEGIN {
+		if ( location == NULL )
+			location = sieve_runtime_get_full_command_location(renv);
+
+		sieve_vcritical
+			(renv->svinst, renv->interp->ehandler, location, user_prefix, fmt, args); 
+	} T_END;
+
+	va_end(args);
+}
+
 /*
  * Source location
  */
diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h
index 649ea759be88bea1a41c3332785b0a6a5c277352..5eaa66dd1f557aabea34a2934bd0c6f6b58eb0eb 100644
--- a/src/lib-sieve/sieve-interpreter.h
+++ b/src/lib-sieve/sieve-interpreter.h
@@ -92,6 +92,9 @@ void sieve_runtime_warning
 void sieve_runtime_log
 	(const struct sieve_runtime_env *renv, const char *location, 
 		const char *fmt, ...) ATTR_FORMAT(3, 4);
+void sieve_runtime_critical
+	(const struct sieve_runtime_env *renv, const char *location,
+		const char *user_prefix, const char *fmt, ...) ATTR_FORMAT(4, 5);
 
 /* 
  * Extension support