diff --git a/src/Entity/JobItem.php b/src/Entity/JobItem.php
index 4b70177..4317d4a 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,16 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
   /**
    * {@inheritdoc}
    */
+  public function abortTranslation() {
+    if (!$this->isActive() || !$this->getTranslatorPlugin()) {
+      throw new TMGMTException('Cannot abort job item.');
+    }
+    return $this->setState(JobItemInterface::STATE_ABORTED);
+  }
+
+  /**
+   * {@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..ddbf3b3 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,20 @@ class JobItemListBuilder extends EntityListBuilder {
         'title' => t('View'),
       );
     }
+    // Do not display delete on active job items, display abort.
+    if ($entity->getJob()->isActive() && $entity->isActive()) {
+      unset($operations['delete']);
+      $operations['abort'] = array(
+        'url' => $entity->urlInfo('abort-form')->setOption('query', array('destination' => Url::fromRoute('<current>')->getInternalPath())),
+        'title' => t('Abort'),
+        'weight' => 10,
+      );
+    }
+    // Do not display delete on aborted job items also.
+    if ($entity->isAborted()) {
+      unset($operations['delete']);
+    }
     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..6217389
--- /dev/null
+++ b/src/Form/JobItemAbortForm.php
@@ -0,0 +1,61 @@
+<?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()));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  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.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelUrl() {
+    return $this->entity->toUrl();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    /** @var \Drupal\tmgmt\Entity\JobItem $entity */
+    $entity = $this->entity;
+    if (!$entity->abortTranslation()) {
+      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->toUrl());
+  }
+
+}
diff --git a/src/JobItemInterface.php b/src/JobItemInterface.php
index 201aba0..4cf380e 100644
--- a/src/JobItemInterface.php
+++ b/src/JobItemInterface.php
@@ -161,6 +161,20 @@ interface JobItemInterface extends ContentEntityInterface {
   public function getTranslatorPlugin();
 
   /**
+   * Attempts to abort the translation job item.
+   *
+   * Already accepted job items can not be aborted. Always use this method if
+   * you want to abort a translation job item.
+   *
+   * @return int
+   *   The updated state of the job item if it could be set.
+   *
+   * @throws \Drupal\tmgmt\TMGMTException
+   *   If fails to abort the job item.
+   */
+  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 96f52d0..01aff91 100644
--- a/src/Tests/TMGMTUiTest.php
+++ b/src/Tests/TMGMTUiTest.php
@@ -753,7 +753,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.
@@ -772,21 +772,48 @@ 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 for delete link.
-    $this->assertLink('Delete');
+    // Check that there is no delete link.
+    $this->assertNoLink('Delete');
+
+    // Check for abort link.
+    $this->assertLink('Abort');
 
-    $this->clickLink('Delete');
-    $this->assertText(t('Are you sure you want to delete the translation job item @label?', ['@label' => $item->getSourceLabel()]));
+    $this->clickLink('Abort');
+    $this->assertText(t('Abort this job item?'));
 
     // Check if cancel button is present or not.
     $this->assertLink('Cancel');
 
-    // Delete the job item.
-    $this->drupalPostForm(NULL, [], t('Delete'));
-    $this->assertText(t('The translation job item @label has been deleted', ['@label' => $item->getSourceLabel()]));
+    // 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 that there is no delete button on item review form.
+    $this->drupalGet('admin/tmgmt/items/' . $item->id());
+    $this->assertNoFieldById('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());
+
+    // Check that there is no delete link on job overview.
+    $this->assertNoLink('Delete');
   }
 
   /**
diff --git a/tmgmt.module b/tmgmt.module
index 540f3fe..ab93921 100644
--- a/tmgmt.module
+++ b/tmgmt.module
@@ -686,11 +686,11 @@ function tmgmt_job_request_translation(JobInterface $job) {
 /**
  * Print all messages that occurred since our request to the screen.
  *
- * @param $job
+ * @param \Drupal\tmgmt\JobInterface $job
  *    The translation job for which the message should be written.
  *
- * @return
- *   FALSE if there are message with severity error, TRUE otherwise.
+ * @return bool
+ *    FALSE if there are message with severity error, TRUE otherwise.
  */
 function tmgmt_write_request_messages(JobInterface $job) {
   $errors = FALSE;
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:
