diff --git a/src/Controller/DataItemDiffController.php b/src/Controller/DataItemDiffController.php
new file mode 100644
index 0000000..063c19b
--- /dev/null
+++ b/src/Controller/DataItemDiffController.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tmgmt\Controller\DataItemDiffController.
+ */
+
+namespace Drupal\tmgmt\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Url;
+use Drupal\tmgmt\Entity\JobItem;
+
+/**
+ * Returns responses for Data Item Diff routes.
+ */
+class DataItemDiffController extends ControllerBase {
+
+  /**
+   * Returns a table with the differences between the data item and the source.
+   *
+   * @param int $tmgmt_job_item
+   *   The Job item id.
+   * @param string $tmgmt_data_item
+   *   The field key.
+   *
+   * @return array
+   *   Table showing the diff between the data item and the source.
+   */
+  public function compareSourceDataItem($tmgmt_job_item, $tmgmt_data_item) {
+    /** @var \Drupal\tmgmt\JobItemInterface $item */
+    $item = JobItem::load($tmgmt_job_item);
+
+    $diff_rows = array();
+    $build = array(
+      '#title' => $this->t('Revisions for %title', array('%title' => $item->label())),
+    );
+
+    $new_data = \Drupal::service('tmgmt.data')->flatten($item->getSourceData());
+    $keys = \Drupal::service('tmgmt.data')->ensureArrayKey($tmgmt_data_item);
+    $current_data = $item->getData($keys);
+
+    $diff_header = ['Current text', 'New text'];
+
+    $current_lines = explode("\n", $current_data['#text']);
+    $target_key = str_replace('|', '][', $tmgmt_data_item);
+    $new_lines = explode("\n", $new_data[$target_key]['#text']);
+
+    $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'] = array(
+      '#type' => 'table',
+      '#header' => $diff_header,
+      '#rows' => $diff_rows,
+      '#empty' => $this->t('No visible changes'),
+      '#attributes' => array(
+        'class' => array('diff'),
+      ),
+    );
+
+    $build['back'] = array(
+      '#type' => 'link',
+      '#attributes' => array(
+        'class' => array(
+          'button',
+        ),
+      ),
+      '#title' => $this->t('Back to Job Item'),
+      '#url' => Url::fromRoute('entity.tmgmt_job_item.canonical', ['tmgmt_job_item' => $item->id()]),
+    );
+
+    return $build;
+  }
+
+}
diff --git a/src/Form/JobItemForm.php b/src/Form/JobItemForm.php
index dc8370f..bd48d48 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;
@@ -176,6 +178,13 @@ class JobItemForm extends TmgmtFormBase {
       '#validate' => ['::validateTags'],
       '#submit' => ['::submitForm'],
     );
+    $actions['has_changed_source'] = array(
+      '#type' => 'submit',
+      '#value' => t('Has changed'),
+      '#access' => !$item->isAccepted(),
+      '#validate' => ['::hasChangedSource'],
+      '#submit' => ['::submitForm'],
+    );
     if ($item->getSourcePlugin() instanceof SourcePreviewInterface && $item->getSourcePlugin()->getPreviewUrl($item)) {
       $actions['preview'] = [
         '#type' => 'link',
@@ -528,11 +537,19 @@ 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'] = array(
+            '#title' => t('Source changed'),
+            '#type' => 'item',
+            '#value' => $form_state->get('source_changed')[$target_key],
+          );
+        }
+
+        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]),
           );
         }
 
@@ -670,4 +687,36 @@ class JobItemForm extends TmgmtFormBase {
     return $counted_tags;
   }
 
+  /**
+   * Submit handler for check if source has changed.
+   */
+  function hasChangedSource(array $form, FormStateInterface $form_state) {
+    $item = $this->entity;
+    $source_changed = array();
+    foreach ($form_state->getValues() as $field => $value) {
+      if (is_array($value) && isset($value['translation'])) {
+        $keys = \Drupal::service('tmgmt.data')->ensureArrayKey($field);
+        $new_data = \Drupal::service('tmgmt.data')->flatten($item->getSourceData());
+        $current_data = $item->getData($keys);
+        $target_key = str_replace('|', '][', $field);
+        if ($current_data['#text'] != $new_data[$target_key]['#text']) {
+          $source_changed[$field] = 'The source has changed. ' . Link::fromTextAndUrl('View diff', Url::fromRoute('tmgmt.data_item_diff', [
+            'tmgmt_job_item' => $item->id(),
+            'tmgmt_data_item' => $field,
+          ]))->toString();
+        }
+      }
+    }
+    $form_state->set('source_changed', $source_changed);
+    $request = \Drupal::request();
+    $url = $this->entity->toUrl('canonical');
+    if ($request->query->has('destination')) {
+      $destination = $request->query->get('destination');
+      $request->query->remove('destination');
+      $url->setOption('query', array('destination' => $destination));
+    }
+    $form_state->setRedirectUrl($url);
+    $form_state->setRebuild();
+  }
+
 }
diff --git a/src/Tests/TMGMTUiReviewTest.php b/src/Tests/TMGMTUiReviewTest.php
index 1b2727f..47ec82f 100644
--- a/src/Tests/TMGMTUiReviewTest.php
+++ b/src/Tests/TMGMTUiReviewTest.php
@@ -21,7 +21,7 @@ use Drupal\tmgmt\Entity\JobItem;
  */
 class TMGMTUiReviewTest extends EntityTestBase {
 
-  public static $modules = [ 'tmgmt_content', 'image', 'node'];
+  public static $modules = ['tmgmt_content', 'image', 'node'];
 
   /**
    * {@inheritdoc}
@@ -517,4 +517,53 @@ 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();
+
+    $this->drupalPostForm('admin/tmgmt/items/1', [], t('Has changed'));
+    $this->assertNoText('The source has changed.');
+    $this->assertNoLink('View diff');
+
+    \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->drupalPostForm(NULL, [], t('Has changed'));
+    $this->assertText('The source has changed.');
+    $this->clickLink('View diff');
+    $this->assertText('Example text');
+    $this->assertText('Example text modified');
+  }
+
 }
diff --git a/tmgmt.routing.yml b/tmgmt.routing.yml
index ee06265..07362f5 100644
--- a/tmgmt.routing.yml
+++ b/tmgmt.routing.yml
@@ -110,6 +110,16 @@ entity.tmgmt_job.continuous_add_form:
   requirements:
     _custom_access: '\Drupal\tmgmt\Form\ContinuousJobForm::access'
 
+tmgmt.data_item_diff:
+  path: '/admin/tmgmt/items/{tmgmt_job_item}/diff/{tmgmt_data_item}'
+  defaults:
+    _controller: '\Drupal\tmgmt\Controller\DataItemDiffController::compareSourceDataItem'
+    _title: Data Item Source Diff
+  requirements:
+    _permission: 'create translation jobs+accept translation jobs'
+  options:
+    _admin_route: TRUE
+
 tmgmt.source_overview_default:
   path: '/admin/tmgmt/sources'
   defaults:
diff --git a/tmgmt.theme.inc b/tmgmt.theme.inc
index db3e051..b212641 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,9 @@ function theme_tmgmt_translator_review_form($variables) {
         $element_group = '<tr>' . tmgmt_build_table_cell($cell, TRUE) . '</tr>';
       }
     }
+    if (isset($element[$key]['source_changed'])) {
+      $source_changed = '<div class="tmgmt_source_changed"> <p class="messages messages--warning">' . $element[$key]['source_changed']['#value'] . '</p> </div>';
+    }
     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 +287,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>';
 }
