diff --git a/src/Entity/JobItem.php b/src/Entity/JobItem.php
index 4b70177..cc7a780 100644
--- a/src/Entity/JobItem.php
+++ b/src/Entity/JobItem.php
@@ -31,7 +31,9 @@ use Drupal\Core\Render\Element;
  *     "access" = "Drupal\tmgmt\Entity\Controller\JobItemAccessControlHandler",
  *     "form" = {
  *       "edit" = "Drupal\tmgmt\Form\JobItemForm",
- *       "delete" = "Drupal\tmgmt\Form\JobItemDeleteForm"
+ *       "abort" = "Drupal\tmgmt\Form\JobItemAbortForm",
+ *       "delete" = "Drupal\tmgmt\Form\JobItemDeleteForm",
+ *       "resubmit" = "Drupal\tmgmt\Form\JobItemResubmitForm",
  *     },
  *     "list_builder" = "Drupal\tmgmt\Entity\ListBuilder\JobItemListBuilder",
  *     "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
@@ -44,7 +46,9 @@ 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",
+ *     "resubmit-form" = "/admin/tmgmt/items/{tmgmt_job_item}/resubmit",
  *   }
  * )
  *
@@ -821,6 +825,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..f7f5143 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->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..f366fb6 100644
--- a/src/Form/JobItemForm.php
+++ b/src/Form/JobItemForm.php
@@ -153,6 +153,14 @@ class JobItemForm extends TmgmtFormBase {
       '#validate' => array('::validateForm', '::validateJobItem'),
       '#submit' => array('::submitForm', '::save'),
     );
+    $actions['resubmit'] = array(
+      '#type' => 'submit',
+      '#button_type' => 'primary',
+      '#value' => t('Resubmit'),
+      '#access' => $item->isAborted(),
+      '#redirect' => 'admin/tmgmt/items/' . $item->id() . '/resubmit',
+      '#submit' => array('tmgmt_submit_redirect'),
+    );
     $actions['save'] = array(
       '#type' => 'submit',
       '#value' => t('Save'),
diff --git a/src/Form/JobItemResubmitForm.php b/src/Form/JobItemResubmitForm.php
new file mode 100644
index 0000000..7d41545
--- /dev/null
+++ b/src/Form/JobItemResubmitForm.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tmgmt\Form\JobItemResubmitForm.
+ */
+
+namespace Drupal\tmgmt\Form;
+
+use Drupal\Core\Entity\ContentEntityConfirmFormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\tmgmt\JobItemInterface;
+
+/**
+ * Provides a form for deleting a node.
+ */
+class JobItemResubmitForm extends ContentEntityConfirmFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return $this->t('Resubmit job item?', array('%title' => $this->entity->label()));
+  }
+
+  public function getDescription() {
+    return $this->t('This resubmits job item. In case the sources meanwhile changed, the job item will reflect the update.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelUrl() {
+    return $this->entity->urlInfo();
+
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $item = $this->entity;
+    $item->resetData();
+    $item->setState(JobItemInterface::STATE_ACTIVE);
+    drupal_set_message(t('The aborted job item has been resubmitted.'));
+    $form_state->setRedirectUrl($item->urlInfo());
+  }
+
+}
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/tmgmt.routing.yml b/tmgmt.routing.yml
index cf6512b..3cc4b33 100644
--- a/tmgmt.routing.yml
+++ b/tmgmt.routing.yml
@@ -96,6 +96,20 @@ entity.tmgmt_job_item.delete_form:
   requirements:
     _entity_access: tmgmt_job_item.delete
 
+entity.tmgmt_job_item.resubmit_form:
+  path: '/admin/tmgmt/items/{tmgmt_job_item}/resubmit'
+  defaults:
+    _entity_form: tmgmt_job_item.resubmit
+  requirements:
+    _entity_access: tmgmt_job_item.update
+
+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:
