diff --git a/sources/content/src/Tests/ContentEntitySourceUiTest.php b/sources/content/src/Tests/ContentEntitySourceUiTest.php
index 0e66e9c..9151521 100644
--- a/sources/content/src/Tests/ContentEntitySourceUiTest.php
+++ b/sources/content/src/Tests/ContentEntitySourceUiTest.php
@@ -189,6 +189,15 @@ class ContentEntitySourceUiTest extends EntityTestBase {
     );
     $this->drupalPostForm(NULL, $edit, t('Request translation'));
     $this->drupalPostForm(NULL, array(), t('Submit to provider'));
+    $edit = array(
+      'languages[fr]' => TRUE,
+    );
+    $this->drupalPostForm(NULL, $edit, t('Request translation'));
+    $edit = array(
+      'target_language' => 'de',
+    );
+    $this->drupalPostForm(NULL, $edit, t('Submit to provider'));
+    $this->assertText(t('1 conflicting item has been dropped.'));
     $this->clickLink(t('Needs review'));
 
     // Delete the node and assert that the job can not be accepted.
diff --git a/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php b/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php
index 92a7987..f1b52c9 100644
--- a/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php
+++ b/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php
@@ -85,6 +85,7 @@ class ConfigSourceListTest extends EntityTestBase {
     // This is still one job, unlike when selecting more languages.
     $this->assertText(t('One job needs to be checked out.'));
     $this->assertText(t('Article content type and 1 more (English to ?, Unprocessed)'));
+    $this->assertText(t('1 item conflict with pending item and will be dropped on submission.'));
 
     // Submit.
     $this->drupalPostForm(NULL, array(), t('Submit to provider'));
@@ -93,7 +94,7 @@ class ConfigSourceListTest extends EntityTestBase {
     $this->assertUrl('admin/tmgmt/sources/config/node_type');
 
     $this->assertText(t('Test translation created.'));
-    $this->assertText(t('The translation of Article content type to German is finished and can now be reviewed.'));
+    $this->assertNoText(t('The translation of Article content type to German is finished and can now be reviewed.'));
     $this->assertText(t('The translation of Page content type to German is finished and can now be reviewed.'));
   }
 
@@ -136,6 +137,7 @@ class ConfigSourceListTest extends EntityTestBase {
     // Verify that we are on the translate tab.
     $this->assertText(t('One job needs to be checked out.'));
     $this->assertText(t('Archive view and 3 more (English to ?, Unprocessed)'));
+    $this->assertText(t('1 item conflict with pending item and will be dropped on submission.'));
 
     // Submit.
     $this->drupalPostForm(NULL, array(), t('Submit to provider'));
@@ -144,7 +146,7 @@ class ConfigSourceListTest extends EntityTestBase {
     $this->assertUrl('admin/tmgmt/sources/config/view');
 
     $this->assertText(t('Test translation created.'));
-    $this->assertText(t('The translation of Archive view to German is finished and can now be reviewed.'));
+    $this->assertNoText(t('The translation of Archive view to German is finished and can now be reviewed.'));
     $this->assertText(t('The translation of Recent content view to German is finished and can now be reviewed.'));
     $this->assertText(t('The translation of Content view to German is finished and can now be reviewed.'));
     $this->assertText(t('The translation of Job overview view to German is finished and can now be reviewed.'));
diff --git a/src/Form/JobForm.php b/src/Form/JobForm.php
index 7e61e67..1efcd5f 100644
--- a/src/Form/JobForm.php
+++ b/src/Form/JobForm.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\tmgmt\Form;
 
-use Drupal\Component\Utility\Html;
 use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\InvokeCommand;
 use Drupal\Core\Ajax\ReplaceCommand;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
@@ -56,10 +56,14 @@ class JobForm extends TmgmtFormBase {
 
     $source = $job->getSourceLanguage() ? $job->getSourceLanguage()->getName() : '?';
     if (!$job->getTargetLangcode() || $job->getTargetLangcode() == LanguageInterface::LANGCODE_NOT_SPECIFIED) {
+      $form_state->set('check_target_language', 'und');
       $job->target_language = key($available['target_language']);
       $target = '?';
     }
     else {
+      if($form_state->get('check_target_language') == FALSE) {
+        $form_state->set('check_target_language', $job->getTargetLangcode());
+      }
       $target = $job->getTargetLanguage()->getName();
     }
 
@@ -208,6 +212,21 @@ class JobForm extends TmgmtFormBase {
       );
     }
 
+    if(!$job->isContinuous()) {
+      // Checkout whether given source already has items in translation.
+      $num_of_existing_items = count($this->checkoutExistingItems($form_state->get('check_target_language')));
+      $form['message'] = array(
+        '#type' => 'html_tag',
+        '#tag' => 'div',
+        '#value' => \Drupal::translation()->formatPlural($num_of_existing_items, '1 item conflict with pending item and will be dropped on submission.', '@count items conflict with pending items and will be dropped on submission.'),
+        '#prefix' => '<div class="messages existing-items messages--warning hidden">',
+        '#suffix' => '</div>',
+      );
+      if ($num_of_existing_items) {
+        $form['message']['#prefix'] = '<div class="messages existing-items messages--warning">';
+      }
+    }
+
     // Display created time only for jobs that are not new anymore.
     if (!$job->isUnprocessed() && !$job->isContinuousActive()) {
       $form['info']['created'] = array(
@@ -525,6 +544,17 @@ class JobForm extends TmgmtFormBase {
    * Overrides Drupal\Core\Entity\EntityForm::save().
    */
   public function save(array $form, FormStateInterface $form_state) {
+
+    $job = $this->entity;
+    if(!$job->isContinuous()) {
+      $existing_items_ids = $this->checkoutExistingItems($form_state->get('check_target_language'));
+      if ($existing_items_ids) {
+        entity_delete_multiple('tmgmt_job_item', $existing_items_ids);
+        $num_of_items = count($existing_items_ids);
+        drupal_set_message(\Drupal::translation()->formatPlural($num_of_items, '1 conflicting item has been dropped.', '@count conflicting items have been dropped.'));
+      }
+    }
+
     parent::save($form, $form_state);
 
     // Everything below this line is only invoked if the 'Submit to provider'
@@ -607,10 +637,18 @@ class JobForm extends TmgmtFormBase {
    * target / source language dropdowns.
    */
   public function ajaxLanguageSelect(array $form, FormStateInterface $form_state) {
+    $number_of_existing_items = count($this->checkoutExistingItems($form_state->get('check_target_language')));
     $replace = $form_state->getUserInput()['_triggering_element_name'] == 'source_language' ? 'target_language' : 'source_language';
     $response = new AjaxResponse();
     $response->addCommand(new ReplaceCommand('#tmgmt-ui-translator-wrapper', $form['translator_wrapper']));
     $response->addCommand(new ReplaceCommand('#tmgmt-ui-' . str_replace('_', '-', $replace), $form['info'][$replace]));
+    if ($number_of_existing_items) {
+      $response->addCommand(new InvokeCommand('.existing-items', 'removeClass', array('hidden')));
+      $response->addCommand(new ReplaceCommand('.existing-items > div', \Drupal::translation()->formatPlural($number_of_existing_items, '1 item conflict with pending item and will be dropped on submission.', '@count items conflict with pending items and will be dropped on submission.')));
+    }
+    else {
+      $response->addCommand(new InvokeCommand('.existing-items', 'addClass', array('hidden')));
+    }
     return $response;
   }
 
@@ -622,6 +660,37 @@ class JobForm extends TmgmtFormBase {
   }
 
   /**
+   * Helper function for retrieving number of existing items.
+   */
+  function checkoutExistingItems($check_target_language) {
+    $job = $this->entity;
+    $items = $job->getItems();
+    $latest_items_of_chosen_source = array();
+    $existing_items_ids = array();
+    if ($check_target_language == FALSE || $check_target_language != $job->getTargetLangcode()) {
+      foreach ($items as $item) {
+        $latest_items_of_chosen_source[$item->id()] = tmgmt_job_item_load_latest($item->getPlugin(), $item->getItemType(), $item->getItemId(), $job->getSourceLangcode());
+      }
+      foreach ($latest_items_of_chosen_source as $key => $item) {
+        if ($item && array_key_exists($job->getTargetLangcode(), $item)) {
+          $existing_items_ids[] = $key;
+        }
+      }
+    }
+    else {
+      foreach ($items as $item) {
+        $latest_items_of_chosen_source[$item->id()] = tmgmt_job_item_load_penultimate($item->getPlugin(), $item->getItemType(), $item->getItemId(), $job->getSourceLangcode(), $job->getTargetLangcode());
+      }
+      foreach ($latest_items_of_chosen_source as $key => $item) {
+        if ($item && array_key_exists($job->getTargetLangcode(), $item)) {
+          $existing_items_ids[] = $key;
+        }
+      }
+    }
+    return $existing_items_ids;
+  }
+
+  /**
    * Adds selected suggestions to the job.
    */
   function addSuggestionsSubmit(array $form, FormStateInterface $form_state) {
diff --git a/src/Tests/TMGMTCartTest.php b/src/Tests/TMGMTCartTest.php
index b7ff302..580daa7 100644
--- a/src/Tests/TMGMTCartTest.php
+++ b/src/Tests/TMGMTCartTest.php
@@ -97,6 +97,23 @@ class TMGMTCartTest extends TMGMTTestBase {
     $this->drupalGet('admin/tmgmt/cart');
     $this->assertText($node_cs->getTitle());
     $this->assertNoText($node_sk->getTitle());
+
+    // Test that duplicate submission of an item is not allowed.
+    $this->drupalPostForm('admin/tmgmt/cart', array(
+      'target_language[]' => array('es'),
+    ), t('Request translation'));
+
+    $job_item_cs = tmgmt_job_item_create('content', 'node', $node_cs->id());
+    $job_item_cs->save();
+    $this->drupalGet('tmgmt-add-to-cart/' . $job_item_cs->id());
+    $job_items_data[$job_item_cs->getItemId()] = $job_item_cs->getItemType();
+
+    $this->drupalPostForm('admin/tmgmt/cart', array(
+      'target_language[]' => array('es'),
+    ), t('Request translation'));
+    $this->assertText(t('1 item conflict with pending item and will be dropped on submission.'));
+    $this->drupalPostForm(NULL, array(), t('Submit to provider'));
+    $this->assertText(t('1 conflicting item has been dropped.'));
   }
 
 }
diff --git a/src/Tests/TMGMTUiReviewTest.php b/src/Tests/TMGMTUiReviewTest.php
index 3f88e60..3485de3 100644
--- a/src/Tests/TMGMTUiReviewTest.php
+++ b/src/Tests/TMGMTUiReviewTest.php
@@ -348,6 +348,9 @@ class TMGMTUiReviewTest extends EntityTestBase {
     $job1->set('translator', $translator1->id())->save();
     $job2->set('translator', $translator2->id())->save();
 
+    // Test that progress bar is being displayed.
+    $this->assertRaw('class="tmgmt-progress-pending" style="width: 50%"');
+
     // Filter jobs by translator and assert values.
     $this->drupalGet('admin/tmgmt/jobs', array('query' => array('translator' => $translator1->id())));
     $label = trim((string) $this->xpath('//table[@class="views-table views-view-table cols-10"]/tbody/tr')[0]->td[4]);
@@ -393,7 +396,6 @@ class TMGMTUiReviewTest extends EntityTestBase {
     $this->assertRaw('class="tmgmt-color-legend clearfix"');
 
     // Test that progress bar is being displayed.
-    $this->assertRaw('class="tmgmt-progress-pending" style="width: 50%"');
     $this->assertRaw('class="tmgmt-progress-translated" style="width: 100%"');
   }
 
diff --git a/src/Tests/TMGMTUiTest.php b/src/Tests/TMGMTUiTest.php
index 2c87173..3b5e8a1 100644
--- a/src/Tests/TMGMTUiTest.php
+++ b/src/Tests/TMGMTUiTest.php
@@ -153,7 +153,7 @@ class TMGMTUiTest extends EntityTestBase {
     $this->assertTrue($job->isActive());
 
     // Another job.
-    $job = tmgmt_job_match_item('en', 'es');
+    $job = tmgmt_job_match_item('en', 'de');
     $job->addItem('test_source', 'test', 1);
 
     // Go to checkout form.
@@ -348,7 +348,7 @@ class TMGMTUiTest extends EntityTestBase {
     $start_rows = $this->xpath('//tbody/tr');
     $this->assertEqual(count($start_rows), 5);
     $this->drupalGet($job4->urlInfo('delete-form'));
-    $this->assertText('Are you sure you want to delete the translation job test_source:test:1 and 2 more?');
+    $this->assertText('Are you sure you want to delete the translation job From English to Spanish?');
     $this->drupalPostForm(NULL, array(), t('Delete'));
     $this->drupalGet('admin/tmgmt/jobs', array('query' => array(
       'state' => 'All',
diff --git a/tmgmt.module b/tmgmt.module
index deb0792..a94ed79 100644
--- a/tmgmt.module
+++ b/tmgmt.module
@@ -177,6 +177,50 @@ function tmgmt_job_item_load_latest($plugin, $item_type, $item_id, $source_langu
 }
 
 /**
+  * Loads penultimate active job entities that have a job item with the identifiers.
+  *
+  * @param $plugin
+  *   The source plugin.
+  * @param $item_type
+  *   The source item type.
+  * @param $item_id
+  *   The source item id.
+  * @param string $source_language
+  *   The source language of the item.
+  * @param string $target_language
+  *   The target language of the item.
+  *
+  * @return array
+  *   An array of job entities.
+  */
+function tmgmt_job_item_load_penultimate($plugin, $item_type, $item_id, $source_language, $target_language) {
+  $query = db_select('tmgmt_job_item', 'tji');
+  $query->innerJoin('tmgmt_job', 'tj', 'tj.tjid = tji.tjid');
+  $result = $query->condition('tj.source_language', $source_language)
+    ->condition('tj.target_language', $target_language)
+    // Only query for jobs that are currently active.
+    ->condition('tj.state', [Job::STATE_UNPROCESSED, Job::STATE_ACTIVE, Job::STATE_CONTINUOUS], 'IN')
+    // And only query for job items that are not yet finished.
+    ->condition('tji.state', JobItem::STATE_ACCEPTED, '<>')
+    ->condition('tji.plugin', $plugin)
+    ->condition('tji.item_type', $item_type)
+    ->condition('tji.item_id', $item_id)
+    ->fields('tji', array('tjiid'))
+    ->fields('tj', array('target_language'))
+    ->orderBy('tji.changed', 'DESC')
+    ->range(1, 1)
+    ->execute();
+  if ($items = $result->fetchAllKeyed()) {
+    $job_items = array();
+    foreach (JobItem::loadMultiple(array_keys($items)) as $key => $item) {
+      $job_items[$items[$key]] = $item;
+    }
+    return $job_items;
+  }
+  return FALSE;
+}
+
+/**
  * Loads all latest job entities that have a job item with the identifiers.
  *
  * @param $plugin
