diff --git a/src/Entity/JobItem.php b/src/Entity/JobItem.php
index 4b70177..904b387 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",
  *   }
  * )
@@ -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..1503ca9 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['cancel'] = 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/Form/JobItemAbortForm.php b/src/Form/JobItemAbortForm.php
new file mode 100644
index 0000000..0722898
--- /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 will send a request to the translator to abort the job item. After the action the job item translation process will be aborted and only remaining action will be resubmitting 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..2c7ff7e 100644
--- a/src/Form/JobItemForm.php
+++ b/src/Form/JobItemForm.php
@@ -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 588e440..e28b758 100644
--- a/src/Tests/TMGMTUiTest.php
+++ b/src/Tests/TMGMTUiTest.php
@@ -1190,7 +1190,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.
@@ -1209,6 +1209,32 @@ class TMGMTUiTest extends EntityTestBase {
 
     // Add item to the job.
     $item = $job->addItem('test_source', 'test', 1);
+    $item->setState(JobItem::STATE_ACTIVE);
+
+    $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());
 
     $this->drupalGet('admin/tmgmt/jobs/' . $job->id());
 
diff --git a/tmgmt.routing.yml b/tmgmt.routing.yml
index cf6512b..545f937 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:
