diff --git a/lang/en/question.php b/lang/en/question.php
index 70f91188fb3..90610290c31 100644
--- a/lang/en/question.php
+++ b/lang/en/question.php
@@ -218,6 +218,7 @@ $string['invalidcategoryidtomove'] = 'Invalid category id to move!';
$string['invalidconfirm'] = 'Confirmation string was incorrect';
$string['invalidcontextinhasanyquestions'] = 'Invalid context passed to question_context_has_any_questions.';
$string['invalidgrade'] = 'Grades ({$a}) do not match grade options - question skipped.';
+$string['invalidgradequestion'] = 'Grades ({$a->grades}) do not match grade options - question \'{$a->question}\' skipped.';
$string['invalidpenalty'] = 'Invalid penalty';
$string['invalidwizardpage'] = 'Incorrect or no wizard page specified!';
$string['lastmodifiedby'] = 'Last modified by';
diff --git a/question/format.php b/question/format.php
index 7f4a118b51e..c8fc1fd5b21 100644
--- a/question/format.php
+++ b/question/format.php
@@ -388,8 +388,8 @@ class qformat_default {
}
}
if ($invalidfractions) {
- echo $OUTPUT->notification(get_string('invalidgrade', 'question',
- implode(', ', $invalidfractions)));
+ $a = ['grades' => implode(', ', $invalidfractions), 'question' => $question->name];
+ echo $OUTPUT->notification(get_string('invalidgradequestion', 'question', $a));
++$gradeerrors;
continue;
} else {
diff --git a/question/format/xml/tests/fixtures/error_invalid_grades.xml b/question/format/xml/tests/fixtures/error_invalid_grades.xml
new file mode 100644
index 00000000000..ccf3406df05
--- /dev/null
+++ b/question/format/xml/tests/fixtures/error_invalid_grades.xml
@@ -0,0 +1,63 @@
+
+