diff --git a/translators/tmgmt_local/src/Form/LocalTaskItemForm.php b/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
index 9dbca59..86187bd 100644
--- a/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
+++ b/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
@@ -9,6 +9,7 @@ namespace Drupal\tmgmt_local\Form;
 
 use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Entity\ContentEntityForm;
 use Drupal\Core\Form\FormStateInterface;
@@ -212,6 +213,13 @@ class LocalTaskItemForm extends ContentEntityForm {
     }
     $task_item->save();
 
+    if ($form_state->getTriggeringElement()['#value'] == $form['actions']['save']['#value']) {
+      drupal_set_message(t('The translation for <a href=:task_item>@task_item_title</a> has been saved successfully.', [
+        ':task_item' => $task_item->urlInfo()->toString(),
+        '@task_item_title' => $task_item->label()
+      ]));
+    }
+
     $task = $task_item->getTask();
     $uri = $task->urlInfo();
     $form_state->setRedirect($uri->getRouteName(), $uri->getRouteParameters());
@@ -255,6 +263,15 @@ class LocalTaskItemForm extends ContentEntityForm {
 
     // Add the translations to the job item.
     $job_item->addTranslatedData($task_item->getData());
+    foreach ($job_item->getMessagesSince() as $message) {
+      // Ignore debug messages.
+      if ($message->getType() == 'debug') {
+        continue;
+      }
+      if ($text = $message->getMessage()) {
+        drupal_set_message(SafeMarkup::format($text, []), $message->getType());
+      }
+    }
   }
 
   /**
diff --git a/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php b/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
index 6521032..3510c25 100755
--- a/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
+++ b/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
@@ -351,6 +351,7 @@ class LocalTranslatorTest extends TMGMTTestBase {
       'dummy|deep_nesting[translation]' => $translation1 = 'German translation of source 1',
     );
     $this->drupalPostForm(NULL, $edit, t('Save as completed'));
+    $this->assertText('The translation of ' . $first_task_item->label() . ' to ' . $job->getTargetLanguage()->getName() . ' is finished and can now be reviewed.');
 
     // Review and accept the first item.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
@@ -388,6 +389,7 @@ class LocalTranslatorTest extends TMGMTTestBase {
       'dummy|deep_nesting[translation]' => $translation2 = 'German translation of source 2',
     );
     $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->assertText('The translation for ' . $second_task_item->label() . ' has been saved successfully.');
     // The first item is still completed, the second still untranslated.
     $this->assertText(t('Completed'));
     $this->assertText(t('Untranslated'));
@@ -453,6 +455,7 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->clickLink(t('View'));
     $this->clickLink(t('Translate'));
     $this->drupalPostForm(NULL, array(), t('Save as completed'));
+    $this->assertText('The translation of ' . $second_task_item->label() . ' to ' . $job->getTargetLanguage()->getName() . ' is finished and can now be reviewed.');
 
     // Review and accept the second item.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
