diff --git a/translators/tmgmt_local/src/Form/LocalTaskItemForm.php b/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
index 6b6d313..f03b1fe 100644
--- a/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
+++ b/translators/tmgmt_local/src/Form/LocalTaskItemForm.php
@@ -159,7 +159,7 @@ class LocalTaskItemForm extends ContentEntityForm {
 
         $form[$target_key]['translation'] = [
           '#type' => 'textarea',
-          '#default_value' => $item->getData(\Drupal::service('tmgmt.data')->ensureArrayKey($key), '#text'),
+          '#default_value' => isset($data[$key]['#translation']['#text']) ? $data[$key]['#translation']['#text'] : NULL,
           '#title' => $target_language->getName(),
           '#disabled' => !$item->isPending(),
           '#rows' => $rows,
@@ -184,7 +184,7 @@ class LocalTaskItemForm extends ContentEntityForm {
             '#value' => '✗',
             '#attributes' => array('title' => t('Reject')),
             '#name' => 'reject-' . $target_key,
-            '#submit' => array('::submitStatus'),
+            '#submit' => ['::save', '::submitStatus'],
             '#ajax' => array(
               'callback' => '::ajaxReviewForm',
               'wrapper' => $form[$target_key]['#ajaxid'],
@@ -200,7 +200,7 @@ class LocalTaskItemForm extends ContentEntityForm {
             '#value' => '✓',
             '#attributes' => array('title' => t('Finish')),
             '#name' => 'finish-' . $target_key,
-            '#submit' => array('::submitStatus'),
+            '#submit' => ['::save', '::submitStatus'],
             '#ajax' => array(
               'callback' => '::ajaxReviewForm',
               'wrapper' => $form[$target_key]['#ajaxid'],
@@ -230,10 +230,10 @@ class LocalTaskItemForm extends ContentEntityForm {
         // it has changed. We have two different cases, the first is for nested
         // texts.
         if (is_array($value['translation'])) {
-          $update['#text'] = $value['translation']['value'];
+          $update['#translation']['#text'] = $value['translation']['value'];
         }
         else {
-          $update['#text'] = $value['translation'];
+          $update['#translation']['#text'] = $value['translation'];
         }
         $task_item->updateData($key, $update);
       }
@@ -243,7 +243,7 @@ class LocalTaskItemForm extends ContentEntityForm {
     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.', [
         ':task_item' => $task_item->urlInfo()->toString(),
-        '@task_item_title' => $task_item->label()
+        '@task_item_title' => $task_item->label(),
       ]));
     }
 
@@ -268,8 +268,9 @@ class LocalTaskItemForm extends ContentEntityForm {
 
     // Mark the task as completed if all assigned job items are at needs done.
     $all_done = TRUE;
+    /** @var \Drupal\tmgmt_local\Entity\LocalTaskItem $item */
     foreach ($task->getItems() as $item) {
-      if ($item->isPending()) {
+      if (!$item->isCompleted() && !$item->isClosed()) {
         $all_done = FALSE;
         break;
       }
@@ -289,10 +290,10 @@ class LocalTaskItemForm extends ContentEntityForm {
     $job_item = $this->entity->getJobItem();
 
     // Add the translations to the job item.
-    $job_item->addTranslatedData($task_item->getData());
+    $job_item->addTranslatedData($this->prepareData($task_item->getData()), [], TMGMT_DATA_ITEM_STATE_TRANSLATED);
     drupal_set_message(t('The translation for <a href=:task_item>@task_item_title</a> has been saved as completed.', [
       ':task_item' => $task_item->urlInfo()->toString(),
-      '@task_item_title' => $task_item->label()
+      '@task_item_title' => $task_item->label(),
     ]));
   }
 
@@ -336,7 +337,6 @@ 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_UNTRANSLATED;
-      $update['#text'] = is_array($values[$key]['translation']) ? $values[$key]['translation']['value'] : $values[$key]['translation'];
       $item->updateData($key, $update);
       $item->save();
 
@@ -345,4 +345,33 @@ class LocalTaskItemForm extends ContentEntityForm {
     }
   }
 
+  /**
+   * Prepare the date to be added to the JobItem.
+   *
+   * Right now JobItem looks for ['#text'] so if we send our structure it will
+   * add as translation text our original text, so we are replacing ['#text']
+   * with ['#translation']['#text']
+   *
+   * @param array $data
+   *   The data items.
+   *
+   * @return array
+   *   Returns the data items ready to be added to the JobItem.
+   */
+  protected function prepareData(array $data) {
+    if (isset($data['#text'])) {
+      if (isset($data['#translation']['#text'])) {
+        $data['#text'] = $data['#translation']['#text'];
+      }
+      else {
+        $data['#text'] = '';
+      }
+      return $data;
+    }
+    foreach (Element::children($data) as $key) {
+      $data[$key] = $this->prepareData($data[$key]);
+    }
+    return $data;
+  }
+
 }
diff --git a/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php b/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
index 44248c3..2463d15 100755
--- a/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
+++ b/translators/tmgmt_local/src/Tests/LocalTranslatorTest.php
@@ -422,11 +422,21 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->assertRaw('tmgmt/icons/gray-check.svg" title="Translated"');
     $this->assertText('The translation for ' . $first_task_item->label() . ' has been saved as completed.');
 
+    // Check that the source has not being modified.
+    $this->clickLink(t('View'));
+    /** @var \Drupal\tmgmt\JobItemInterface $job_item */
+    $job_items = $job->getItems(['tjiid' => 1]);
+    $job_item = reset($job_items);
+    $source = $job_item->getData(['dummy', 'deep_nesting', '#text']);
+    $this->assertText($source);
+
     // Review and accept the first item.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     /** @var \Drupal\tmgmt\JobItemInterface $item1 */
     $item1 = JobItem::load(1);
+    // The first item should be available for review.
+    $this->assertTrue($item1->isNeedsReview(), 'Job item 1 needs review.');
     $item1->acceptTranslation();
 
     // The first item should be accepted now, the second still in progress.
@@ -484,12 +494,13 @@ class LocalTranslatorTest extends TMGMTTestBase {
 
     // Check the job data.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
+    /** @var \Drupal\tmgmt\JobInterface $job */
     $job = Job::load($job->id());
+    /** @var \Drupal\tmgmt\JobItemInterface $item2 */
     list($item1, $item2) = array_values($job->getItems());
-    // The text in the first item should be available for review, the
-    // translation of the second item not.
-    $this->assertEqual($item1->getData(array('dummy', 'deep_nesting', '#translation', '#text')), $translation1);
-    $this->assertEqual($item2->getData(array('dummy', 'deep_nesting', '#translation', '#text')), '');
+    $this->assertTrue($item1->isAccepted(), 'Job item 1 is accepted.');
+    // The first item should be active.
+    $this->assertTrue($item2->isActive(), 'Job item 2 is still active.');
 
     // Check the overview page, the task should still show in progress.
     $this->drupalGet('translate');
@@ -864,7 +875,10 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->assertTaskStatusIcon(1, 'manage-translate-task', 'assigned', 'Needs action');
 
     // Save the first item as completed and check item icons and progress.
-    $this->drupalPostForm('/translate/items/1', NULL, t('Save as completed'));
+    $edit = [
+      'dummy|deep_nesting[translation]' => 'German translation',
+    ];
+    $this->drupalPostForm('/translate/items/1', $edit, t('Save as completed'));
     $this->assertTaskItemStatusIcon(1, 'Translated');
     $this->assertTaskItemStatusIcon(2, 'Untranslated');
     $this->assertTaskItemProgress(1, 0, 0, 1);
@@ -877,7 +891,11 @@ class LocalTranslatorTest extends TMGMTTestBase {
     $this->assertTaskStatusIcon(1, 'manage-translate-task', 'assigned', 'Needs action');
 
     // Save the second item as completed.
-    $this->drupalPostForm('/translate/items/2', NULL, t('Save as completed'));
+    $edit = [
+      'title|deep_nesting[translation]' => 'German translation of title',
+      'text|deep_nesting[translation]' => 'German translation of text',
+    ];
+    $this->drupalPostForm('/translate/items/2', $edit, t('Save as completed'));
     // Check the icon a progress bar of the task.
     $this->assertTaskProgress(1, 'my-tasks', 0, 0, 3);
     $this->assertTaskStatusIcon(1, 'task-overview', 'my-tasks', 'In review');
