diff --git a/css/tmgmt.admin.css b/css/tmgmt.admin.css
index 4feeb72..3543306 100644
--- a/css/tmgmt.admin.css
+++ b/css/tmgmt.admin.css
@@ -55,6 +55,10 @@ table.tmgmt-ui-review tbody th {
   font-weight: bold;
 }
 
+.tmgmt-review-message-inline {
+  display: inline;
+}
+
 .tmgmt-ui-data-item-label .form-item {
   /* Get the label out of way, so the status icon can be placed at the same
   relative position */
diff --git a/src/Form/JobItemForm.php b/src/Form/JobItemForm.php
index fa83f94..adba5a2 100644
--- a/src/Form/JobItemForm.php
+++ b/src/Form/JobItemForm.php
@@ -10,6 +10,8 @@ namespace Drupal\tmgmt\Form;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Component\Utility\Xss;
+use Drupal\Core\Link;
+use Drupal\Core\Url;
 use Drupal\tmgmt\Entity\JobItem;
 use Drupal\tmgmt\JobItemInterface;
 use Drupal\tmgmt\SourcePreviewInterface;
@@ -121,6 +123,7 @@ class JobItemForm extends TmgmtFormBase {
     );
     // Build the review form.
     $data = $item->getData();
+    $this->hasChangedSource(\Drupal::service('tmgmt.data')->flatten($data), $form_state);
     // Need to keep the first hierarchy. So flatten must take place inside
     // of the foreach loop.
     $zebra = 'even';
@@ -544,11 +547,35 @@ class JobItemForm extends TmgmtFormBase {
           );
         }
 
-        if(isset($form_state->get('validation_messages')[$target_key])) {
+        if (isset($form_state->get('source_changed')[$target_key])) {
+          $form[$target_key]['source_changed'] = [
+            '#title' => t('Source changed'),
+            '#type' => 'item',
+            '#value' => $form_state->get('source_changed')[$target_key],
+          ];
+          $form[$target_key]['source_changed']['message'] = [
+            '#title' => t('Source changed'),
+            '#type' => 'item',
+            '#value' => $form_state->get('source_changed')[$target_key],
+          ];
+          $form[$target_key]['source_changed']['diff_button'] = [
+            '#type' => 'submit',
+            '#value' => 'Show diff',
+            '#name' => 'diff-button-' . $target_key,
+            '#data_item_key' => $key,
+            '#submit' => ['::submitRebuild'],
+            '#ajax' => [
+              'callback' => [$this, 'ajaxShowDiff'],
+              'wrapper' => $form['#ajaxid'],
+            ],
+          ];
+        }
+
+        if (isset($form_state->get('validation_messages')[$target_key])) {
           $form[$target_key]['validation_message'] = array(
             '#title' => t('Validation message'),
             '#type' => 'item',
-            '#value' =>  htmlspecialchars($form_state->get('validation_messages')[$target_key]),
+            '#value' => htmlspecialchars($form_state->get('validation_messages')[$target_key]),
           );
         }
 
@@ -686,4 +713,82 @@ class JobItemForm extends TmgmtFormBase {
     return $counted_tags;
   }
 
+  /**
+   * Check if the source has changed.
+   *
+   * @param array $data
+   *   The data items.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The form state.
+   */
+  public function hasChangedSource(array $data, FormStateInterface $form_state) {
+    $item = $this->entity;
+    $source_changed = [];
+    foreach ($data as $target_key => $value) {
+      if (is_array($value) && isset($value['#translate']) && $value['#translate']) {
+        $field = str_replace('][', '|', $target_key);
+        $keys = \Drupal::service('tmgmt.data')->ensureArrayKey($field);
+        $new_data = \Drupal::service('tmgmt.data')->flatten($item->getSourceData());
+        $current_data = $item->getData($keys);
+        if ($current_data['#text'] != $new_data[$target_key]['#text']) {
+          $source_changed[$field] = 'The source has changed.';
+        }
+      }
+    }
+    $form_state->set('source_changed', $source_changed);
+  }
+
+  /**
+   * Submit handler to show the diff table of the source.
+   */
+  public function ajaxShowDiff(array $form, FormStateInterface $form_state) {
+    $item = $this->entity;
+    $diff_rows = [];
+
+    $new_data = \Drupal::service('tmgmt.data')->flatten($item->getSourceData());
+    $target_key = $form_state->getTriggeringElement()['#data_item_key'];
+    $tmgmt_data_item = str_replace('][', '|', $target_key);
+    $keys = \Drupal::service('tmgmt.data')->ensureArrayKey($tmgmt_data_item);
+    $current_data = $item->getData($keys);
+
+    $diff_header = [t('Current text'), t('New text')];
+
+    $current_lines = explode("\n", $current_data['#text']);
+    $new_lines = explode("\n", $new_data[$target_key]['#text']);
+
+    $build = [
+      '#title' => $this->t('Comparison between the data item "%data_item" and the source field "%source_field"', [
+        '%data_item' => $current_data['#label'],
+        '%source_field' => $new_data[$target_key]['#label'],
+      ]),
+    ];
+
+    $max = max(count($current_lines), count($new_lines));
+
+    for ($i = 0; $i < $max; $i++) {
+      $diff_rows[] = [
+        'data' => [
+          ['data' => isset($current_lines[$i]) ? $current_lines[$i] : ''],
+          ['data' => isset($new_lines[$i]) ? $new_lines[$i] : ''],
+        ],
+      ];
+    }
+
+    $build['diff'] = [
+      '#type' => 'table',
+      '#header' => $diff_header,
+      '#rows' => $diff_rows,
+      '#empty' => $this->t('No visible changes'),
+      '#attributes' => [
+        'class' => ['diff'],
+      ],
+    ];
+
+    $key = array_slice($form_state->getTriggeringElement()['#array_parents'], 0, 2);
+    $render_data = NestedArray::getValue($form, $key);
+    $render_data[$tmgmt_data_item]['source_changed'] = $build;
+
+    return $render_data;
+  }
+
 }
diff --git a/src/Tests/TMGMTUiReviewTest.php b/src/Tests/TMGMTUiReviewTest.php
index fedf014..a1cd9f6 100644
--- a/src/Tests/TMGMTUiReviewTest.php
+++ b/src/Tests/TMGMTUiReviewTest.php
@@ -521,4 +521,50 @@ class TMGMTUiReviewTest extends EntityTestBase {
     $label = $this->xpath('//*[@id="tmgmt-ui-element-image-test-single-wrapper"]/table/tbody/tr[3]/td[1]/div[1]/label');
     $this->assertEqual($label[0], 'Title');
   }
+
+  /**
+   * Tests update the source and show the diff of the source.
+   */
+  public function testSourceUpdate() {
+    $job = $this->createJob('en', 'de');
+    $job->translator = $this->default_translator;
+    $job->save();
+    \Drupal::state()->set('tmgmt.test_source_data', array(
+      'title' => array(
+        'deep_nesting' => array(
+          '#text' => 'Example text',
+          '#label' => 'Label for job item with type test and id 1.',
+          '#translate' => TRUE,
+        ),
+      ),
+    ));
+    $job->addItem('test_source', 'test', '1');
+    $job->save();
+
+    $edit = array(
+      'target_language' => 'de',
+      'settings[action]' => 'submit',
+    );
+    $this->drupalPostForm('admin/tmgmt/jobs/' . $job->id(), $edit, t('Submit to provider'));
+
+    $job->requestTranslation();
+
+    \Drupal::state()->set('tmgmt.test_source_data', array(
+      'title' => array(
+        'deep_nesting' => array(
+          '#text' => 'Example text modified',
+          '#label' => 'This source has been changed.',
+          '#translate' => TRUE,
+        ),
+      ),
+    ));
+
+    $this->drupalGet('admin/tmgmt/items/1');
+    $this->assertText('The source has changed.');
+
+    $this->drupalPostAjaxForm(NULL, [], 'diff-button-title|deep_nesting');
+    $this->assertText('Example text');
+    $this->assertText('Example text modified');
+  }
+
 }
diff --git a/tmgmt.theme.inc b/tmgmt.theme.inc
index db3e051..d76447f 100644
--- a/tmgmt.theme.inc
+++ b/tmgmt.theme.inc
@@ -239,6 +239,7 @@ function theme_tmgmt_translator_review_form($variables) {
   $result = '';
   $labels = '';
   $parent_label = '';
+  $source_changed = '';
   $validation_message = '';
   $element_groups = array();
   $element_group = '';
@@ -265,6 +266,15 @@ function theme_tmgmt_translator_review_form($variables) {
         $element_group = '<tr>' . tmgmt_build_table_cell($cell, TRUE) . '</tr>';
       }
     }
+    if (isset($element[$key]['source_changed'])) {
+      if (isset($element[$key]['source_changed']['message'])) {
+        $source_changed = '<div class="tmgmt_source_changed"> <div class="messages messages--warning"><span class="tmgmt-review-message-inline"><span>' . $element[$key]['source_changed']['message']['#value'] . '</span>' . \Drupal::service('renderer')
+            ->render($element[$key]['source_changed']['diff_button']) . '</span></div></div>';
+      }
+      else {
+        $source_changed = \Drupal::service('renderer')->render($element[$key]['source_changed']);
+      }
+    }
     if (isset($element[$key]['validation_message'])) {
       $validation_message = '<div class="tmgmt_validation_message"> <p class="messages messages--warning">' . $element[$key]['validation_message']['#value'] . '</p> </div>';
     }
@@ -283,7 +293,7 @@ function theme_tmgmt_translator_review_form($variables) {
     );
     $result = '<thead><tr>' . tmgmt_build_table_cell($cell) . '</tr></thead>' . implode('', $element_groups);
   }
-  $table = '<table class="tmgmt-ui-review"><colgroup width="100" /><colgroup width="*" span="2" /><colgroup width="100" />' . $result . '</table>' . $validation_message;
+  $table = '<table class="tmgmt-ui-review"><colgroup width="100" /><colgroup width="*" span="2" /><colgroup width="100" />' . $result . '</table>' . $source_changed . $validation_message;
 
   return '<div id="' . $element['#ajaxid'] . '">' . $table . '</div>';
 }
