diff --git a/src/lib-sieve/cmd-require.c b/src/lib-sieve/cmd-require.c
index 1f3e129412f14e226c5a5dca6ab1bc89c484c589..a54f247407766d6f3cd5ab464924a8721e21121a 100644
--- a/src/lib-sieve/cmd-require.c
+++ b/src/lib-sieve/cmd-require.c
@@ -57,7 +57,7 @@ static bool cmd_require_validate
 	if ( sieve_ast_argument_type(arg) == SAAT_STRING ) {
 		/* Single string */
 		const struct sieve_extension *ext = sieve_validator_extension_load
-			(validator, arg, sieve_ast_argument_str(arg));	
+			(validator, cmd, arg, sieve_ast_argument_str(arg));	
 
 		if ( ext == NULL ) result = FALSE;
 		
@@ -67,7 +67,7 @@ static bool cmd_require_validate
 		
 		while ( stritem != NULL ) {
 			const struct sieve_extension *ext = sieve_validator_extension_load
-				(validator, stritem, sieve_ast_strlist_str(stritem));
+				(validator, cmd, stritem, sieve_ast_strlist_str(stritem));
 
 			if ( ext == NULL ) result = FALSE;
 	
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index ffc6b8d71fa34338ac246ed6dbcdd6632cb948e8..cec3c0fe0c6c57cd147b782ba685e510791df8b6 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -511,8 +511,8 @@ static const struct sieve_argument *sieve_validator_find_tag_by_identifier
  */
 
 const struct sieve_extension *sieve_validator_extension_load
-(struct sieve_validator *valdtr, struct sieve_ast_argument *ext_arg, 
-	string_t *ext_name) 
+(struct sieve_validator *valdtr, struct sieve_command_context *cmd,
+	struct sieve_ast_argument *ext_arg, string_t *ext_name) 
 {
 	int ext_id;
 	struct sieve_validator_extension_reg *reg;
@@ -521,7 +521,8 @@ const struct sieve_extension *sieve_validator_extension_load
 
 	if ( str_len(ext_name) > 128 ) {
 		sieve_argument_validate_error(valdtr, ext_arg, 
-			"unsupported sieve capability '%s' (name is impossibly long)", 
+			"%s %s: unknown Sieve capability '%s' (name is impossibly long)",
+			cmd->command->identifier, sieve_command_type_name(cmd->command),
 			str_sanitize(name, 128));
 		return NULL;
 	}
@@ -529,8 +530,32 @@ const struct sieve_extension *sieve_validator_extension_load
 	ext = sieve_extension_get_by_name(name); 
 	
 	if ( ext == NULL ) {
-		sieve_argument_validate_error(valdtr, ext_arg, 
-			"unsupported sieve capability '%s'", name);
+		unsigned int i;
+		bool core_test = FALSE;
+		bool core_command = FALSE;
+
+		for ( i = 0; !core_command && i < sieve_core_commands_count; i++ ) {
+			if ( strcasecmp(sieve_core_commands[i]->identifier, name) == 0 )
+				core_command = TRUE;
+		}
+
+		for ( i = 0; !core_test && i < sieve_core_tests_count; i++ ) {
+			if ( strcasecmp(sieve_core_tests[i]->identifier, name) == 0 )
+				core_test = TRUE;
+		}
+
+		if ( core_test || core_command ) {
+			sieve_argument_validate_error(valdtr, ext_arg,
+                "%s %s: '%s' is not known as a Sieve capability, "
+				"but it is known as a Sieve %s that is always available",
+                cmd->command->identifier, sieve_command_type_name(cmd->command),
+                name, ( core_test ? "test" : "command" ));
+		} else {
+			sieve_argument_validate_error(valdtr, ext_arg,
+				"%s %s: unknown Sieve capability '%s'", 
+				cmd->command->identifier, sieve_command_type_name(cmd->command),
+				name);
+		}
 		return NULL;
 	}
 	
@@ -538,7 +563,9 @@ const struct sieve_extension *sieve_validator_extension_load
 
 	if ( ext->validator_load != NULL && !ext->validator_load(valdtr) ) {
 		sieve_argument_validate_error(valdtr, ext_arg, 
-			"failed to load sieve capability '%s'", ext->name);
+			"%s %s: failed to load Sieve capability '%s'",
+			cmd->command->identifier, sieve_command_type_name(cmd->command),
+			ext->name);
 		return NULL;
 	}
 
diff --git a/src/lib-sieve/sieve-validator.h b/src/lib-sieve/sieve-validator.h
index ca8b59fd31918b99a602185bb366be293b3380b7..7b0fab3cdc6d15aef3dd122768ea11a725b189bd 100644
--- a/src/lib-sieve/sieve-validator.h
+++ b/src/lib-sieve/sieve-validator.h
@@ -128,8 +128,8 @@ struct sieve_validator_extension {
 };
 
 const struct sieve_extension *sieve_validator_extension_load
-	(struct sieve_validator *validator, struct sieve_ast_argument *ext_arg, 
-		string_t *ext_name); 
+	(struct sieve_validator *validator, struct sieve_command_context *cmd,
+		struct sieve_ast_argument *ext_arg, string_t *ext_name); 
 
 void sieve_validator_extension_register
 	(struct sieve_validator *valdtr, 
diff --git a/tests/compile/errors.svtest b/tests/compile/errors.svtest
index 99e48332f5061d0d21d106b60f21d6259e34fc86..7bbfc6c6c9a0bcdcc242200fe2f2b7dafbc86829 100644
--- a/tests/compile/errors.svtest
+++ b/tests/compile/errors.svtest
@@ -181,7 +181,7 @@ test "Require errors (FIXME: count only)" {
 		test_fail "compile should have failed.";
 	}
 
-	if not test_error :count "eq" :comparator "i;ascii-numeric" "12" {
+	if not test_error :count "eq" :comparator "i;ascii-numeric" "15" {
 		test_fail "wrong number of errors reported";
 	}	
 }
diff --git a/tests/compile/errors/require.sieve b/tests/compile/errors/require.sieve
index 93508ad58651a4ede3a50476693337653834f981..9670bf1b7e32dd66b0aa0d601e0c735aaca22876 100644
--- a/tests/compile/errors/require.sieve
+++ b/tests/compile/errors/require.sieve
@@ -19,6 +19,9 @@ require 45;
 # Invalid extensions (3 errors)
 require ["_frop", "_friep", "_frml"];
 
+# Core commands required
+require ["redirect", "keep", "discard"];
+
 # Invalid arguments
 require "dovecot.test" true;