diff --git a/src/Entity/JobItem.php b/src/Entity/JobItem.php
index 4b70177..05d06c6 100644
--- a/src/Entity/JobItem.php
+++ b/src/Entity/JobItem.php
@@ -31,6 +31,7 @@ use Drupal\Core\Render\Element;
  *     "access" = "Drupal\tmgmt\Entity\Controller\JobItemAccessControlHandler",
  *     "form" = {
  *       "edit" = "Drupal\tmgmt\Form\JobItemForm",
+ *       "abort" = "Drupal\tmgmt\Form\JobItemAbortForm",
  *       "delete" = "Drupal\tmgmt\Form\JobItemDeleteForm"
  *     },
  *     "list_builder" = "Drupal\tmgmt\Entity\ListBuilder\JobItemListBuilder",
@@ -44,6 +45,7 @@ use Drupal\Core\Render\Element;
  *   },
  *   links = {
  *     "canonical" = "/admin/tmgmt/items/{tmgmt_job_item}",
+ *     "abort-form" = "/admin/tmgmt/items/{tmgmt_job_item}/abort",
  *     "delete-form" = "/admin/tmgmt/items/{tmgmt_job_item}/delete",
  *   }
  * )
@@ -461,7 +463,7 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
     }
     $return = $this->setState(static::STATE_REVIEW, $message, $variables, $type);
     // Auto accept the translation if the translator is configured for it.
-    if ($this->getTranslator()->isAutoAccept()) {
+    if ($this->getTranslator()->isAutoAccept() && !$this->isAborted()) {
       $this->acceptTranslation();
     }
     return $return;
@@ -821,6 +823,19 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
   /**
    * {@inheritdoc}
    */
+  public function abortTranslation() {
+    if (!$this->isActive() || !$this->getTranslatorPlugin()) {
+      return FALSE;
+    }
+    else {
+      $this->setState(JobItemInterface::STATE_ABORTED);
+      return TRUE;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getMessages($conditions = array()) {
     $query = \Drupal::entityQuery('tmgmt_message')
       ->condition('tjiid', $this->id());
diff --git a/src/Entity/ListBuilder/JobItemListBuilder.php b/src/Entity/ListBuilder/JobItemListBuilder.php
index de48ff1..ebeb081 100644
--- a/src/Entity/ListBuilder/JobItemListBuilder.php
+++ b/src/Entity/ListBuilder/JobItemListBuilder.php
@@ -8,6 +8,7 @@ namespace Drupal\tmgmt\Entity\ListBuilder;
 
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityListBuilder;
+use Drupal\Core\Url;
 
 /**
  * Provides the views data for the message entity type.
@@ -32,6 +33,16 @@ class JobItemListBuilder extends EntityListBuilder {
         'title' => t('View'),
       );
     }
+    // Do not display delete on active jobs, display abort.
+    if ($entity->getJob()->isActive() && $entity->isActive() && !$entity->isAborted()) {
+      unset($operations['delete']);
+      $operations['abort'] = array(
+        'url' => $entity->urlInfo('abort-form')->setOption('query', array('destination' => Url::fromRoute('<current>')->getInternalPath())),
+        'title' => t('Abort'),
+        'weight' => 10,
+      );
+    }
     return $operations;
   }
+
 }
diff --git a/src/Entity/ListBuilder/JobListBuilder.php b/src/Entity/ListBuilder/JobListBuilder.php
index f77f68d..1b2cbe5 100644
--- a/src/Entity/ListBuilder/JobListBuilder.php
+++ b/src/Entity/ListBuilder/JobListBuilder.php
@@ -36,7 +36,7 @@ class JobListBuilder extends EntityListBuilder {
       );
     }
     if ($entity->isAbortable() && $entity->access('submit')) {
-      $operations['cancel'] = array(
+      $operations['abort'] = array(
         'url' => $entity->urlInfo('abort-form')->setOption('query', array('destination' => Url::fromRoute('<current>')->getInternalPath())),
         'title' => t('Abort'),
         'weight' => 10,
diff --git a/src/Form/JobItemAbortForm.php b/src/Form/JobItemAbortForm.php
new file mode 100644
index 0000000..afbc33c
--- /dev/null
+++ b/src/Form/JobItemAbortForm.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tmgmt\Form\JobItemAbortForm.
+ */
+
+namespace Drupal\tmgmt\Form;
+
+use Drupal\Core\Entity\ContentEntityConfirmFormBase;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Provides a form for deleting a node.
+ */
+class JobItemAbortForm extends ContentEntityConfirmFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return $this->t('Abort this job item?', array('%title' => $this->entity->label()));
+  }
+
+  public function getDescription() {
+    return $this->t('This is only an internal decision and the translator does not know about it. After the action the job item will be aborted and the only remaining action will be deleting it.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelUrl() {
+    return $this->entity->urlInfo();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    /** @var \Drupal\tmgmt\Entity\JobItem $entity */
+    $entity = $this->entity;
+    if (!$entity->abortTranslation()) {
+      // This is the case when a translator does not support the abort operation.
+      // It would make more sense to not display the button for the action,
+      // however we do not know if the translator is able to abort a job until
+      // we trigger the action.
+      foreach ($entity->getMessagesSince() as $message) {
+        /** @var \Drupal\tmgmt\MessageInterface $message */
+        if ($message->getType() == 'debug') {
+          continue;
+        }
+        if ($text = $message->getMessage()) {
+          // We want to persist also the type therefore we will set the
+          // messages directly and not return them.
+          drupal_set_message($text, $message->getType());
+        }
+      }
+    }
+    $form_state->setRedirectUrl($this->entity->urlInfo());
+  }
+
+}
diff --git a/src/Form/JobItemForm.php b/src/Form/JobItemForm.php
index dc8370f..587407f 100644
--- a/src/Form/JobItemForm.php
+++ b/src/Form/JobItemForm.php
@@ -149,7 +149,7 @@ class JobItemForm extends TmgmtFormBase {
       '#type' => 'submit',
       '#button_type' => 'primary',
       '#value' => t('Save as completed'),
-      '#access' => $item->isNeedsReview(),
+      '#access' => $item->isNeedsReview() && !$item->isAborted(),
       '#validate' => array('::validateForm', '::validateJobItem'),
       '#submit' => array('::submitForm', '::save'),
     );
@@ -186,6 +186,15 @@ class JobItemForm extends TmgmtFormBase {
         ],
       ];
     }
+    $actions['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+      '#access' => $item->isAborted(),
+      '#submit' => array('tmgmt_submit_redirect'),
+      '#redirect' => 'admin/tmgmt/items/' . $item->id() . '/delete',
+      // Don't run validations, so the user can always delete the job item.
+      '#limit_validation_errors' => array(),
+    );
     return $actions;
   }
 
diff --git a/src/JobItemInterface.php b/src/JobItemInterface.php
index 201aba0..f469f74 100644
--- a/src/JobItemInterface.php
+++ b/src/JobItemInterface.php
@@ -161,6 +161,18 @@ interface JobItemInterface extends ContentEntityInterface {
   public function getTranslatorPlugin();
 
   /**
+   * Attempts to abort the translation job item.
+   *
+   * Already accepted job items can not be aborted, submitted job items only if
+   * supported by the translator plugin. Always use this method if you want to
+   * abort a translation job item.
+   *
+   * @return bool
+   *   TRUE if the translation job item was aborted, FALSE otherwise.
+   */
+  public function abortTranslation();
+
+  /**
    * Array of the data to be translated.
    *
    * The structure is similar to the form API in the way that it is a possibly
diff --git a/src/Tests/TMGMTUiTest.php b/src/Tests/TMGMTUiTest.php
index 649d41a..bd91ecd 100644
--- a/src/Tests/TMGMTUiTest.php
+++ b/src/Tests/TMGMTUiTest.php
@@ -742,7 +742,7 @@ class TMGMTUiTest extends EntityTestBase {
   }
 
   /**
-   * Test the deletion of job item.
+   * Test the deletion and abortion of job item.
    *
    * @todo This will in future check that delete is not allowed.
    * @todo There will be some overlap with Aborting items & testAbortJob.
@@ -761,6 +761,43 @@ class TMGMTUiTest extends EntityTestBase {
 
     // Add item to the job.
     $item = $job->addItem('test_source', 'test', 1);
+    $item->setState(JobItem::STATE_ACTIVE);
+
+    // Check that there is no delete link on item review form.
+    $this->drupalGet('admin/tmgmt/items/' . $item->id());
+    $this->assertNoFieldById('edit-delete', NULL, 'There is no delete button.');
+
+    $this->drupalGet('admin/tmgmt/jobs/' . $job->id());
+
+    // Check that there is no delete link.
+    $this->assertNoLink('Delete');
+
+    // Check for abort link.
+    $this->assertLink('Abort');
+
+    $this->clickLink('Abort');
+    $this->assertText(t('Abort this job item?'));
+
+    // Check if cancel button is present or not.
+    $this->assertLink('Cancel');
+
+    // Abort the job item.
+    $this->drupalPostForm(NULL, [], t('Confirm'));
+
+    // Reload job and check its state and state of its item.
+    \Drupal::entityManager()->getStorage('tmgmt_job')->resetCache();
+    $job = Job::load($job->id());
+    $this->assertTrue($job->isActive());
+    $items = $job->getItems();
+    $item = reset($items);
+    $this->assertTrue($item->isAborted());
+
+    // Check for delete button on item review form.
+    $this->drupalGet('admin/tmgmt/items/' . $item->id());
+    $this->assertFieldById('edit-delete', NULL, 'There is delete button.');
+
+    // Check that there is no accept button on item review form.
+    $this->assertNoFieldById('edit-accept', NULL, 'There is no accept button.');
 
     $this->drupalGet('admin/tmgmt/jobs/' . $job->id());
 
diff --git a/tmgmt.routing.yml b/tmgmt.routing.yml
index ee06265..fa8f343 100644
--- a/tmgmt.routing.yml
+++ b/tmgmt.routing.yml
@@ -96,6 +96,13 @@ entity.tmgmt_job_item.delete_form:
   requirements:
     _entity_access: tmgmt_job_item.delete
 
+entity.tmgmt_job_item.abort_form:
+  path: '/admin/tmgmt/items/{tmgmt_job_item}/abort'
+  defaults:
+    _entity_form: tmgmt_job_item.abort
+  requirements:
+    _entity_access: tmgmt_job_item.update
+
 tmgmt.source_overview:
   path: '/admin/tmgmt/sources/{plugin}/{item_type}'
   defaults:
