diff --git a/src/Entity/JobItem.php b/src/Entity/JobItem.php
index e804229..c3debc0 100644
--- a/src/Entity/JobItem.php
+++ b/src/Entity/JobItem.php
@@ -10,6 +10,7 @@ namespace Drupal\tmgmt\Entity;
 use Drupal\Component\Plugin\Exception\PluginException;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Cache\Cache;
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
@@ -966,6 +967,21 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
   /**
    * {@inheritdoc}
    */
+  protected function invalidateTagsOnSave($update) {
+    parent::invalidateTagsOnSave($update);
+    if ($this->getJob()) {
+      $tags = $this->getJob()->getEntityType()->getListCacheTags();
+      if ($update) {
+        $tags = Cache::mergeTags($tags, $this->getJob()
+          ->getCacheTagsToInvalidate());
+      }
+      Cache::invalidateTags($tags);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function getStates() {
     return array(
       static::STATE_ACTIVE => t('In progress'),
diff --git a/translators/tmgmt_local/src/Entity/LocalTaskItem.php b/translators/tmgmt_local/src/Entity/LocalTaskItem.php
index 2ea7fd6..1b8b191 100644
--- a/translators/tmgmt_local/src/Entity/LocalTaskItem.php
+++ b/translators/tmgmt_local/src/Entity/LocalTaskItem.php
@@ -8,6 +8,7 @@
 namespace Drupal\tmgmt_local\Entity;
 
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Cache\Cache;
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityChangedTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
@@ -342,6 +343,18 @@ class LocalTaskItem extends ContentEntityBase implements LocalTaskItemInterface
   }
 
   /**
+   * {@inheritdoc}
+   */
+  protected function invalidateTagsOnSave($update) {
+    parent::invalidateTagsOnSave($update);
+    $tags = $this->getTask()->getEntityType()->getListCacheTags();
+    if ($update) {
+      $tags = Cache::mergeTags($tags, $this->getTask()->getCacheTagsToInvalidate());
+    }
+    Cache::invalidateTags($tags);
+  }
+
+  /**
    * Retrieve a labeled list of all available statuses for task items.
    *
    * @return array
diff --git a/translators/tmgmt_local/src/Form/LocalTaskItemForm.php b/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
index a278140..89b19a2 100644
--- a/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
+++ b/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
@@ -9,7 +9,6 @@ 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;
@@ -343,7 +342,7 @@ class LocalTaskItemForm extends ContentEntityForm {
     // Write the translated data into the job item.
     if (isset($values[$key]) && is_array($values[$key]) && isset($values[$key]['translation'])) {
       $update['#status'] = $action == 'finish' ? TMGMT_DATA_ITEM_STATE_TRANSLATED : TMGMT_DATA_ITEM_STATE_PENDING;
-      $update['#text'] = $values[$key]['translation'];
+      $update['#text'] = is_array($values[$key]['translation']) ? $values[$key]['translation']['value'] : $values[$key]['translation'];
       $item->updateData($key, $update);
       $item->save();
 
diff --git a/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php b/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
index 05d9482..3694c99 100755
--- a/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
+++ b/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
@@ -440,14 +440,13 @@ class LocalTranslatorTest extends TMGMTTestBase {
 
     // Review and accept the first item.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
-    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task')->resetCache();
-    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     /** @var \Drupal\tmgmt\JobItemInterface $item1 */
     $item1 = JobItem::load(1);
     $item1->acceptTranslation();
 
     // The first item should be accepted now, the second still in progress.
+    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     $this->drupalGet('translate/1');
     $this->assertRaw('icons/73b355/check.svg" title="Completed"');
     $this->assertRaw('tmgmt/icons/ready.svg" title="Untranslated"');
@@ -489,8 +488,6 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->assertRaw('icons/73b355/check.svg" title="Completed"');
     $this->assertRaw('tmgmt/icons/ready.svg" title="Untranslated"');
 
-    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task')->resetCache();
-    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     /** @var \Drupal\tmgmt_local\Entity\LocalTask $task */
     $task = entity_load('tmgmt_local_task', $task->id(), TRUE);
@@ -515,8 +512,10 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->clickLink(t('Translate'));
     $this->drupalPostAjaxForm(NULL, [], 'finish-dummy|deep_nesting');
     $this->assertRaw('name="reject-dummy|deep_nesting"', "'✗' button appears.");
+    $this->drupalGet('translate/' . $task->id());
+    $this->asserTaskItemProgress(1, '0/0/1');
+    $this->asserTaskItemProgress(2, '0/1/0');
 
-    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task')->resetCache();
     \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     /** @var \Drupal\tmgmt_local\Entity\LocalTask $task */
@@ -534,12 +533,8 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->assertEqual($second_task_item->getCountCompleted(), 0);
     $this->assertEqual($second_task_item->getCountTranslated(), 1);
     $this->assertEqual($second_task_item->getCountUntranslated(), 0);
-    $this->drupalPostForm(NULL, [], t('Save'));
-    $this->asserTaskItemProgress(1, '0/0/1');
-    $this->asserTaskItemProgress(2, '0/1/0');
 
     // Check the job data.
-    \Drupal::entityTypeManager()->getStorage('tmgmt_job')->resetCache();
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
     $job = Job::load($job->id());
     list($item1, $item2) = array_values($job->getItems());
@@ -563,15 +558,20 @@ class LocalTranslatorTest extends TMGMTTestBase {
 
     // Review and accept the second item.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
-    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task')->resetCache();
-    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     $item1 = JobItem::load(2);
     $item1->acceptTranslation();
 
     // Refresh the page.
     $this->drupalGet('translate');
+    // We should have been redirect back to the overview, the task should be
+    // completed now.
+    $this->assertNoText($task->getJob()->label());
+    $this->clickLink(t('Closed'));
+    $this->assertText($task->getJob()->label());
+    $this->assertText(t('Completed'));
 
+    \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     $task = tmgmt_local_task_load($task->id());
     $this->assertTrue($task->isClosed());
     $this->assertEqual($task->getCountCompleted(), 2);
@@ -587,14 +587,6 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->assertEqual($second_task_item->getCountTranslated(), 0);
     $this->assertEqual($second_task_item->getCountUntranslated(), 0);
 
-    // We should have been redirect back to the overview, the task should be
-    // completed now.
-    $this->assertNoText($task->getJob()->label());
-    $this->clickLink(t('Closed'));
-    $this->assertText($task->getJob()->label());
-    $this->assertText(t('Completed'));
-
-    \Drupal::entityTypeManager()->getStorage('tmgmt_job')->resetCache();
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
     $job = Job::load($job->id());
     list($item1, $item2) = array_values($job->getItems());
