diff --git a/src/Controller/LingotekConfigTranslationController.php b/src/Controller/LingotekConfigTranslationController.php
index 82f508cd..ec6bbec9 100644
--- a/src/Controller/LingotekConfigTranslationController.php
+++ b/src/Controller/LingotekConfigTranslationController.php
@@ -416,6 +416,17 @@ class LingotekConfigTranslationController extends ConfigTranslationController {
           $this->messenger()->addStatus($this->t('Translation to %locale requested successfully', ['%locale' => $locale]));
         }
       }
+      catch (LingotekDocumentArchivedException $exception) {
+        $this->messenger()->addError($this->t('Document %label has been archived. Please upload again.',
+          ['%label' => $definition['title']]));
+      }
+      catch (LingotekDocumentLockedException $exception) {
+        $this->messenger()->addError($this->t('Document %label has a new version. The document id has been updated for all future interactions. Please try again.',
+          ['%label' => $definition['title']]));
+      }
+      catch (LingotekPaymentRequiredException $exception) {
+        $this->messenger()->addError($this->t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+      }
       catch (LingotekApiException $e) {
         $this->messenger()->addError($this->t('%label @locale translation request failed. Please try again.',
           ['%label' => $definition['title'], '@locale' => $locale]));
@@ -433,6 +444,18 @@ class LingotekConfigTranslationController extends ConfigTranslationController {
         $this->messenger()->addStatus($this->t('Translation to %locale requested successfully', ['%locale' => $locale]));
       }
     }
+    catch (LingotekDocumentArchivedException $exception) {
+      $this->messenger()->addError($this->t('Document @entity_type %title has been archived. Please upload again.', [
+        '@entity_type' => $entity->getEntityTypeId(),
+        '%title' => $entity->label(),
+      ]));
+    }
+    catch (LingotekDocumentLockedException $exception) {
+      $this->messenger()->addError($this->t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+    }
+    catch (LingotekPaymentRequiredException $exception) {
+      $this->messenger()->addError($this->t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+    }
     catch (LingotekApiException $e) {
       $this->messenger()->addError($this->t('%label @locale translation request failed. Please try again.',
         ['%label' => $entity->label(), '@locale' => $locale]));
diff --git a/src/Controller/LingotekEntityController.php b/src/Controller/LingotekEntityController.php
index 3e843af3..6678314c 100644
--- a/src/Controller/LingotekEntityController.php
+++ b/src/Controller/LingotekEntityController.php
@@ -82,6 +82,18 @@ class LingotekEntityController extends LingotekControllerBase {
         $this->messenger()->addWarning(t("There was a problem adding '@locale' as a translation target for @entity_type %title.", ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label(), '@locale' => $locale]));
       }
     }
+    catch (LingotekDocumentArchivedException $exception) {
+      $this->messenger()->addError(t('Document @entity_type %title has been archived. Please upload again.', [
+        '@entity_type' => $entity->getEntityTypeId(),
+        '%title' => $entity->label(),
+      ]));
+    }
+    catch (LingotekDocumentLockedException $exception) {
+      $this->messenger()->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+    }
+    catch (LingotekPaymentRequiredException $exception) {
+      $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+    }
     catch (LingotekApiException $exception) {
       $this->messenger()->addError(t('The translation request for @entity_type failed. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]), 'error');
     }
diff --git a/src/Form/LingotekConfigManagementForm.php b/src/Form/LingotekConfigManagementForm.php
index 22317646..11d4d35c 100644
--- a/src/Form/LingotekConfigManagementForm.php
+++ b/src/Form/LingotekConfigManagementForm.php
@@ -930,15 +930,41 @@ class LingotekConfigManagementForm extends FormBase {
         try {
           $result = $this->translationService->requestTranslations($entity);
         }
+        catch (LingotekPaymentRequiredException $exception) {
+          $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+        }
+        catch (LingotekDocumentArchivedException $exception) {
+          $this->messenger()->addError(t('Document @entity_type %title has been archived. Please upload again.', [
+            '@entity_type' => $entity->getEntityTypeId(),
+            '%title' => $entity->label(),
+          ]));
+        }
+        catch (LingotekDocumentLockedException $exception) {
+          $this->messenger()->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+        }
         catch (LingotekApiException $e) {
-          $this->messenger()->addError($this->t('%label translations request failed. Please try again.',
-            ['%label' => $entity->label()]));
+          $this->messenger()->addError($this->t('Document @entity_type %title translations request failed. Please try again.',[
+            '@entity_type' => $entity->getEntityTypeId(),
+            '%title' => $entity->label(),
+          ]));
         }
       }
       else {
         try {
           $result = $this->translationService->requestConfigTranslations($mapper->getPluginId());
         }
+        catch (LingotekPaymentRequiredException $exception) {
+          $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+        }
+        catch (LingotekDocumentArchivedException $exception) {
+          $this->messenger()->addError(t('Document %label has been archived. Please upload again.',
+            ['%label' => $mapper->getTitle()]));
+
+        }
+        catch (LingotekDocumentLockedException $exception) {
+          $this->messenger()->addError(t('Document %label has a new version. The document id has been updated for all future interactions. Please try again.',
+            ['%label' => $mapper->getTitle()]));
+        }
         catch (LingotekApiException $e) {
           $this->messenger()->addError($this->t('%label translations request failed. Please try again.',
             ['%label' => $mapper->getTitle()]));
@@ -1060,18 +1086,47 @@ class LingotekConfigManagementForm extends FormBase {
         try {
           $this->translationService->addTarget($entity, $locale);
         }
+        catch (LingotekPaymentRequiredException $exception) {
+          $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+        }
+        catch (LingotekDocumentArchivedException $exception) {
+          $this->messenger()->addError(t('Document @entity_type %title has been archived. Please upload again.', [
+            '@entity_type' => $entity->getEntityTypeId(),
+            '%title' => $entity->label(),
+          ]));
+        }
+        catch (LingotekDocumentLockedException $exception) {
+          $this->messenger()->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+        }
         catch (LingotekApiException $e) {
-          $this->messenger()->addError($this->t('%label @locale translation request failed. Please try again.',
-            ['%label' => $entity->label(), '@locale' => $locale]));
+          $this->messenger()->addError($this->t('Document @entity_type %title @locale translation request failed. Please try again.',[
+            '@entity_type' => $entity->getEntityTypeId(),
+            '%title' => $entity->label(),
+            '@locale' => $locale,
+          ]));
         }
       }
       else {
         try {
           $this->translationService->addConfigTarget($mapper->getPluginId(), $locale);
         }
+        catch (LingotekPaymentRequiredException $exception) {
+          $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+        }
+        catch (LingotekDocumentArchivedException $exception) {
+          $this->messenger()->addError(t('Document %label has been archived. Please upload again.',
+            ['%label' => $mapper->getTitle()]));
+        }
+        catch (LingotekDocumentLockedException $exception) {
+          $this->messenger()->addError(t('Document %label has a new version. The document id has been updated for all future interactions. Please try again.',
+            ['%label' => $mapper->getTitle()]));
+        }
         catch (LingotekApiException $e) {
-          $this->messenger()->addError($this->t('%label @locale translation request failed. Please try again.',
-            ['%label' => $mapper->getTitle(), '@locale' => $locale]));
+          $this->messenger()
+            ->addError($this->t('Document %label @locale translation request failed. Please try again.', [
+              '%label' => $mapper->getTitle(),
+              '@locale' => $locale,
+            ]));
         }
       }
     }
diff --git a/src/Form/LingotekManagementFormBase.php b/src/Form/LingotekManagementFormBase.php
index f75be2c0..8dbf03ca 100644
--- a/src/Form/LingotekManagementFormBase.php
+++ b/src/Form/LingotekManagementFormBase.php
@@ -1089,6 +1089,18 @@ abstract class LingotekManagementFormBase extends FormBase {
       try {
         $result = $this->translationService->requestTranslations($entity);
       }
+      catch (LingotekPaymentRequiredException $exception) {
+        $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+      }
+      catch (LingotekDocumentArchivedException $exception) {
+        $this->messenger()->addError(t('Document @entity_type %title has been archived. Please upload again.', [
+          '@entity_type' => $entity->getEntityTypeId(),
+          '%title' => $entity->label(),
+        ]));
+      }
+      catch (LingotekDocumentLockedException $exception) {
+        $this->messenger()->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+      }
       catch (LingotekApiException $exception) {
         $this->messenger()->addError(t('The request for @entity_type %title translation failed. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
       }
@@ -1164,6 +1176,18 @@ abstract class LingotekManagementFormBase extends FormBase {
       try {
         $this->translationService->addTarget($entity, $locale);
       }
+      catch (LingotekPaymentRequiredException $exception) {
+        $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+      }
+      catch (LingotekDocumentArchivedException $exception) {
+        $this->messenger()->addError(t('Document @entity_type %title has been archived. Please upload again.', [
+          '@entity_type' => $entity->getEntityTypeId(),
+          '%title' => $entity->label(),
+        ]));
+      }
+      catch (LingotekDocumentLockedException $exception) {
+        $this->messenger()->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+      }
       catch (LingotekApiException $exception) {
         $this->messenger()->addError(t('The request for @entity_type %title translation failed. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
       }
diff --git a/src/LingotekConfigTranslationService.php b/src/LingotekConfigTranslationService.php
index f3938a34..8fdea4af 100644
--- a/src/LingotekConfigTranslationService.php
+++ b/src/LingotekConfigTranslationService.php
@@ -526,7 +526,25 @@ class LingotekConfigTranslationService implements LingotekConfigTranslationServi
       $source_status = $this->getSourceStatus($entity);
       $current_status = $this->getTargetStatus($entity, $this->languageLocaleMapper->getConfigurableLanguageForLocale($locale)->getId());
       if ($current_status !== Lingotek::STATUS_PENDING && $current_status !== Lingotek::STATUS_CURRENT && $current_status !== Lingotek::STATUS_READY) {
-        if ($this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getConfigEntityProfile($entity))) {
+        try {
+          $result = $this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getConfigEntityProfile($entity));
+        }
+        catch (LingotekDocumentLockedException $exception) {
+          $this->setDocumentId($entity, $exception->getNewDocumentId());
+          throw $exception;
+        }
+        catch (LingotekDocumentArchivedException $exception) {
+          $this->setDocumentId($entity, NULL);
+          $this->deleteMetadata($entity);
+          throw $exception;
+        }
+        catch (LingotekPaymentRequiredException $exception) {
+          throw $exception;
+        }
+        catch (LingotekApiException $exception) {
+          throw $exception;
+        }
+        if ($result) {
           $this->setTargetStatus($entity, $this->languageLocaleMapper->getConfigurableLanguageForLocale($locale)->getId(), Lingotek::STATUS_PENDING);
           // If the status was "Importing", and the target was added
           // successfully, we can ensure that the content is current now.
@@ -567,7 +585,25 @@ class LingotekConfigTranslationService implements LingotekConfigTranslationServi
           $source_status = $this->getSourceStatus($entity);
           $current_status = $this->getTargetStatus($entity, $langcode);
           if ($current_status !== Lingotek::STATUS_PENDING && $current_status !== Lingotek::STATUS_CURRENT && $current_status !== Lingotek::STATUS_EDITED  && $current_status !== Lingotek::STATUS_READY) {
-            if ($this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getConfigEntityProfile($entity))) {
+            try {
+              $result = $this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getConfigEntityProfile($entity));
+            }
+            catch (LingotekDocumentLockedException $exception) {
+              $this->setDocumentId($entity, $exception->getNewDocumentId());
+              throw $exception;
+            }
+            catch (LingotekDocumentArchivedException $exception) {
+              $this->setDocumentId($entity, NULL);
+              $this->deleteMetadata($entity);
+              throw $exception;
+            }
+            catch (LingotekPaymentRequiredException $exception) {
+              throw $exception;
+            }
+            catch (LingotekApiException $exception) {
+              throw $exception;
+            }
+            if ($result) {
               $languages[] = $langcode;
               $this->setTargetStatus($entity, $langcode, Lingotek::STATUS_PENDING);
               // If the status was "Importing", and the target was added
@@ -577,6 +613,9 @@ class LingotekConfigTranslationService implements LingotekConfigTranslationServi
               }
             }
           }
+          else {
+            return FALSE;
+          }
         }
       }
     }
@@ -1111,8 +1150,26 @@ class LingotekConfigTranslationService implements LingotekConfigTranslationServi
     if ($document_id = $this->getConfigDocumentId($mapper)) {
       $source_status = $this->getConfigSourceStatus($mapper);
       $current_status = $this->getConfigTargetStatus($mapper, $locale);
-      if ($current_status !== Lingotek::STATUS_PENDING && $current_status !== Lingotek::STATUS_CURRENT  && $current_status !== Lingotek::STATUS_READY) {
-        if ($this->lingotek->addTarget($document_id, $locale)) {
+      if ($current_status !== Lingotek::STATUS_PENDING && $current_status !== Lingotek::STATUS_CURRENT && $current_status !== Lingotek::STATUS_READY) {
+        try {
+          $result = $this->lingotek->addTarget($document_id, $locale);
+        }
+        catch (LingotekDocumentLockedException $exception) {
+          $this->setConfigDocumentId($mapper, $exception->getNewDocumentId());
+          throw $exception;
+        }
+        catch (LingotekDocumentArchivedException $exception) {
+          $this->setConfigDocumentId($mapper, NULL);
+          $this->deleteConfigMetadata($mapper_id);
+          throw $exception;
+        }
+        catch (LingotekPaymentRequiredException $exception) {
+          throw $exception;
+        }
+        catch (LingotekApiException $exception) {
+          throw $exception;
+        }
+        if ($result) {
           $this->setConfigTargetStatus($mapper, $this->languageLocaleMapper->getConfigurableLanguageForLocale($locale)->getId(), Lingotek::STATUS_PENDING);
           // If the status was "Importing", and the target was added
           // successfully, we can ensure that the content is current now.
@@ -1149,7 +1206,25 @@ class LingotekConfigTranslationService implements LingotekConfigTranslationServi
           $source_status = $this->getConfigSourceStatus($mapper);
           $current_status = $this->getConfigTargetStatus($mapper, $langcode);
           if ($current_status !== Lingotek::STATUS_PENDING && $current_status !== Lingotek::STATUS_CURRENT && $current_status !== Lingotek::STATUS_EDITED  && $current_status !== Lingotek::STATUS_READY) {
-            if ($this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getConfigProfile($mapper->getPluginId()))) {
+            try {
+              $result = $this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getConfigProfile($mapper->getPluginId()));
+            }
+            catch (LingotekDocumentLockedException $exception) {
+              $this->setConfigDocumentId($mapper, $exception->getNewDocumentId());
+              throw $exception;
+            }
+            catch (LingotekDocumentArchivedException $exception) {
+              $this->setConfigDocumentId($mapper, NULL);
+              $this->deleteConfigMetadata($mapper_id);
+              throw $exception;
+            }
+            catch (LingotekPaymentRequiredException $exception) {
+              throw $exception;
+            }
+            catch (LingotekApiException $exception) {
+              throw $exception;
+            }
+            if ($result) {
               $languages[] = $langcode;
               $this->setConfigTargetStatus($mapper, $langcode, Lingotek::STATUS_PENDING);
               // If the status was "Importing", and the target was added
@@ -1159,6 +1234,9 @@ class LingotekConfigTranslationService implements LingotekConfigTranslationServi
               }
             }
           }
+          else {
+            return FALSE;
+          }
         }
       }
     }
diff --git a/src/LingotekConfigTranslationServiceInterface.php b/src/LingotekConfigTranslationServiceInterface.php
index 7ba4f4bb..0bcc203e 100644
--- a/src/LingotekConfigTranslationServiceInterface.php
+++ b/src/LingotekConfigTranslationServiceInterface.php
@@ -238,6 +238,11 @@ interface LingotekConfigTranslationServiceInterface {
    *   The entity which target we want to add.
    * @param string $locale
    *   Lingotek translation language which we want to modify.
+   *
+   * @throws \Drupal\lingotek\Exception\LingotekPaymentRequiredException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentArchivedException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentLockedException
+   * @throws \Drupal\lingotek\Exception\LingotekApiException
    */
   public function addTarget(ConfigEntityInterface &$entity, $locale);
 
@@ -246,6 +251,11 @@ interface LingotekConfigTranslationServiceInterface {
    *
    * @param \Drupal\Core\Config\Entity\ConfigEntityInterface $entity
    *   The entity being requested for translations.
+   *
+   * @throws \Drupal\lingotek\Exception\LingotekPaymentRequiredException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentArchivedException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentLockedException
+   * @throws \Drupal\lingotek\Exception\LingotekApiException
    */
   public function requestTranslations(ConfigEntityInterface &$entity);
 
@@ -490,6 +500,11 @@ interface LingotekConfigTranslationServiceInterface {
    *   The entity which target we want to add.
    * @param string $locale
    *   Lingotek translation language which we want to modify.
+   *
+   * @throws \Drupal\lingotek\Exception\LingotekPaymentRequiredException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentArchivedException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentLockedException
+   * @throws \Drupal\lingotek\Exception\LingotekApiException
    */
   public function addConfigTarget($mapper_id, $locale);
 
@@ -498,6 +513,11 @@ interface LingotekConfigTranslationServiceInterface {
    *
    * @param string $mapper_id
    *   The entity which target we want to add.
+   *
+   * @throws \Drupal\lingotek\Exception\LingotekPaymentRequiredException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentArchivedException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentLockedException
+   * @throws \Drupal\lingotek\Exception\LingotekApiException
    */
   public function requestConfigTranslations($mapper_id);
 
diff --git a/src/LingotekContentTranslationService.php b/src/LingotekContentTranslationService.php
index 6fea7b2b..3e3a6821 100644
--- a/src/LingotekContentTranslationService.php
+++ b/src/LingotekContentTranslationService.php
@@ -731,7 +731,25 @@ class LingotekContentTranslationService implements LingotekContentTranslationSer
       ];
 
       if (in_array($current_status, $pristine_statuses)) {
-        if ($this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getEntityProfile($entity))) {
+        try {
+          $result = $this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getEntityProfile($entity));
+        }
+        catch (LingotekDocumentLockedException $exception) {
+          $this->setDocumentId($entity, $exception->getNewDocumentId());
+          throw $exception;
+        }
+        catch (LingotekDocumentArchivedException $exception) {
+          $this->setDocumentId($entity, NULL);
+          $this->deleteMetadata($entity);
+          throw $exception;
+        }
+        catch (LingotekPaymentRequiredException $exception) {
+          throw $exception;
+        }
+        catch (LingotekApiException $exception) {
+          throw $exception;
+        }
+        if ($result) {
           $this->setTargetStatus($entity, $drupal_language->id(), Lingotek::STATUS_PENDING);
           // If the status was "Importing", and the target was added
           // successfully, we can ensure that the content is current now.
@@ -772,7 +790,25 @@ class LingotekContentTranslationService implements LingotekContentTranslationSer
           $source_status = $this->getSourceStatus($entity);
           $current_status = $this->getTargetStatus($entity, $langcode);
           if ($current_status !== Lingotek::STATUS_PENDING && $current_status !== Lingotek::STATUS_CURRENT && $current_status !== Lingotek::STATUS_EDITED  && $current_status !== Lingotek::STATUS_READY) {
-            if ($this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getEntityProfile($entity))) {
+            try {
+              $result = $this->lingotek->addTarget($document_id, $locale, $this->lingotekConfiguration->getEntityProfile($entity));
+            }
+            catch (LingotekDocumentLockedException $exception) {
+              $this->setDocumentId($entity, $exception->getNewDocumentId());
+              throw $exception;
+            }
+            catch (LingotekDocumentArchivedException $exception) {
+              $this->setDocumentId($entity, NULL);
+              $this->deleteMetadata($entity);
+              throw $exception;
+            }
+            catch (LingotekPaymentRequiredException $exception) {
+              throw $exception;
+            }
+            catch (LingotekApiException $exception) {
+              throw $exception;
+            }
+            if ($result) {
               $languages[] = $langcode;
               $this->setTargetStatus($entity, $langcode, Lingotek::STATUS_PENDING);
               // If the status was "Importing", and the target was added
diff --git a/src/LingotekContentTranslationServiceInterface.php b/src/LingotekContentTranslationServiceInterface.php
index b52511d3..0a580646 100644
--- a/src/LingotekContentTranslationServiceInterface.php
+++ b/src/LingotekContentTranslationServiceInterface.php
@@ -201,6 +201,11 @@ interface LingotekContentTranslationServiceInterface {
    *   The entity which target we want to add.
    * @param string $locale
    *   Lingotek translation language which we want to modify.
+   *
+   * @throws \Drupal\lingotek\Exception\LingotekPaymentRequiredException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentArchivedException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentLockedException
+   * @throws \Drupal\lingotek\Exception\LingotekApiException
    */
   public function addTarget(ContentEntityInterface &$entity, $locale);
 
@@ -209,6 +214,11 @@ interface LingotekContentTranslationServiceInterface {
    *
    * @param \Drupal\Core\Entity\ContentEntityInterface &$entity
    *   The entity being requested for translations.
+   *
+   * @throws \Drupal\lingotek\Exception\LingotekPaymentRequiredException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentArchivedException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentLockedException
+   * @throws \Drupal\lingotek\Exception\LingotekApiException
    */
   public function requestTranslations(ContentEntityInterface &$entity);
 
diff --git a/src/LingotekInterface.php b/src/LingotekInterface.php
index 44436a59..cc8b28fe 100644
--- a/src/LingotekInterface.php
+++ b/src/LingotekInterface.php
@@ -120,6 +120,11 @@ interface LingotekInterface {
    *   The profile being used.
    *
    * @return mixed
+   *
+   * @throws \Drupal\lingotek\Exception\LingotekPaymentRequiredException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentArchivedException
+   * @throws \Drupal\lingotek\Exception\LingotekDocumentLockedException
+   * @throws \Drupal\lingotek\Exception\LingotekApiException
    */
   public function addTarget($doc_id, $locale, LingotekProfileInterface $profile = NULL);
 
diff --git a/src/Plugin/Action/RequestAllTranslationsLingotekAction.php b/src/Plugin/Action/RequestAllTranslationsLingotekAction.php
index ec1b81c4..15919cee 100644
--- a/src/Plugin/Action/RequestAllTranslationsLingotekAction.php
+++ b/src/Plugin/Action/RequestAllTranslationsLingotekAction.php
@@ -3,6 +3,9 @@
 namespace Drupal\lingotek\Plugin\Action;
 
 use Drupal\lingotek\Exception\LingotekApiException;
+use Drupal\lingotek\Exception\LingotekDocumentArchivedException;
+use Drupal\lingotek\Exception\LingotekDocumentLockedException;
+use Drupal\lingotek\Exception\LingotekPaymentRequiredException;
 
 /**
  * Assigns ownership of a node to a user.
@@ -25,6 +28,18 @@ class RequestAllTranslationsLingotekAction extends LingotekContentEntityActionBa
       /** @var \Drupal\node\NodeInterface $entity */
       $result = $this->translationService->requestTranslations($entity);
     }
+    catch (LingotekPaymentRequiredException $exception) {
+      $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+    }
+    catch (LingotekDocumentArchivedException $exception) {
+      $this->messenger()->addError(t('Document @entity_type %title has been archived. Please upload again.', [
+        '@entity_type' => $entity->getEntityTypeId(),
+        '%title' => $entity->label(),
+      ]));
+    }
+    catch (LingotekDocumentLockedException $exception) {
+      $this->messenger()->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+    }
     catch (LingotekApiException $exception) {
       $this->messenger()->addError(t('The request for @entity_type %title translation failed. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
     }
diff --git a/src/Plugin/Action/RequestTranslationLingotekAction.php b/src/Plugin/Action/RequestTranslationLingotekAction.php
index 65321aac..86f316fe 100644
--- a/src/Plugin/Action/RequestTranslationLingotekAction.php
+++ b/src/Plugin/Action/RequestTranslationLingotekAction.php
@@ -3,6 +3,9 @@
 namespace Drupal\lingotek\Plugin\Action;
 
 use Drupal\lingotek\Exception\LingotekApiException;
+use Drupal\lingotek\Exception\LingotekDocumentArchivedException;
+use Drupal\lingotek\Exception\LingotekDocumentLockedException;
+use Drupal\lingotek\Exception\LingotekPaymentRequiredException;
 
 /**
  * Request Lingotek translation of a content entity for one language.
@@ -27,6 +30,18 @@ class RequestTranslationLingotekAction extends LingotekContentEntityConfigurable
       $locale = $this->languageLocaleMapper->getLocaleForLangcode($langcode);
       $result = $this->translationService->addTarget($entity, $locale);
     }
+    catch (LingotekPaymentRequiredException $exception) {
+      $this->messenger()->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
+    }
+    catch (LingotekDocumentArchivedException $exception) {
+      $this->messenger()->addError(t('Document @entity_type %title has been archived. Please upload again.', [
+        '@entity_type' => $entity->getEntityTypeId(),
+        '%title' => $entity->label(),
+      ]));
+    }
+    catch (LingotekDocumentLockedException $exception) {
+      $this->messenger()->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', ['@entity_type' => $entity->getEntityTypeId(), '%title' => $entity->label()]));
+    }
     catch (LingotekApiException $exception) {
       $this->messenger()->addError(t('The request for @entity_type %title translation failed. Please try again.', [
           '@entity_type' => $entity->getEntityTypeId(),
diff --git a/tests/modules/lingotek_test/src/LingotekFake.php b/tests/modules/lingotek_test/src/LingotekFake.php
index bc7924ff..1449ffb5 100644
--- a/tests/modules/lingotek_test/src/LingotekFake.php
+++ b/tests/modules/lingotek_test/src/LingotekFake.php
@@ -301,6 +301,15 @@ class LingotekFake implements LingotekInterface {
     if (\Drupal::state()->get('lingotek.must_error_in_request_translation', FALSE)) {
       throw new LingotekApiException('Error was forced.');
     }
+    if (\Drupal::state()->get('lingotek.must_payment_required_error_in_request_translation', FALSE)) {
+      throw new LingotekPaymentRequiredException('Error was forced.');
+    }
+    if (\Drupal::state()->get('lingotek.must_document_archived_error_in_request_translation', FALSE)) {
+      throw new LingotekDocumentArchivedException($doc_id, 'Error was forced.');
+    }
+    if (\Drupal::state()->get('lingotek.must_document_locked_error_in_request_translation', FALSE)) {
+      throw new LingotekDocumentLockedException($doc_id, 'new-doc-id', 'Error was forced.');
+    }
     $requested_locales = \Drupal::state()->get('lingotek.requested_locales', []);
     $requested_locales[$doc_id][] = $locale;
     \Drupal::state()->set('lingotek.requested_locales', $requested_locales);
diff --git a/tests/src/Functional/LingotekContentTypeBulkTranslationTest.php b/tests/src/Functional/LingotekContentTypeBulkTranslationTest.php
index a1ded9a8..99ebdc5e 100644
--- a/tests/src/Functional/LingotekContentTypeBulkTranslationTest.php
+++ b/tests/src/Functional/LingotekContentTypeBulkTranslationTest.php
@@ -928,6 +928,425 @@ class LingotekContentTypeBulkTranslationTest extends LingotekTestBase {
     $this->assertText('Blogpost uploaded successfully');
   }
 
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node_type Article translations request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document node_type Article has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node_type Article has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Article es_MX translation request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document node_type Article has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node_type Article has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node_type Article es_MX translation request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document node_type Article has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node_type Article has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_type');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_type'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
   /**
    * Tests that all the statuses are set when using the Check Translations action.
    */
@@ -1241,4 +1660,61 @@ class LingotekContentTypeBulkTranslationTest extends LingotekTestBase {
     $this->assertText('Article content type');
   }
 
+  protected function getBulkSelectionKey($langcode, $revision_id, $entity_type_id = 'article') {
+    return 'table[' . $entity_type_id . ']';
+  }
+
+  /**
+   * Asserts there is a link for uploading the content.
+   *
+   * @param int|string $entity_id
+   *   The entity ID. Optional, defaults to 1.
+   * @param string $entity_type_id
+   *   The entity type ID. Optional, defaults to node.
+   * @param string|null $prefix
+   *   Language prefix if any. Optional, defaults to NULL.
+   */
+  protected function assertLingotekUploadLink($entity_id = 'article', $entity_type_id = 'node_type', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/upload/' . $entity_type_id . '/' . $entity_id;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+  protected function assertLingotekCheckSourceStatusLink($document_id = 'article', $entity_type_id = 'node_type', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/check_upload/' . $entity_type_id . '/' . $document_id;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+  protected function assertLingotekRequestTranslationLink($locale, $document_id = 'article', $entity_type_id = 'node_type', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/request/'  . $entity_type_id . '/' . $document_id . '/' . $locale;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+
+  protected function getDestination($entity_type_id = 'node', $prefix = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    return '?destination=' . $basepath . $this->getConfigBulkManagementFormUrl($entity_type_id, $prefix);
+  }
+
+  protected function getConfigBulkManagementFormUrl($entity_type_id = 'node', $prefix = NULL) {
+    return ($prefix === NULL ? '' : '/' . $prefix) . '/admin/lingotek/config/manage';
+  }
+
 }
diff --git a/tests/src/Functional/LingotekFieldBodyBulkTranslationTest.php b/tests/src/Functional/LingotekFieldBodyBulkTranslationTest.php
index 0adc3699..1b639455 100644
--- a/tests/src/Functional/LingotekFieldBodyBulkTranslationTest.php
+++ b/tests/src/Functional/LingotekFieldBodyBulkTranslationTest.php
@@ -1182,4 +1182,480 @@ class LingotekFieldBodyBulkTranslationTest extends LingotekTestBase {
     $this->assertTargetStatus('DE', Lingotek::STATUS_READY);
   }
 
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document field_config Body translations request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document field_config Body has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document field_config Body has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Body es_MX translation request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document field_config Body has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document field_config Body has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document field_config Body es_MX translation request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document field_config Body has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document field_config Body has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm('node_fields');
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node_fields'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  protected function getBulkSelectionKey($langcode, $revision_id, $entity_type_id = 'node.article.body') {
+    return 'table[' . $entity_type_id . ']';
+  }
+
+  /**
+   * Asserts there is a link for uploading the content.
+   *
+   * @param int|string $entity_id
+   *   The entity ID. Optional, defaults to 1.
+   * @param string $entity_type_id
+   *   The entity type ID. Optional, defaults to node.
+   * @param string|null $prefix
+   *   Language prefix if any. Optional, defaults to NULL.
+   */
+  protected function assertLingotekUploadLink($entity_id = 'node.article.body', $entity_type_id = 'field_config', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/upload/' . $entity_type_id . '/' . $entity_id;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+  protected function assertLingotekCheckSourceStatusLink($document_id = 'node.article.body', $entity_type_id = 'field_config', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/check_upload/' . $entity_type_id . '/' . $document_id;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+  protected function assertLingotekRequestTranslationLink($locale, $document_id = 'node.article.body', $entity_type_id = 'field_config', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/request/'  . $entity_type_id . '/' . $document_id . '/' . $locale;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+
+  protected function getDestination($entity_type_id = 'node.article.body', $prefix = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    return '?destination=' . $basepath . $this->getConfigBulkManagementFormUrl($entity_type_id, $prefix);
+  }
+
+  protected function getConfigBulkManagementFormUrl($entity_type_id = 'node.article.body', $prefix = NULL) {
+    return ($prefix === NULL ? '' : '/' . $prefix) . '/admin/lingotek/config/manage';
+  }
+
 }
diff --git a/tests/src/Functional/LingotekNodeBulkTranslationTest.php b/tests/src/Functional/LingotekNodeBulkTranslationTest.php
index 7d343825..6e9f8bd2 100644
--- a/tests/src/Functional/LingotekNodeBulkTranslationTest.php
+++ b/tests/src/Functional/LingotekNodeBulkTranslationTest.php
@@ -1648,6 +1648,126 @@ class LingotekNodeBulkTranslationTest extends LingotekTestBase {
     $this->assertText('The translation request for node failed. Please try again.');
   }
 
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document node Llamas are cool has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node Llamas are cool has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
   /**
    * Tests that we manage errors when using the request translation action.
    */
@@ -1693,6 +1813,138 @@ class LingotekNodeBulkTranslationTest extends LingotekTestBase {
     $this->assertText('The request for node Llamas are cool translation failed. Please try again.');
   }
 
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document node Llamas are cool has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node Llamas are cool has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
   /**
    * Tests that we manage errors when using the request all translations action.
    */
@@ -1738,6 +1990,138 @@ class LingotekNodeBulkTranslationTest extends LingotekTestBase {
     $this->assertText('The request for node Llamas are cool translation failed. Please try again.');
   }
 
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document node Llamas are cool has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document node Llamas are cool has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->goToContentBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
   /**
    * Tests that we manage errors when using the check translation status link.
    */
diff --git a/tests/src/Functional/LingotekNodeTranslationTest.php b/tests/src/Functional/LingotekNodeTranslationTest.php
index 0d911067..b1d903fc 100644
--- a/tests/src/Functional/LingotekNodeTranslationTest.php
+++ b/tests/src/Functional/LingotekNodeTranslationTest.php
@@ -910,6 +910,173 @@ class LingotekNodeTranslationTest extends LingotekTestBase {
     $this->assertEqual(Lingotek::STATUS_ERROR, $source_status, 'The node has been marked as error.');
   }
 
+  /**
+   * Test that we handle errors in request translation.
+   */
+  public function testRequestTranslationWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Upload the document.
+    $this->clickLink('Upload');
+    $this->checkForMetaRefresh();
+    $this->assertText('Uploaded 1 document to Lingotek.');
+
+    // The document should have been automatically uploaded, so let's check
+    // the upload status.
+    $this->clickLink('Check Upload Status');
+    $this->assertText('The import for node Llamas are cool is complete.');
+
+    // Request translation.
+    $this->clickLink('Request translation');
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertText('The translation request for node failed. Please try again.');
+
+    // The node has been marked with the error status.
+    $this->node = Node::load(1);
+    /** @var \Drupal\lingotek\LingotekContentTranslationServiceInterface $translation_service */
+    $translation_service = \Drupal::service('lingotek.content_translation');
+    $source_status = $translation_service->getSourceStatus($this->node);
+    $this->assertEqual(Lingotek::STATUS_CURRENT, $source_status, 'The node has not been marked as error.');
+  }
+
+  /**
+   * Test that we handle errors in request translation.
+   */
+  public function testRequestTranslationWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Upload the document.
+    $this->clickLink('Upload');
+    $this->checkForMetaRefresh();
+    $this->assertText('Uploaded 1 document to Lingotek.');
+
+    // The document should have been automatically uploaded, so let's check
+    // the upload status.
+    $this->clickLink('Check Upload Status');
+    $this->assertText('The import for node Llamas are cool is complete.');
+
+    // Request translation.
+    $this->clickLink('Request translation');
+
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+
+    $this->node = Node::load(1);
+    /** @var \Drupal\lingotek\LingotekContentTranslationServiceInterface $translation_service */
+    $translation_service = \Drupal::service('lingotek.content_translation');
+    $source_status = $translation_service->getSourceStatus($this->node);
+    $this->assertEqual($source_status, Lingotek::STATUS_CURRENT);
+    $this->assertEqual($translation_service->getTargetStatus($this->node, 'ES'), Lingotek::STATUS_UNTRACKED);
+  }
+
+  /**
+   * Test that we handle errors in request translation.
+   */
+  public function testRequestTranslationWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Upload the document.
+    $this->clickLink('Upload');
+    $this->checkForMetaRefresh();
+    $this->assertText('Uploaded 1 document to Lingotek.');
+
+    // The document should have been automatically uploaded, so let's check
+    // the upload status.
+    $this->clickLink('Check Upload Status');
+    $this->assertText('The import for node Llamas are cool is complete.');
+
+    // Request translation.
+    $this->clickLink('Request translation');
+
+    $this->assertText('Document node Llamas are cool has been archived. Please upload again.');
+
+    $this->node = Node::load(1);
+    /** @var \Drupal\lingotek\LingotekContentTranslationServiceInterface $translation_service */
+    $translation_service = \Drupal::service('lingotek.content_translation');
+    $source_status = $translation_service->getSourceStatus($this->node);
+    $this->assertEqual($source_status, Lingotek::STATUS_UNTRACKED);
+    $this->assertEqual($translation_service->getTargetStatus($this->node, 'ES'), Lingotek::STATUS_UNTRACKED);
+  }
+
+  /**
+   * Test that we handle errors in request translation.
+   */
+  public function testRequestTranslationWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+    $edit['lingotek_translation_profile'] = 'manual';
+    $this->saveAndPublishNodeForm($edit);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Upload the document.
+    $this->clickLink('Upload');
+    $this->checkForMetaRefresh();
+    $this->assertText('Uploaded 1 document to Lingotek.');
+
+    // The document should have been automatically uploaded, so let's check
+    // the upload status.
+    $this->clickLink('Check Upload Status');
+    $this->assertText('The import for node Llamas are cool is complete.');
+
+    // Request translation.
+    $this->clickLink('Request translation');
+
+    $this->assertText('Document node Llamas are cool has a new version. The document id has been updated for all future interactions. Please try again.');
+
+    $this->node = Node::load(1);
+    /** @var \Drupal\lingotek\LingotekContentTranslationServiceInterface $translation_service */
+    $translation_service = \Drupal::service('lingotek.content_translation');
+    $source_status = $translation_service->getSourceStatus($this->node);
+    $this->assertEqual($source_status, Lingotek::STATUS_CURRENT);
+    $this->assertEqual($translation_service->getTargetStatus($this->node, 'ES'), Lingotek::STATUS_UNTRACKED);
+  }
+
+
   /**
    * Tests downloading a translation for an invalid revision.
    */
diff --git a/tests/src/Functional/LingotekSystemSiteBulkTranslationTest.php b/tests/src/Functional/LingotekSystemSiteBulkTranslationTest.php
index 00d39eab..94eb7ccb 100644
--- a/tests/src/Functional/LingotekSystemSiteBulkTranslationTest.php
+++ b/tests/src/Functional/LingotekSystemSiteBulkTranslationTest.php
@@ -1182,4 +1182,496 @@ class LingotekSystemSiteBulkTranslationTest extends LingotekTestBase {
     $this->assertTargetStatus('DE', Lingotek::STATUS_READY);
   }
 
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('System information translations request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // Check the right class is added.
+    // We cannot use this as there are 4 elements by default with that status.
+    // $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $source_error = $this->xpath("//span[contains(@class,'language-icon') and contains(@class,'source-untracked')  and ./a[contains(text(), 'EN')]]");
+    $this->assertEqual(count($source_error), 4, 'The system information has been marked as untracked.');
+
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document System information has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document System information has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request all translations action.
+   */
+  public function testRequestAllTranslationsWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslations('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('System information es_MX translation request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    // Check the right class is added.
+    // We cannot use this as there are 4 elements by default with that status.
+    // $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $source_error = $this->xpath("//span[contains(@class,'language-icon') and contains(@class,'source-untracked')  and ./a[contains(text(), 'EN')]]");
+    $this->assertEqual(count($source_error), 4, 'The system information has been marked as untracked.');
+
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document System information has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation link.
+   */
+  public function testRequestTranslationWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $this->clickLink('ES');
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document System information has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithAnError() {
+    \Drupal::state()->set('lingotek.must_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // We failed at requesting a translation, but we don't know what happened.
+    // So we don't mark as error but keep it on request.
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document System information es_MX translation request failed. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentArchivedError() {
+    \Drupal::state()->set('lingotek.must_document_archived_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    // Check the right class is added.
+    // We cannot use this as there are 4 elements by default with that status.
+    // $this->assertSourceStatus('EN', Lingotek::STATUS_UNTRACKED);
+    $source_error = $this->xpath("//span[contains(@class,'language-icon') and contains(@class,'source-untracked')  and ./a[contains(text(), 'EN')]]");
+    $this->assertEqual(count($source_error), 4, 'The system information has been marked as untracked.');
+
+    $this->assertNoLingotekRequestTranslationLink('es_MX');
+    $this->assertText('Document System information has been archived. Please upload again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithADocumentLockedError() {
+    \Drupal::state()->set('lingotek.must_document_locked_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Document System information has a new version. The document id has been updated for all future interactions. Please try again.');
+  }
+
+  /**
+   * Tests that we manage errors when using the request translation action.
+   */
+  public function testRequestTranslationWithActionWithAPaymentRequiredError() {
+    \Drupal::state()->set('lingotek.must_payment_required_error_in_request_translation', TRUE);
+
+    $this->goToConfigBulkManagementForm();
+
+    // I can init the upload of content.
+    $this->assertLingotekUploadLink();
+    $key = $this->getBulkSelectionKey('en', 1);
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForUpload('config'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // I can check current status.
+    $this->assertLingotekCheckSourceStatusLink();
+    // I can request a translation
+    $this->assertLingotekRequestTranslationLink('es_MX');
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+
+    $edit = [
+      $key => TRUE,
+      $this->getBulkOperationFormName() => $this->getBulkOperationNameForRequestTranslation('es', 'node'),
+    ];
+    $this->drupalPostForm(NULL, $edit, $this->getApplyActionsButtonLabel());
+
+    $this->assertSourceStatus('EN', Lingotek::STATUS_IMPORTING);
+    $this->assertTargetStatus('ES', Lingotek::STATUS_REQUEST);
+    $this->assertText('Community has been disabled. Please contact support@lingotek.com to re-enable your community.');
+  }
+
+  protected function getBulkSelectionKey($langcode, $revision_id, $entity_type_id = 'system.site_information_settings') {
+    return 'table[' . $entity_type_id . ']';
+  }
+
+  /**
+   * Asserts there is a link for uploading the content.
+   *
+   * @param int|string $entity_id
+   *   The entity ID. Optional, defaults to 1.
+   * @param string $entity_type_id
+   *   The entity type ID. Optional, defaults to node.
+   * @param string|null $prefix
+   *   Language prefix if any. Optional, defaults to NULL.
+   */
+  protected function assertLingotekUploadLink($entity_id = 'system.site_information_settings', $entity_type_id = 'system.site_information_settings', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/upload/' . $entity_type_id . '/' . $entity_id;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+  protected function assertLingotekCheckSourceStatusLink($document_id = 'system.site_information_settings', $entity_type_id = 'system.site_information_settings', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/check_upload/' . $entity_type_id . '/' . $document_id;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+  protected function assertLingotekRequestTranslationLink($locale, $document_id = 'system.site_information_settings', $entity_type_id = 'system.site_information_settings', $prefix = NULL, $destination_entity_type_id = NULL, $destination_entity_id = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    $languagePrefix = ($prefix === NULL ? '' : '/' . $prefix);
+    $destination_entity_type_id = $destination_entity_type_id ?: $entity_type_id;
+    $href = $basepath . $languagePrefix . '/admin/lingotek/config/request/'  . $entity_type_id . '/' . $document_id . '/' . $locale;
+    if ($destination = $this->getDestination($destination_entity_type_id, $prefix)) {
+      $href .= $destination;
+    }
+    $this->assertLinkByHref($href);
+  }
+
+
+  protected function getDestination($entity_type_id = 'system.site_information_settings', $prefix = NULL) {
+    $basepath = \Drupal::request()->getBasePath();
+    return '?destination=' . $basepath . $this->getConfigBulkManagementFormUrl($entity_type_id, $prefix);
+  }
+
+  protected function getConfigBulkManagementFormUrl($entity_type_id = 'system.site_information_settings', $prefix = NULL) {
+    return ($prefix === NULL ? '' : '/' . $prefix) . '/admin/lingotek/config/manage';
+  }
+
+
 }
