diff --git a/config/install/lingotek.settings.yml b/config/install/lingotek.settings.yml
index c14832a..ff6023b 100644
--- a/config/install/lingotek.settings.yml
+++ b/config/install/lingotek.settings.yml
@@ -15,6 +15,35 @@ preference:
   contrib:
     paragraphs:
       enable_bulk_management: false
+intelligence:
+  business_unit: null
+  business_division: null
+  campaign_id: null
+  campaign_rating: 0
+  channel: null
+  contact_name: null
+  contact_email: null
+  content_description: null
+  external_style_id: null
+  purchase_order: null
+  region: null
+  use_author: true
+  default_author_email: null
+  use_author_email: true
+  use_contact_email_for_author: false
+  use_business_unit: true
+  use_business_division: true
+  use_campaign_id: true
+  use_campaign_rating: true
+  use_channel: true
+  use_contact_name: true
+  use_contact_email: true
+  use_content_description: true
+  use_external_style_id: true
+  use_purchase_order: true
+  use_region: true
+  use_base_domain: true
+  use_reference_url: true
 account:
   use_production: false
   sandbox_host: 'https://cms.lingotek.com'
diff --git a/config/schema/lingotek.schema.yml b/config/schema/lingotek.schema.yml
index d220916..5c0036a 100644
--- a/config/schema/lingotek.schema.yml
+++ b/config/schema/lingotek.schema.yml
@@ -54,6 +54,94 @@ lingotek.settings:
                 enable_bulk_management:
                   type: boolean
                   label: 'Enable bulk management for paragraphs'
+    intelligence:
+      type: mapping
+      label: 'Lingotek Intelligence settings'
+      mapping:
+        use_author:
+          type: boolean
+          label: 'Permission to Include Author'
+        default_author_email:
+          type: string
+          label: 'Default Author Email'
+        use_author_email:
+          type: boolean
+          label: 'Active'
+        use_contact_email_for_author:
+          type: boolean
+          label: 'Same as Contact Email'
+        business_unit:
+          type: string
+          label: 'Business Unit'
+        use_business_unit:
+          type: boolean
+          label: 'Active'
+        business_division:
+          type: string
+          label: 'Business Division'
+        use_business_division:
+          type: boolean
+          label: 'Active'
+        campaign_id:
+          type: string
+          label: 'Campaign Id'
+        use_campaign_id:
+          type: boolean
+          label: 'Active'
+        campaign_rating:
+          type: integer
+          label: 'Campaign Rating'
+        use_campaign_rating:
+          type: boolean
+          label: 'Active'
+        channel:
+          type: string
+          label: 'Channel'
+        use_channel:
+          type: boolean
+          label: 'Active'
+        contact_name:
+          type: string
+          label: 'Contact Name'
+        use_contact_name:
+          type: boolean
+          label: 'Active'
+        contact_email:
+          type: string
+          label: 'Contact Email'
+        use_contact_email:
+          type: boolean
+          label: 'Active'
+        content_description:
+          type: string
+          label: 'Content Description'
+        use_content_description:
+          type: boolean
+          label: 'Active'
+        external_style_id:
+          type: string
+          label: 'External Style ID'
+        use_external_style_id:
+          type: boolean
+          label: 'Active'
+        purchase_order:
+          type: string
+          label: 'Purchase Order'
+        use_purchase_order:
+          type: boolean
+          label: 'Active'
+        region:
+          type: string
+          label: 'Region'
+        use_region:
+          type: boolean
+          label: 'Active'
+        use_base_domain:
+          type: boolean
+          label: 'Active'
+        use_reference_url:
+          type: boolean
+          label: 'Active'
     account:
       type: mapping
       label: 'Account'
@@ -160,6 +248,96 @@ lingotek.profile.*:
     workflow:
       type: string
       label: 'TM Workflow'
+    intelligence_metadata:
+      type: mapping
+      mapping:
+        override:
+          type: boolean
+          label: 'Flag indicating if there active Intelligence Metadata overrides in this profile'
+        use_author:
+          type: boolean
+          label: 'Permission to Include Author'
+        default_author_email:
+          type: string
+          label: 'Default Author Email'
+        use_author_email:
+          type: boolean
+          label: 'Active'
+        use_contact_email_for_author:
+          type: boolean
+          label: 'Same as Contact Email'
+        business_unit:
+          type: string
+          label: 'Business Unit'
+        use_business_unit:
+          type: boolean
+          label: 'Active'
+        business_division:
+          type: string
+          label: 'Business Division'
+        use_business_division:
+          type: boolean
+          label: 'Active'
+        campaign_id:
+          type: string
+          label: 'Campaign Id'
+        use_campaign_id:
+          type: boolean
+          label: 'Active'
+        campaign_rating:
+          type: integer
+          label: 'Campaign Rating'
+        use_campaign_rating:
+          type: boolean
+          label: 'Active'
+        channel:
+          type: string
+          label: 'Channel'
+        use_channel:
+          type: boolean
+          label: 'Active'
+        contact_name:
+          type: string
+          label: 'Contact Name'
+        use_contact_name:
+          type: boolean
+          label: 'Active'
+        contact_email:
+          type: string
+          label: 'Contact Email'
+        use_contact_email:
+          type: boolean
+          label: 'Active'
+        content_description:
+          type: string
+          label: 'Content Description'
+        use_content_description:
+          type: boolean
+          label: 'Active'
+        external_style_id:
+          type: string
+          label: 'External Style ID'
+        use_external_style_id:
+          type: boolean
+          label: 'Active'
+        purchase_order:
+          type: string
+          label: 'Purchase Order'
+        use_purchase_order:
+          type: boolean
+          label: 'Active'
+        region:
+          type: string
+          label: 'Region'
+        use_region:
+          type: boolean
+          label: 'Active'
+        use_base_domain:
+          type: boolean
+          label: 'Active'
+        use_reference_url:
+          type: boolean
+          label: 'Active'
     language_overrides:
       type: sequence
       label: 'Target language settings overrides'
diff --git a/lingotek.install b/lingotek.install
index e02c689..32d6e46 100644
--- a/lingotek.install
+++ b/lingotek.install
@@ -439,6 +439,45 @@ function lingotek_update_8201() {
   module_set_weight('lingotek', 15);
 }
 
+/**
+ * Set the new default intelligence configuration
+ */
+function lingotek_update_8204() {
+  $config_factory = \Drupal::configFactory();
+  $config = $config_factory->getEditable('lingotek.settings');
+  $config->set('intelligence', [
+    'business_unit' => NULL,
+    'business_division' => NULL,
+    'campaign_id' => NULL,
+    'campaign_rating' => 0,
+    'channel' => NULL,
+    'contact_name' => NULL,
+    'contact_email' => NULL,
+    'content_description' => NULL,
+    'external_style_id' => NULL,
+    'purchase_order' => NULL,
+    'region' => NULL,
+    'use_author' => TRUE,
+    'default_author_email' => NULL,
+    'use_author_email' => TRUE,
+    'use_contact_email_for_author' => FALSE,
+    'use_business_unit' => TRUE,
+    'use_business_division' => TRUE,
+    'use_campaign_id' => TRUE,
+    'use_campaign_rating' => TRUE,
+    'use_channel' => TRUE,
+    'use_contact_name' => TRUE,
+    'use_contact_email' => TRUE,
+    'use_content_description' => TRUE,
+    'use_external_style_id' => TRUE,
+    'use_purchase_order' => TRUE,
+    'use_region' => TRUE,
+    'use_base_domain' => TRUE,
+    'use_reference_url' => TRUE
+  ]);
+  $config->save();
+}
+
 function lingotek_legacy_get_translation_status($field) {
   $status = [];
   foreach ($field->getIterator() as $delta => $value) {
diff --git a/lingotek.services.yml b/lingotek.services.yml
index c4f48b7..3a1148f 100644
--- a/lingotek.services.yml
+++ b/lingotek.services.yml
@@ -19,6 +19,12 @@ services:
     arguments: ['@entity_type.bundle.info']
   lingotek.configuration:
     class: Drupal\lingotek\LingotekConfigurationService
+  lingotek.intelligence_config:
+    class: Drupal\lingotek\LingotekIntelligenceServiceConfig
+    arguments: ['@config.factory']
+  lingotek.intelligence:
+    class: Drupal\lingotek\LingotekIntelligenceService
+    arguments: ['@lingotek.intelligence_config']
   lingotek.moderation_factory:
     class: Drupal\lingotek\Moderation\LingotekModerationFactory
     arguments: ['@config.factory']
diff --git a/src/Controller/LingotekSettingsController.php b/src/Controller/LingotekSettingsController.php
index 9715ba1..4980219 100644
--- a/src/Controller/LingotekSettingsController.php
+++ b/src/Controller/LingotekSettingsController.php
@@ -5,6 +5,7 @@ namespace Drupal\lingotek\Controller;
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Form\FormState;
 use Drupal\Core\Url;
+use Drupal\lingotek\Form\LingotekIntelligenceMetadataForm;
 use Drupal\lingotek\Form\LingotekSettingsTabIntegrationsForm;
 
 class LingotekSettingsController extends LingotekControllerBase {
@@ -14,15 +15,16 @@ class LingotekSettingsController extends LingotekControllerBase {
       return $redirect;
     }
 
-    $settings_tab = array (
+    $settings_tab = [
       $this->getLingotekForm('LingotekSettingsTabAccountForm'),
       $this->getLingotekForm('LingotekSettingsTabContentForm'),
       $this->getLingotekForm('LingotekSettingsTabConfigurationForm'),
       $this->getProfileListForm(),
+      $this->getIntelligenceMetadataForm(),
       $this->getLingotekForm('LingotekSettingsTabPreferencesForm'),
       $this->getIntegrationsSettingsForm(),
       $this->getLingotekForm('LingotekSettingsTabUtilitiesForm'),
-    );
+    ];
 
     return $settings_tab;
   }
@@ -92,4 +94,9 @@ class LingotekSettingsController extends LingotekControllerBase {
     return $profiles_modal;
   }
 
+  public function getIntelligenceMetadataForm() {
+    $form = $this->formBuilder->getForm(LingotekIntelligenceMetadataForm::class, $this->request, \Drupal::service('lingotek.intelligence_config'));
+    return $form;
+  }
+
 }
diff --git a/src/Entity/LingotekProfile.php b/src/Entity/LingotekProfile.php
index 18de3ff..0dc0f26 100644
--- a/src/Entity/LingotekProfile.php
+++ b/src/Entity/LingotekProfile.php
@@ -8,6 +8,7 @@
 namespace Drupal\lingotek\Entity;
 
 use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\lingotek\LingotekIntelligenceMetadataInterface;
 use Drupal\lingotek\LingotekProfileInterface;
 
 /**
@@ -41,6 +42,7 @@ use Drupal\lingotek\LingotekProfileInterface;
  *     "vault",
  *     "project",
  *     "workflow",
+ *     "intelligence_metadata",
  *     "language_overrides",
  *   },
  *   links = {
@@ -50,7 +52,7 @@ use Drupal\lingotek\LingotekProfileInterface;
  *   },
  * )
  */
-class LingotekProfile extends ConfigEntityBase implements LingotekProfileInterface {
+class LingotekProfile extends ConfigEntityBase implements LingotekProfileInterface, LingotekIntelligenceMetadataInterface {
 
   /**
    * The profile ID (machine name).
@@ -123,6 +125,464 @@ class LingotekProfile extends ConfigEntityBase implements LingotekProfileInterfa
   protected $language_overrides = [];
 
   /**
+   * Metadata for content with this translation profile
+   *
+   * @var array
+   */
+  protected $intelligence_metadata = [
+    'override' => FALSE,
+    'business_unit' => '',
+    'business_division' => '',
+    'campaign_id' => '',
+    'campaign_rating' => 0,
+    'channel' => '',
+    'contact_name' => '',
+    'contact_email' => '',
+    'content_description' => '',
+    'external_style_id' => '',
+    'purchase_order' => '',
+    'region' => '',
+    'use_author' => TRUE,
+    'default_author_email' => '',
+    'use_author_email' => TRUE,
+    'use_contact_email_for_author' => FALSE,
+    'use_business_unit' => TRUE,
+    'use_business_division' => TRUE,
+    'use_campaign_id' => TRUE,
+    'use_campaign_rating' => TRUE,
+    'use_channel' => TRUE,
+    'use_contact_name' => TRUE,
+    'use_contact_email' => TRUE,
+    'use_content_description' => TRUE,
+    'use_external_style_id' => TRUE,
+    'use_purchase_order' => TRUE,
+    'use_region' => TRUE,
+    'use_base_domain' => TRUE,
+    'use_reference_url' => TRUE,
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessUnit() {
+    return $this->intelligence_metadata['business_unit'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessUnit($business_unit) {
+    $this->intelligence_metadata['business_unit'] = $business_unit;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessDivision() {
+    return $this->intelligence_metadata['business_division'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessDivision($business_division) {
+    $this->intelligence_metadata['business_division'] = $business_division;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignId() {
+    return $this->intelligence_metadata['campaign_id'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignId($campaign_id) {
+    $this->intelligence_metadata['campaign_id'] = $campaign_id;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignRating() {
+    return $this->intelligence_metadata['campaign_rating'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignRating($campaign_rating) {
+    $this->intelligence_metadata['campaign_rating'] = $campaign_rating;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChannel() {
+    return $this->intelligence_metadata['channel'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setChannel($channel) {
+    $this->intelligence_metadata['channel'] = $channel;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactName() {
+    return $this->intelligence_metadata['contact_name'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactName($contact_name) {
+    $this->intelligence_metadata['contact_name'] = $contact_name;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmail() {
+    return $this->intelligence_metadata['contact_email'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmail($contact_email) {
+    $this->intelligence_metadata['contact_email'] = $contact_email;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContentDescription() {
+    return $this->intelligence_metadata['content_description'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContentDescription($content_description) {
+    $this->intelligence_metadata['content_description'] = $content_description;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPurchaseOrder() {
+    return $this->intelligence_metadata['purchase_order'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setPurchaseOrder($purchase_order) {
+    $this->intelligence_metadata['purchase_order'] = $purchase_order;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getExternalStyleId() {
+    return $this->intelligence_metadata['external_style_id'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setExternalStyleId($external_style_id) {
+    $this->intelligence_metadata['external_style_id'] = $external_style_id;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegion() {
+    return $this->intelligence_metadata['region'];
+
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRegion($region) {
+    $this->intelligence_metadata['region'] = $region;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAuthorPermission() {
+    return $this->intelligence_metadata['use_author'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setAuthorPermission($use_author) {
+    $this->intelligence_metadata['use_author'] = $use_author;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultAuthorEmail() {
+    return $this->intelligence_metadata['default_author_email'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDefaultAuthorEmail($default_author_email) {
+    $this->intelligence_metadata['default_author_email'] = $default_author_email;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAuthorEmailPermission() {
+    return $this->intelligence_metadata['use_author_email'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setAuthorEmailPermission($use_author_email) {
+    $this->intelligence_metadata['use_author_email'] = $use_author_email;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmailForAuthorPermission() {
+    return $this->intelligence_metadata['use_contact_email_for_author'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmailForAuthorPermission($use_contact_email_for_author) {
+    $this->intelligence_metadata['use_contact_email_for_author'] = $use_contact_email_for_author;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessUnitPermission() {
+    return $this->intelligence_metadata['use_business_unit'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessUnitPermission($use_business_unit) {
+    $this->intelligence_metadata['use_business_unit'] = $use_business_unit;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessDivisionPermission() {
+    return $this->intelligence_metadata['use_business_division'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessDivisionPermission($use_business_division) {
+    $this->intelligence_metadata['use_business_division'] = $use_business_division;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignIdPermission() {
+    return $this->intelligence_metadata['use_campaign_id'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignIdPermission($use_campaign_id) {
+    $this->intelligence_metadata['use_campaign_id'] = $use_campaign_id;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignRatingPermission() {
+    return $this->intelligence_metadata['use_campaign_rating'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignRatingPermission($use_campaign_rating) {
+    $this->intelligence_metadata['use_campaign_rating'] = $use_campaign_rating;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChannelPermission() {
+    return $this->intelligence_metadata['use_channel'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setChannelPermission($use_channel) {
+    $this->intelligence_metadata['use_channel'] = $use_channel;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactNamePermission() {
+    return $this->intelligence_metadata['use_contact_name'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactNamePermission($use_contact_name) {
+    $this->intelligence_metadata['use_contact_name'] = $use_contact_name;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmailPermission() {
+    return $this->intelligence_metadata['use_contact_email'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmailPermission($use_contact_email) {
+    $this->intelligence_metadata['use_contact_email'] = $use_contact_email;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContentDescriptionPermission() {
+    return $this->intelligence_metadata['use_content_description'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContentDescriptionPermission($use_content_description) {
+    $this->intelligence_metadata['use_content_description'] = $use_content_description;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getExternalStyleIdPermission() {
+    return $this->intelligence_metadata['use_external_style_id'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setExternalStyleIdPermission($use_external_style_id) {
+    $this->intelligence_metadata['use_external_style_id'] = $use_external_style_id;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPurchaseOrderPermission() {
+    return $this->intelligence_metadata['use_purchase_order'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setPurchaseOrderPermission($use_purchase_order) {
+    $this->intelligence_metadata['use_purchase_order'] = $use_purchase_order;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegionPermission() {
+    return $this->intelligence_metadata['use_region'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRegionPermission($use_region) {
+    $this->intelligence_metadata['use_region'] = $use_region;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBaseDomainPermission() {
+    return $this->intelligence_metadata['use_base_domain'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBaseDomainPermission($use_base_domain) {
+    $this->intelligence_metadata['use_base_domain'] = $use_base_domain;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getReferenceUrlPermission() {
+    return $this->intelligence_metadata['use_reference_url'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setReferenceUrlPermission($use_reference_url) {
+    $this->intelligence_metadata['use_reference_url'] = $use_reference_url;
+    return $this;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function isLocked() {
@@ -249,4 +709,19 @@ class LingotekProfile extends ConfigEntityBase implements LingotekProfileInterfa
     return isset($this->language_overrides[$langcode]) && $this->language_overrides[$langcode]['overrides'] === 'custom';
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function hasIntelligenceMetadataOverrides() {
+    return isset($this->intelligence_metadata['override']) && $this->intelligence_metadata['override'] === TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setIntelligenceMetadataOverrides($value) {
+    $this->intelligence_metadata['override'] = $value;
+    return $this;
+  }
+
 }
diff --git a/src/Form/LingotekIntelligenceMetadataForm.php b/src/Form/LingotekIntelligenceMetadataForm.php
new file mode 100644
index 0000000..e8e139b
--- /dev/null
+++ b/src/Form/LingotekIntelligenceMetadataForm.php
@@ -0,0 +1,367 @@
+<?php
+
+namespace Drupal\lingotek\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\lingotek\LingotekIntelligenceServiceConfig;
+
+/**
+ * Helper class for creating the form for setting up the intelligence metadata.
+ *
+ * @package Drupal\lingotek\Form
+ */
+class LingotekIntelligenceMetadataForm extends FormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'lingotek.intelligence_metadata_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $metadata = $this->getIntelligenceMetadata($form_state);
+
+    $form['intelligence_metadata'] = [
+      '#type' => 'details',
+      '#title' => $this->t('Lingotek Intelligence Metadata'),
+      '#tree' => TRUE,
+    ];
+
+    $form['intelligence_metadata']['use_author'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Content\'s Author name and email to be tracked',
+      '#default_value' => $metadata->getAuthorPermission(),
+    ];
+
+    $form['intelligence_metadata']['use_author_email'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Content Author\'s email to be tracked',
+      '#default_value' => $metadata->getAuthorEmailPermission(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_author]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_contact_email_for_author'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'checkbox',
+      '#title' => 'Use the Contact Email as the Author Default Email',
+      '#default_value' => $metadata->getContactEmailForAuthorPermission(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_author]"]' => ['checked' => TRUE],
+          ':input[name="intelligence_metadata[use_contact_email]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['default_author_email'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Default Author Email'),
+      '#description' => $this->t('Only used if the Author does not have an email address'),
+      '#default_value' => $metadata->getDefaultAuthorEmail(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_author]"]' => ['checked' => TRUE],
+          ':input[name="intelligence_metadata[use_author_email]"]' => ['checked' => TRUE],
+          ':input[name="intelligence_metadata[use_contact_email_for_author]"]' => ['checked' => FALSE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_business_unit'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Business Unit to be tracked',
+      '#default_value' => $metadata->getBusinessUnitPermission(),
+    ];
+
+    $form['intelligence_metadata']['business_unit'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Business Unit'),
+      '#default_value' => $metadata->getBusinessUnit(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_business_unit]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_business_division'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Business Division to be tracked',
+      '#default_value' => $metadata->getBusinessDivisionPermission(),
+    ];
+
+    $form['intelligence_metadata']['business_division'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Business Division'),
+      '#default_value' => $metadata->getBusinessDivision(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_business_division]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_campaign_id'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Campaign ID to be tracked',
+      '#default_value' => $metadata->getCampaignIdPermission(),
+    ];
+
+    $form['intelligence_metadata']['campaign_id'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Campaign Id'),
+      '#default_value' => $metadata->getCampaignId(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_campaign_id]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_campaign_rating'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Campaign Rating to be tracked',
+      '#default_value' => $metadata->getCampaignRatingPermission(),
+    ];
+
+    $form['intelligence_metadata']['campaign_rating'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'number',
+      '#title' => $this->t('Campaign Rating'),
+      '#default_value' => $metadata->getCampaignRating(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_campaign_rating]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_channel'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Channel to be tracked',
+      '#default_value' => $metadata->getChannelPermission(),
+    ];
+
+    $form['intelligence_metadata']['channel'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Channel'),
+      '#default_value' => $metadata->getChannel(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_channel]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_contact_name'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Contact Name to be tracked',
+      '#default_value' => $metadata->getContactNamePermission(),
+    ];
+
+    $form['intelligence_metadata']['contact_name'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Contact Name'),
+      '#default_value' => $metadata->getContactName(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_contact_name]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_contact_email'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Contact Email to be tracked',
+      '#default_value' => $metadata->getContactEmailPermission(),
+    ];
+
+    $form['intelligence_metadata']['contact_email'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Contact Email'),
+      '#default_value' => $metadata->getContactEmail(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_contact_email]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_content_description'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Content Description to be tracked',
+      '#default_value' => $metadata->getContentDescriptionPermission(),
+    ];
+
+    $form['intelligence_metadata']['content_description'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Content Description'),
+      '#default_value' => $metadata->getContentDescription(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_content_description]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_base_domain'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Base Domain to be tracked',
+      '#default_value' => $metadata->getBaseDomainPermission(),
+      '#description' => 'This value will be pulled from the entities location and cannot be edited',
+    ];
+
+    $form['intelligence_metadata']['use_reference_url'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Reference URL to be tracked',
+      '#default_value' => $metadata->getReferenceUrlPermission(),
+      '#description' => 'This value will be pulled from the entities location and cannot be edited',
+    ];
+
+    $form['intelligence_metadata']['use_external_style_id'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the External Style ID to be tracked',
+      '#default_value' => $metadata->getExternalStyleIdPermission(),
+    ];
+
+    $form['intelligence_metadata']['external_style_id'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('External Style Id'),
+      '#default_value' => $metadata->getExternalStyleId(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_external_style_id]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_purchase_order'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Purchase Order to be tracked',
+      '#default_value' => $metadata->getPurchaseOrderPermission(),
+    ];
+
+    $form['intelligence_metadata']['purchase_order'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Purchase Order'),
+      '#default_value' => $metadata->getPurchaseOrder(),
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_purchase_order]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['intelligence_metadata']['use_region'] = [
+      '#type' => 'checkbox',
+      '#title' => 'Enable the Region to be tracked',
+      '#default_value' => $metadata->getRegionPermission(),
+    ];
+
+    $form['intelligence_metadata']['region'] = [
+      '#attributes' => ['class' => ['indented']],
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#title' => $this->t('Region'),
+      '#default_value' => $metadata->getRegion() ?: '',
+      '#states' => [
+        'visible' => [
+          ':input[name="intelligence_metadata[use_region]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+    $form['intelligence_metadata']['actions'] = ['#type' => 'actions'];
+    $form['intelligence_metadata']['actions']['submit'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Save Lingotek Intelligence Metadata'),
+      '#button_type' => 'primary',
+    ];
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $metadata = $this->getIntelligenceMetadata($form_state);
+    $metadata->setAuthorPermission($form_state->getValue(['intelligence_metadata', 'use_author']));
+    $metadata->setAuthorEmailPermission($form_state->getValue(['intelligence_metadata', 'use_author_email']));
+    $metadata->setContactEmailForAuthorPermission($form_state->getValue(['intelligence_metadata', 'use_contact_email_for_author']));
+    $metadata->setDefaultAuthorEmail($form_state->getValue(['intelligence_metadata', 'default_author_email']));
+    $metadata->setBusinessUnitPermission($form_state->getValue(['intelligence_metadata', 'use_business_unit']));
+    $metadata->setBusinessUnit($form_state->getValue(['intelligence_metadata', 'business_unit']));
+    $metadata->setBusinessDivisionPermission($form_state->getValue(['intelligence_metadata', 'use_business_division']));
+    $metadata->setBusinessDivision($form_state->getValue(['intelligence_metadata', 'business_division']));
+    $metadata->setCampaignIdPermission($form_state->getValue(['intelligence_metadata', 'use_campaign_id']));
+    $metadata->setCampaignId($form_state->getValue(['intelligence_metadata', 'campaign_id']));
+    $metadata->setCampaignRatingPermission($form_state->getValue(['intelligence_metadata', 'use_campaign_rating']));
+    $metadata->setCampaignRating($form_state->getValue(['intelligence_metadata', 'campaign_rating']));
+    $metadata->setChannelPermission($form_state->getValue(['intelligence_metadata', 'use_channel']));
+    $metadata->setChannel($form_state->getValue(['intelligence_metadata', 'channel']));
+    $metadata->setContactNamePermission($form_state->getValue(['intelligence_metadata', 'use_contact_name']));
+    $metadata->setContactName($form_state->getValue(['intelligence_metadata', 'contact_name']));
+    $metadata->setContactEmailPermission($form_state->getValue(['intelligence_metadata', 'use_contact_email']));
+    $metadata->setContactEmail($form_state->getValue(['intelligence_metadata', 'contact_email']));
+    $metadata->setContentDescriptionPermission($form_state->getValue(['intelligence_metadata', 'use_content_description']));
+    $metadata->setContentDescription($form_state->getValue(['intelligence_metadata', 'content_description']));
+    $metadata->setBaseDomainPermission($form_state->getValue(['intelligence_metadata', 'use_base_domain']));
+    $metadata->setReferenceUrlPermission($form_state->getValue(['intelligence_metadata', 'use_reference_url']));
+    $metadata->setExternalStyleIdPermission($form_state->getValue(['intelligence_metadata', 'use_external_style_id']));
+    $metadata->setExternalStyleId($form_state->getValue(['intelligence_metadata', 'external_style_id']));
+    $metadata->setPurchaseOrderPermission($form_state->getValue(['intelligence_metadata', 'use_purchase_order']));
+    $metadata->setPurchaseOrder($form_state->getValue(['intelligence_metadata', 'purchase_order']));
+    $metadata->setRegionPermission($form_state->getValue(['intelligence_metadata', 'use_region']));
+    $metadata->setRegion($form_state->getValue(['intelligence_metadata', 'region']));
+
+    // Show this message only if we are saving the general settings. For profiles
+    // it's not needed.
+    if ($metadata instanceof LingotekIntelligenceServiceConfig) {
+      drupal_set_message($this->t('Lingotek Intelligence Metadata saved correctly.'));
+    }
+  }
+
+  /**
+   * Helper method for getting the Lingotek intelligence metadata.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   *
+   * @return LingotekIntelligenceMetadataInterface
+   *   Returns the Lingotek intelligence metadata this form applies to.
+   */
+  protected function getIntelligenceMetadata(FormStateInterface $form_state) {
+    $buildInfo = $form_state->getBuildInfo();
+    return $buildInfo['args'][1];
+  }
+
+}
diff --git a/src/Form/LingotekProfileFormBase.php b/src/Form/LingotekProfileFormBase.php
index 37f4362..27a6003 100644
--- a/src/Form/LingotekProfileFormBase.php
+++ b/src/Form/LingotekProfileFormBase.php
@@ -7,6 +7,7 @@
 namespace Drupal\lingotek\Form;
 
 use Drupal\Core\Entity\EntityForm;
+use Drupal\Core\Form\FormState;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\language\Entity\ConfigurableLanguage;
@@ -140,6 +141,30 @@ class LingotekProfileFormBase extends EntityForm {
       '#default_value' => $profile->getWorkflow(),
     );
 
+    // We add the overrides.
+    $form['intelligence_metadata_overrides'] = [
+      '#type' => 'details',
+      '#title' => $this->t('Lingotek Intelligence Metadata overrides'),
+      '#tree' => TRUE,
+    ];
+
+    // We include the Lingotek Intelligence Metadata form and alter it for
+    // adapting it to profiles. We want to make this optional.
+    $subform = \Drupal::formBuilder()->getForm(LingotekIntelligenceMetadataForm::class, $this->getRequest(), $this->getEntity());
+    $form['intelligence_metadata_overrides']['override'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Override general Lingotek Intelligence metadata when using this profile'),
+      '#description' => $this->t('When enabled, general Lingotek Intelligence metadata will be overriden by the options here when usign this profile.'),
+      '#default_value' => $profile->hasIntelligenceMetadataOverrides(),
+    ];
+    $form['intelligence_metadata_overrides']['form'] = $subform['intelligence_metadata'];
+    $form['intelligence_metadata_overrides']['form']['#states'] = [
+      'visible' => [
+        ':input[name="intelligence_metadata_overrides[override]"]' => ['checked' => TRUE],
+      ],
+    ];
+    unset($form['intelligence_metadata_overrides']['form']['actions']);
+
     $form['language_overrides'] = array(
       '#type' => 'details',
       '#title' => $this->t('Target language specific settings'),
@@ -193,4 +218,27 @@ class LingotekProfileFormBase extends EntityForm {
     return $form;
   }
 
-}
\ No newline at end of file
+  /**
+   * {@inheritdoc}
+   */
+  public function save(array $form, FormStateInterface $form_state) {
+    /** @var \Drupal\lingotek\Entity\LingotekProfile $profile */
+    $profile = $this->getEntity();
+    /** @var \Drupal\Core\Form\FormInterface $subform */
+    $form_object = new LingotekIntelligenceMetadataForm();
+    $input = $form_state->getUserInput();
+    $inner_form_state = new FormState();
+    $inner_form_state->addBuildInfo('args', [$this->getRequest(), $profile]);
+    $inner_form_state->setFormObject($form_object);
+    $inner_form_state->setUserInput($form_state->getUserInput());
+    $inner_form_state->setValue('intelligence_metadata', $input['intelligence_metadata']);
+
+    $subform = [];
+    $form_object->submitForm($subform, $inner_form_state);
+
+    $profile->setIntelligenceMetadataOverrides($form_state->getValue(['intelligence_metadata_overrides', 'override']));
+
+    parent::save($form, $form_state);
+  }
+
+}
diff --git a/src/Lingotek.php b/src/Lingotek.php
index a032388..d75441a 100644
--- a/src/Lingotek.php
+++ b/src/Lingotek.php
@@ -160,6 +160,11 @@ class Lingotek implements LingotekInterface {
    * {@inheritdoc}
    */
   public function uploadDocument($title, $content, $locale, $url = NULL, LingotekProfileInterface $profile = NULL) {
+    if (!is_array($content)) {
+      $data = json_decode($content, TRUE);
+      // This is the quickest way if $content is not a valid json object.
+      $content = ($data === NULL) ? $content : $data;
+    }
     // Handle adding site defaults to the upload here, and leave
     // the handling of the upload call itself to the API.
     $defaults = array(
@@ -167,7 +172,9 @@ class Lingotek implements LingotekInterface {
       'project_id' => $this->get('default.project'),
       'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',// 'okf_html@drupal8-subfilter.fprm',
       'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',// 'okf_json@with-html-subfilter.fprm',
+      'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0',
     );
+    $metadata = $this->getIntelligenceMetadata($content);
 
     if ($profile !== NULL && $project = $profile->getProject()) {
       if ($project !== 'default') {
@@ -187,7 +194,9 @@ class Lingotek implements LingotekInterface {
       }
     }
 
-    $args = array_merge(array('content' => $content, 'title' => $title, 'locale_code' => $locale), $defaults);
+    $args = array_merge($metadata, $defaults);
+
+    $args = array_merge(['content' => json_encode($content), 'title' => $title, 'locale_code' => $locale], $args);
     if ($url !== NULL) {
       $args['external_url'] = $url;
     }
@@ -201,12 +210,22 @@ class Lingotek implements LingotekInterface {
    * {@inheritdoc}
    */
   public function updateDocument($doc_id, $content, $url = NULL, $title = NULL) {
+    if (!is_array($content)) {
+      $data = json_decode($content, TRUE);
+      // This is the quickest way if $content is not a valid json object.
+      $content = ($data === NULL) ? $content : $data;
+    }
+
     $args = array(
       'format' => 'JSON',
-      'content' => $content,
+      'content' => json_encode($content),
       'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',// 'okf_html@drupal8-subfilter.fprm',
       'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',// 'okf_json@with-html-subfilter.fprm',
+      'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0',
     );
+    $metadata = $this->getIntelligenceMetadata($content);
+    $args = array_merge($metadata, $args);
+
     if ($url !== NULL) {
       $args['external_url'] = $url;
     }
@@ -222,6 +241,23 @@ class Lingotek implements LingotekInterface {
   }
 
   /**
+   * Pulls the Intelligence Metadata from the Lingotek Metadata and returns it.
+   *
+   * @param array $data
+   *    The structure of a document content.
+   *
+   * @return array
+   */
+  public function getIntelligenceMetadata(&$data) {
+    $metadata = [];
+    if (is_array($data) && isset($data['_lingotek_metadata']['_intelligence'])) {
+      $metadata = $data['_lingotek_metadata']['_intelligence'];
+      unset($data['_lingotek_metadata']['_intelligence']);
+    }
+    return $metadata;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function deleteDocument($doc_id) {
diff --git a/src/LingotekContentTranslationService.php b/src/LingotekContentTranslationService.php
index 02a0617..63bed53 100644
--- a/src/LingotekContentTranslationService.php
+++ b/src/LingotekContentTranslationService.php
@@ -21,6 +21,7 @@ use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\lingotek\Entity\LingotekContentMetadata;
 use Drupal\lingotek\Exception\LingotekApiException;
 use Drupal\lingotek\Exception\LingotekContentEntityStorageException;
+use Drupal\user\UserInterface;
 
 /**
  * Service for managing Lingotek content translations.
@@ -33,6 +34,7 @@ class LingotekContentTranslationService implements LingotekContentTranslationSer
    * The Lingotek interface
    *
    * @var \Drupal\lingotek\LingotekInterface
+   * @var \Drupal\lingotek\LingotekInterface
    */
   protected $lingotek;
 
@@ -521,14 +523,7 @@ class LingotekContentTranslationService implements LingotekContentTranslationSer
       }
     }
     // Embed entity metadata if there is any.
-    if ($entity->id()) {
-      $data['_lingotek_metadata'] =
-        [
-          '_entity_type_id' => $entity->getEntityTypeId(),
-          '_entity_id' => $entity->id(),
-          '_entity_revision' => $entity->getRevisionId(),
-        ];
-    }
+    $this->includeMetadata($entity, $data);
     return $data;
   }
 
@@ -658,9 +653,8 @@ class LingotekContentTranslationService implements LingotekContentTranslationSer
 
     // Allow other modules to alter the data before is uploaded.
     \Drupal::moduleHandler()->invokeAll('lingotek_content_entity_document_upload', [&$source_data, &$entity, &$url]);
-    $encoded_data = json_encode($source_data);
 
-    $document_id = $this->lingotek->uploadDocument($document_name, $encoded_data, $this->getSourceLocale($entity), $url, $profile);
+    $document_id = $this->lingotek->uploadDocument($document_name, $source_data, $this->getSourceLocale($entity), $url, $profile);
     if ($document_id) {
       $this->lingotekConfiguration->setProfile($entity, $profile->id());
       $this->setDocumentId($entity, $document_id);
@@ -737,9 +731,8 @@ class LingotekContentTranslationService implements LingotekContentTranslationSer
 
     // Allow other modules to alter the data before is uploaded.
     \Drupal::moduleHandler()->invokeAll('lingotek_content_entity_document_upload', [&$source_data, &$entity, &$url]);
-    $encoded_data = json_encode($source_data);
 
-    if ($this->lingotek->updateDocument($document_id, $encoded_data, $url, $document_name)){
+    if ($this->lingotek->updateDocument($document_id, $source_data, $url, $document_name)){
       $this->setSourceStatus($entity, Lingotek::STATUS_IMPORTING);
       $this->setTargetStatuses($entity, Lingotek::STATUS_PENDING);
       return $document_id;
@@ -1073,4 +1066,96 @@ class LingotekContentTranslationService implements LingotekContentTranslationSer
     }
   }
 
+  /**
+   * Embeds the metadata for being uploaded.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
+   *   The entity.
+   * @param $data
+   *   The array of data.
+   */
+  protected function includeMetadata(ContentEntityInterface &$entity, &$data) {
+    /** @var \Drupal\lingotek\LingotekIntelligenceMetadataInterface $intelligenceService */
+    $intelligenceService = \Drupal::service('lingotek.intelligence');
+
+    if ($entity->id()) {
+      if ($entity->lingotek_metadata && $entity->lingotek_metadata->entity) {
+        $profile = $this->lingotekConfiguration->getEntityProfile($entity);
+      }
+      else {
+        $profile = NULL;
+      }
+
+      $domain = \Drupal::request()->getSchemeAndHttpHost();
+
+      $author_name = '';
+      $author_email = '';
+      if (method_exists($entity, 'getOwner')) {
+        /** @var \Drupal\user\UserInterface $user */
+        $user = $entity->getOwner();
+        $author_name = $user->getDisplayName();
+        $author_email = $user->getEmail();
+      }
+
+      $intelligenceService->setProfile($profile);
+
+      $data['_lingotek_metadata']['_entity_type_id'] = $entity->getEntityTypeId();
+      $data['_lingotek_metadata']['_entity_id'] = $entity->id();
+      $data['_lingotek_metadata']['_entity_revision'] = $entity->getRevisionId();
+      $data['_lingotek_metadata']['_intelligence']['external_document_id'] = $entity->id();
+      $data['_lingotek_metadata']['_intelligence']['content_type'] = $entity->getEntityTypeId();
+
+      //Check if we have permission to send these
+      if ($intelligenceService->getBaseDomainPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['domain'] = $domain;
+      }
+      if ($intelligenceService->getReferenceUrlPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['reference_url'] = $entity->hasLinkTemplate('canonical') ? $entity->toUrl()
+          ->setAbsolute(TRUE)
+          ->toString() : NULL;
+      }
+      if ($intelligenceService->getAuthorPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['author_name'] = $author_name;
+      }
+      if ($intelligenceService->getAuthorPermission() && $intelligenceService->getAuthorEmailPermission() && $intelligenceService->getContactEmailForAuthorPermission() && $intelligenceService->getContactEmailPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['author_email'] = $intelligenceService->getContactEmail();
+      }
+      if ($intelligenceService->getAuthorPermission() && $intelligenceService->getAuthorEmailPermission() && (!$intelligenceService->getContactEmailForAuthorPermission() || !$intelligenceService->getContactEmailPermission())) {
+        $data['_lingotek_metadata']['_intelligence']['author_email'] = $author_email;
+      }
+      if ($intelligenceService->getBusinessUnitPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['business_unit'] = $intelligenceService->getBusinessUnit();
+      }
+      if ($intelligenceService->getBusinessDivisionPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['business_division'] = $intelligenceService->getBusinessDivision();
+      }
+      if ($intelligenceService->getCampaignIdPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['campaign_id'] = $intelligenceService->getCampaignId();
+      }
+      if ($intelligenceService->getCampaignRatingPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['campaign_rating'] = $intelligenceService->getCampaignRating();
+      }
+      if ($intelligenceService->getChannelPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['channel'] = $intelligenceService->getChannel();
+      }
+      if ($intelligenceService->getContactNamePermission()) {
+        $data['_lingotek_metadata']['_intelligence']['contact_name'] = $intelligenceService->getContactName();
+      }
+      if ($intelligenceService->getContactEmailPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['contact_email'] = $intelligenceService->getContactEmail();
+      }
+      if ($intelligenceService->getContentDescriptionPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['content_description'] = $intelligenceService->getContentDescription();
+      }
+      if ($intelligenceService->getExternalStyleIdPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['external_style_id'] = $intelligenceService->getExternalStyleId();
+      }
+      if ($intelligenceService->getPurchaseOrderPermission()) {
+        $data['_lingotek_metadata']['_intelligence']['purchase_order'] = $intelligenceService->getPurchaseOrder();
+      }
+      if ($intelligenceService->getRegionPermission())
+        $data['_lingotek_metadata']['_intelligence']['region'] = $intelligenceService->getRegion();
+    }
+  }
+
 }
diff --git a/src/LingotekIntelligenceMetadataInterface.php b/src/LingotekIntelligenceMetadataInterface.php
new file mode 100644
index 0000000..94fbddb
--- /dev/null
+++ b/src/LingotekIntelligenceMetadataInterface.php
@@ -0,0 +1,527 @@
+<?php
+
+namespace Drupal\lingotek;
+
+/**
+ * Contract for any Lingotek Intelligence metadata provider.
+ *
+ * @package Drupal\lingotek
+ */
+interface LingotekIntelligenceMetadataInterface {
+
+  /**
+   * Gets the Business Unit associated with this content.
+   *
+   * @return string
+   *   The Business Unit.
+   */
+  public function getBusinessUnit();
+
+  /**
+   * Sets the Business Unit responsible for the content with this metadata.
+   * A business unit is a relatively autonomous division of a large company that
+   * operates as an independent enterprise with responsibility for a particular
+   * range of products or activities.
+   *
+   * Although, defined as such the user may define and use this field as best
+   * fits the situation.
+   *
+   * @param string $business_unit
+   *   The Business Unit.
+   *
+   * @return $this
+   */
+  public function setBusinessUnit($business_unit);
+
+  /**
+   * Gets the Business Division associated with this content.
+   *
+   * @return string
+   */
+  public function getBusinessDivision();
+
+  /**
+   * Set the Business Division responsible for the content with this metadata.
+   * A Business Division is defined as a discrete part of a company that may
+   * operate under the same name and legal responsibility or as a separate
+   * corporate and legal entity under another business name.
+   *
+   * This may be used as best fits the needs of the user.
+   *
+   * @param string $business_division
+   *   The Business Division.
+   *
+   * @return $this
+   */
+  public function setBusinessDivision($business_division);
+
+  /**
+   * Get the Campaign ID associated with this content.
+   *
+   * @return string
+   */
+  public function getCampaignId();
+
+  /**
+   * Set the Campaign ID associated with this content. The Campaign ID could be
+   * for a marketing or other campaign. This allows particular content to be
+   * associated with the campaign and then be able to see how a campaign is
+   * doing by only looking at content from the campaign.
+   *
+   * @param string $campaign_id
+   *   The Campaign ID.
+   *
+   * @return $this
+   */
+  public function setCampaignId($campaign_id);
+
+  /**
+   * Get the Campaign Rating associated with the content and the Campaign (which
+   * is represented by the Campaign ID).
+   *
+   * @return int
+   */
+  public function getCampaignRating();
+
+  /**
+   * Sets the Campaign Rating. The Campaign rating must be numeric, but can
+   * otherwise be used to rate the campaign and its effect on this content.
+   *
+   * @param int $campaign_rating
+   *   The Campaign Rating.
+   *
+   * @return $this
+   */
+  public function setCampaignRating($campaign_rating);
+
+  /**
+   * Gets the Channel associated with the content.
+   *
+   * @return string
+   */
+  public function getChannel();
+
+  /**
+   * Sets the Channel associated with the content. A channel is a way or outlet
+   * to market and sell products. This can be used to associate the content with
+   * a particular marketing channel.
+   *
+   * @param string $channel
+   *   The Channel.
+   *
+   * @return $this
+   */
+  public function setChannel($channel);
+
+  /**
+   * Gets the name of the contact responsible for this content.
+   *
+   * @return string
+   */
+  public function getContactName();
+
+  /**
+   * Sets the name of the person to contact in regards to this content.
+   *
+   * @param string $contact_name
+   *   The Contact Name.
+   *
+   * @return $this
+   */
+  public function setContactName($contact_name);
+
+  /**
+   * Gets the Contact Email for the Contact Person responsible for this content.
+   *
+   * @return string
+   */
+  public function getContactEmail();
+
+  /**
+   * Sets the Contact Email for the Contact Person responsible for this content.
+   *
+   * @param string $contact_email
+   *   The Contact Email.
+   *
+   * @return $this
+   */
+  public function setContactEmail($contact_email);
+
+  /**
+   * Gets the description of this content.
+   *
+   * @return string
+   */
+  public function getContentDescription();
+
+  /**
+   * Sets the description for this content.
+   *
+   * @param string $content_description
+   *   The Content Description.
+   *
+   * @return $this
+   */
+  public function setContentDescription($content_description);
+
+  /**
+   * Gets the Purchase Order.
+   *
+   * @return string
+   */
+  public function getPurchaseOrder();
+
+  /**
+   * Sets the Purchase Order associated with the purchase of the translation.
+   *
+   * @param string $purchase_order
+   *   The Purchase Order.
+   *
+   * @return $this
+   */
+  public function setPurchaseOrder($purchase_order);
+
+  /**
+   * Gets the External Style ID associated with this content.
+   *
+   * @return string
+   */
+  public function getExternalStyleId();
+
+  /**
+   * Sets the External Style ID that is associated with the marketing and style
+   * the content is using.
+   *
+   * @param string $external_style_id
+   *   The External Style ID.
+   *
+   * @return $this
+   */
+  public function setExternalStyleId($external_style_id);
+
+  /**
+   * Gets the Region the content is presented to.
+   *
+   * @return string
+   */
+  public function getRegion();
+
+  /**
+   * Sets the Region the content is meant for, presented to, or created in.
+   *
+   * @param string $region
+   *   The Region.
+   * @return $this
+   */
+  public function setRegion($region);
+
+  /**
+   * Gets the Permission setting for Author Permission.
+   *
+   * @return bool
+   */
+  public function getAuthorPermission();
+
+  /**
+   * Sets the Permission setting for whether or not the author information
+   * should be sent.
+   *
+   * @param bool $use_author
+   *   Flag indicating if the author should be used.
+   *
+   * @return $this
+   */
+  public function setAuthorPermission($use_author);
+
+  /**
+   * Gets the Default Author Email.
+   *
+   * @return bool
+   */
+  public function getDefaultAuthorEmail();
+
+  /**
+   * Sets the Default Author Email that should be used.
+   *
+   * @param string $default_author_email
+   *   The Default Author Email.
+   *
+   * @return $this
+   */
+  public function setDefaultAuthorEmail($default_author_email);
+
+  /**
+   * Gets the Permission setting for whether or not the Author Email should be
+   * sent.
+   *
+   * @return bool
+   */
+  public function getAuthorEmailPermission();
+
+  /**
+   * Sets the Permission setting for whether or not an Author Email should be
+   * used in the Intelligence Metadata.
+   *
+   * @param bool $use_author_email
+   *   Flag indicating if the author email should be used.
+   *
+   * @return $this
+   */
+  public function setAuthorEmailPermission($use_author_email);
+
+  /**
+   * Gets the Permission setting for whether or not to use the Contact Email
+   * as the author's email.
+   *
+   * @return bool
+   */
+  public function getContactEmailForAuthorPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to use the Contact Email
+   * as the author's email.
+   *
+   * @param bool $use_contact_email_for_author
+   *   Flag indicating if we want to use contact email as author if author
+   *   is not set.
+   *
+   * @return $this
+   */
+  public function setContactEmailForAuthorPermission($use_contact_email_for_author);
+
+  /**
+   * Gets the Permission setting for wheter or not to use the Business Unit.
+   *
+   * @return bool
+   */
+  public function getBusinessUnitPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to use the Business Unit.
+   *
+   * @param bool $use_business_unit
+   *   Flag indicating if we want to use a Business Unit.
+   *
+   * @return $this
+   */
+  public function setBusinessUnitPermission($use_business_unit);
+
+  /**
+   * Gets the Permission setting for whether or not to use the Business Division.
+   *
+   * @return bool
+   */
+  public function getBusinessDivisionPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to use the Business Division.
+   *
+   * @param bool $use_business_division
+   *   Flag indicating if we want to indicate the Business Division.
+   *
+   * @return $this
+   */
+  public function setBusinessDivisionPermission($use_business_division);
+
+  /**
+   * Gets the Permission setting for whether or not to use the Campaign Id.
+   *
+   * @return bool
+   */
+  public function getCampaignIdPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to use the Campaign Id.
+   *
+   * @param bool $use_campaign_id
+   *   Flag indicating if we want to indicate the Campaign ID.
+   *
+   * @return $this
+   */
+  public function setCampaignIdPermission($use_campaign_id);
+
+  /**
+   * Gets the Permission setting for whether or not the Campaign Rating should
+   * be used and tracked.
+   *
+   * @return bool
+   */
+  public function getCampaignRatingPermission();
+
+  /**
+   * Sets the Permission setting for whether or not the Campaign Rating should
+   * be used and tracked.
+   *
+   * @param bool $use_campaign_rating
+   *   Flag indicating if we want to indicate the Campaign Rating.
+   *
+   * @return $this
+   */
+  public function setCampaignRatingPermission($use_campaign_rating);
+
+  /**
+   * Gets the Permission setting for whether or not the Channel should be used
+   * and tracked.
+   *
+   * @return bool
+   */
+  public function getChannelPermission();
+
+  /**
+   * Sets the Permission setting for whether or not the Channel should be used
+   * and tracked.
+   *
+   * @param bool $use_channel
+   *   Flag indicating if we want to indicate the Channel.
+   *
+   * @return $this
+   */
+  public function setChannelPermission($use_channel);
+
+  /**
+   * Gets the Permission setting for whether or not to include the Contact Name.
+   *
+   * @return bool
+   */
+  public function getContactNamePermission();
+
+  /**
+   * Sets the Permission setting for whether or not to include the Contact Name.
+   *
+   * @param bool $use_contact_name
+   *   Flag indicating if we want to indicate the Contact Name.
+   *
+   * @return $this
+   */
+  public function setContactNamePermission($use_contact_name);
+
+  /**
+   * Gets the Permission setting for whether or not to include the Contact Email.
+   *
+   * @return bool
+   */
+  public function getContactEmailPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to include the Contact Email.
+   *
+   * @param bool $use_contact_email
+   *   Flag indicating if we want to indicate the Contact Email.
+   *
+   * @return $this
+   */
+  public function setContactEmailPermission($use_contact_email);
+
+  /**
+   * Gets the Permission setting for whether or not to include the Content
+   * Description.
+   *
+   * @return bool
+   */
+  public function getContentDescriptionPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to include the Content
+   * Description.
+   *
+   * @param bool $use_content_description
+   *   Flag indicating if we want to indicate the Content Description.
+   *
+   * @return $this
+   */
+  public function setContentDescriptionPermission($use_content_description);
+
+  /**
+   * Gets the Permission setting for whether or not to include the External
+   * Style Id.
+   *
+   * @return bool
+   */
+  public function getExternalStyleIdPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to include the External
+   * Style Id.
+   *
+   * @param bool $use_external_style_id
+   *   Flag indicating if we want to indicate the External Style ID.
+   *
+   * @return $this
+   */
+  public function setExternalStyleIdPermission($use_external_style_id);
+
+  /**
+   * Gets the Permission setting for whether or not to include the Purchase
+   * Order.
+   *
+   * @return bool
+   */
+  public function getPurchaseOrderPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to include the Purchase
+   * Order.
+   *
+   * @param bool $use_purchase_order
+   *   Flag indicating if we want to indicate the Purchase Order.
+   *
+   * @return $this
+   */
+  public function setPurchaseOrderPermission($use_purchase_order);
+
+  /**
+   * Gets the Permission setting for whether or not to include the Region.
+   *
+   * @return bool
+   */
+  public function getRegionPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to include the Region.
+   *
+   * @param bool $use_region
+   *   Flag indicating if we want to indicate the Region.
+   *
+   * @return $this
+   */
+  public function setRegionPermission($use_region);
+
+  /**
+   * Gets the Permission setting for whether or not to include the Base Domain
+   * in the metadata.
+   *
+   * @return bool
+   */
+  public function getBaseDomainPermission();
+
+  /**
+   * Sets the Permission setting for whether or not to include the Base Domain
+   * in the metadata.
+   *
+   * @param bool $use_base_domain
+   *   Flag indicating if we want to indicate the Base Domain.
+   *
+   * @return $this
+   */
+  public function setBaseDomainPermission($use_base_domain);
+
+  /**
+   * Gets the Permission setting for whether or not the Reference URL for this
+   * content should be included in the metadata.
+   *
+   * @return bool
+   */
+  public function getReferenceUrlPermission();
+
+  /**
+   * Sets the Permission setting for whether or not the Reference URL for this
+   * content should be included in the metadata.
+   *
+   * @param bool $use_reference_url
+   *   Flag indicating if we want to indicate the Reference URL.
+   *
+   * @return $this
+   */
+  public function setReferenceUrlPermission($use_reference_url);
+
+}
diff --git a/src/LingotekIntelligenceService.php b/src/LingotekIntelligenceService.php
new file mode 100644
index 0000000..8bebdcc
--- /dev/null
+++ b/src/LingotekIntelligenceService.php
@@ -0,0 +1,517 @@
+<?php
+
+namespace Drupal\lingotek;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Service for managing Lingotek Intelligence related configuration.
+ *
+ * @package Drupal\lingotek
+ */
+class LingotekIntelligenceService implements LingotekIntelligenceMetadataInterface, ContainerInjectionInterface {
+
+  /**
+   * The Lingotek Intelligence configuration service.
+   *
+   * @var \Drupal\lingotek\LingotekIntelligenceServiceConfig
+   */
+  protected $intelligenceConfig;
+
+  /**
+   * The Lingotek profile.
+   *
+   * @var \Drupal\lingotek\LingotekProfileInterface|NULL
+   */
+  protected $profile;
+
+  /**
+   * Constructs a LingotekIntelligenceService object.
+   *
+   * @param \Drupal\lingotek\LingotekIntelligenceServiceConfig $intelligence_config
+   *   The Lingotek Intelligence configuration service.
+   */
+  public function __construct(LingotekIntelligenceServiceConfig $intelligence_config) {
+    $this->intelligenceConfig = $intelligence_config;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('lingotek.intelligence_config')
+    );
+  }
+
+  /**
+   * Sets the profile.
+   *
+   * @param \Drupal\lingotek\LingotekProfileInterface $profile
+   *   The profile.
+   */
+  public function setProfile($profile) {
+    $this->profile = $profile;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessUnit() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessUnit($business_unit) {
+    return $this->setValue('business_unit', $business_unit);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessDivision() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessDivision($business_division) {
+    return $this->setValue('business_division', $business_division);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignId() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignId($campaign_id) {
+    return $this->setValue('campaign_id', $campaign_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignRating() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignRating($campaign_rating) {
+    return $this->setValue('campaign_rating', $campaign_rating);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChannel() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setChannel($channel) {
+    return $this->setValue('channel', $channel);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactName() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactName($contact_name) {
+    return $this->setValue('contact_name', $contact_name);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmail() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmail($contact_email) {
+    return $this->setValue('contact_email', $contact_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContentDescription() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContentDescription($content_description) {
+    return $this->setValue('content_description', $content_description);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPurchaseOrder() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setPurchaseOrder($purchase_order) {
+    return $this->setValue('purchase_order', $purchase_order);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getExternalStyleId() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setExternalStyleId($external_style_id) {
+    return $this->setValue('external_style_id', $external_style_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegion() {
+    return $this->getValue(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRegion($region) {
+    return $this->setValue('region', $region);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAuthorPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setAuthorPermission($use_author) {
+    return $this->setValue('use_author', $use_author);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultAuthorEmail() {
+    /** @var \Drupal\lingotek\LingotekIntelligenceMetadataInterface $metadata */
+    $metadata = $this->profile;
+    $value = NULL;
+    if ($this->profile !== NULL && $this->profile->hasIntelligenceMetadataOverrides()) {
+      if ($metadata->getAuthorEmailPermission()) {
+        $value = $metadata->getDefaultAuthorEmail();
+      }
+    }
+    else {
+      if ($this->intelligenceConfig->getAuthorEmailPermission()) {
+        $value = $this->intelligenceConfig->getDefaultAuthorEmail();
+      }
+    }
+    return $value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDefaultAuthorEmail($default_author_email) {
+    return $this->setValue('default_author_email', $default_author_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAuthorEmailPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setAuthorEmailPermission($use_author_email) {
+    return $this->setValue('use_author_email', $use_author_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmailForAuthorPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmailForAuthorPermission($use_contact_email_for_author) {
+    return $this->setValue('use_contact_email_for_author', $use_contact_email_for_author);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessUnitPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessUnitPermission($use_business_unit) {
+    return $this->setValue('use_business_unit', $use_business_unit);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessDivisionPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessDivisionPermission($use_business_division) {
+    return $this->setValue('use_business_division', $use_business_division);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignIdPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignIdPermission($use_campaign_id) {
+    return $this->setValue('use_campaign_id', $use_campaign_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignRatingPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignRatingPermission($use_campaign_rating) {
+    return $this->setValue('use_campaign_rating', $use_campaign_rating);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChannelPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setChannelPermission($use_channel) {
+    return $this->setValue('use_channel', $use_channel);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactNamePermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactNamePermission($use_contact_name) {
+    return $this->setValue('use_contact_name', $use_contact_name);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmailPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmailPermission($use_contact_email) {
+    return $this->setValue('use_contact_email', $use_contact_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContentDescriptionPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContentDescriptionPermission($use_content_description) {
+    return $this->setValue('use_content_description', $use_content_description);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getExternalStyleIdPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setExternalStyleIdPermission($use_external_style_id) {
+    return $this->setValue('use_external_style_id', $use_external_style_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPurchaseOrderPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setPurchaseOrderPermission($use_purchase_order) {
+    return $this->setValue('use_purchase_order', $use_purchase_order);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegionPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRegionPermission($use_region) {
+    return $this->setValue('use_region', $use_region);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBaseDomainPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBaseDomainPermission($use_base_domain) {
+    return $this->setValue('use_base_domain', $use_base_domain);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getReferenceUrlPermission() {
+    return $this->getPermission(__FUNCTION__);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setReferenceUrlPermission($use_reference_url) {
+    return $this->setValue('use_reference_url', $use_reference_url);
+  }
+
+  /**
+   * Helper for getting a value from config, validating that the usage is set.
+   *
+   * @param string $key
+   *   The key.
+   *
+   * @return array|mixed|null
+   */
+  protected function getValue($key) {
+    $value = NULL;
+    $method = $key;
+    $permissionMethod = $key . 'Permission';
+    if ($this->profile !== NULL && $this->profile->hasIntelligenceMetadataOverrides()) {
+      if ($this->profile->{$permissionMethod}()) {
+        $value = $this->profile->{$method}();
+      }
+    }
+    else {
+      if ($this->intelligenceConfig->{$permissionMethod}()) {
+        $value = $this->intelligenceConfig->{$method}();
+      }
+    }
+    return $value;
+  }
+
+  /**
+   * Checks the permission given the overrides.
+   *
+   * @param string $permissionMethod
+   *   The permission method being called.
+   *
+   * @return bool
+   *   The access check result.
+   */
+  protected function getPermission($permissionMethod) {
+    $value = NULL;
+    if ($this->profile !== NULL && $this->profile->hasIntelligenceMetadataOverrides()) {
+      $value = $this->profile->{$permissionMethod}();
+    }
+    else {
+      $value = $this->intelligenceConfig->{$permissionMethod}();
+    }
+    return $value;
+  }
+
+  /**
+   * We don't allow to store values on this service.
+   *
+   * @throws \BadMethodCallException
+   */
+  protected function setValue($key, $value) {
+    throw new \BadMethodCallException();
+  }
+
+}
diff --git a/src/LingotekIntelligenceServiceConfig.php b/src/LingotekIntelligenceServiceConfig.php
new file mode 100644
index 0000000..16f6844
--- /dev/null
+++ b/src/LingotekIntelligenceServiceConfig.php
@@ -0,0 +1,490 @@
+<?php
+
+namespace Drupal\lingotek;
+
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Service for managing Lingotek Intelligence related configuration.
+ *
+ * @package Drupal\lingotek
+ */
+class LingotekIntelligenceServiceConfig implements LingotekIntelligenceMetadataInterface, ContainerInjectionInterface {
+
+  /**
+   * The configuration factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * Constructs a LingotekIntelligenceService object.
+   *
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The factory for configuration objects.
+   */
+  public function __construct(ConfigFactoryInterface $config_factory) {
+    $this->configFactory = $config_factory;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('config.factory')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessUnit() {
+    return $this->getValue('business_unit');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessUnit($business_unit) {
+    return $this->setValue('business_unit', $business_unit);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessDivision() {
+    return $this->getValue('business_division');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessDivision($business_division) {
+    return $this->setValue('business_division', $business_division);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignId() {
+    return $this->getValue('campaign_id');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignId($campaign_id) {
+    return $this->setValue('campaign_id', $campaign_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignRating() {
+    return $this->getValue('campaign_rating');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignRating($campaign_rating) {
+    return $this->setValue('campaign_rating', $campaign_rating);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChannel() {
+    return $this->getValue('channel');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setChannel($channel) {
+    return $this->setValue('channel', $channel);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactName() {
+    return $this->getValue('contact_name');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactName($contact_name) {
+    return $this->setValue('contact_name', $contact_name);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmail() {
+    return $this->getValue('contact_email');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmail($contact_email) {
+    return $this->setValue('contact_email', $contact_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContentDescription() {
+    return $this->getValue('content_description');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContentDescription($content_description) {
+    return $this->setValue('content_description', $content_description);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPurchaseOrder() {
+    return $this->getValue('purchase_order');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setPurchaseOrder($purchase_order) {
+    return $this->setValue('purchase_order', $purchase_order);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getExternalStyleId() {
+    return $this->getValue('external_style_id');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setExternalStyleId($external_style_id) {
+    return $this->setValue('external_style_id', $external_style_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegion() {
+    return $this->getValue('region');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRegion($region) {
+    return $this->setValue('region', $region);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAuthorPermission() {
+    $value = NULL;
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_author');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setAuthorPermission($use_author) {
+    return $this->setValue('use_author', $use_author);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultAuthorEmail() {
+    $value = NULL;
+    $config = $this->configFactory->get('lingotek.settings');
+    if ($config->get('intelligence.use_author_email')) {
+      $value = $config->get('intelligence.default_author_email');
+    }
+    return $value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDefaultAuthorEmail($default_author_email) {
+    return $this->setValue('default_author_email', $default_author_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAuthorEmailPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_author_email');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setAuthorEmailPermission($use_author_email) {
+    return $this->setValue('use_author_email', $use_author_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmailForAuthorPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_contact_email_for_author');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmailForAuthorPermission($use_contact_email_for_author) {
+    return $this->setValue('use_contact_email_for_author', $use_contact_email_for_author);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessUnitPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_business_unit');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessUnitPermission($use_business_unit) {
+    return $this->setValue('use_business_unit', $use_business_unit);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBusinessDivisionPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_business_division');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBusinessDivisionPermission($use_business_division) {
+    return $this->setValue('use_business_division', $use_business_division);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignIdPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_campaign_id');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignIdPermission($use_campaign_id) {
+    return $this->setValue('use_campaign_id', $use_campaign_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCampaignRatingPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_campaign_rating');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCampaignRatingPermission($use_campaign_rating) {
+    return $this->setValue('use_campaign_rating', $use_campaign_rating);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChannelPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_channel');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setChannelPermission($use_channel) {
+    return $this->setValue('use_channel', $use_channel);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactNamePermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_contact_name');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactNamePermission($use_contact_name) {
+    return $this->setValue('use_contact_name', $use_contact_name);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContactEmailPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_contact_email');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContactEmailPermission($use_contact_email) {
+    return $this->setValue('use_contact_email', $use_contact_email);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContentDescriptionPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_content_description');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContentDescriptionPermission($use_content_description) {
+    return $this->setValue('use_content_description', $use_content_description);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getExternalStyleIdPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_external_style_id');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setExternalStyleIdPermission($use_external_style_id) {
+    return $this->setValue('use_external_style_id', $use_external_style_id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPurchaseOrderPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_purchase_order');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setPurchaseOrderPermission($use_purchase_order) {
+    return $this->setValue('use_purchase_order', $use_purchase_order);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegionPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_region');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRegionPermission($use_region) {
+    return $this->setValue('use_region', $use_region);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBaseDomainPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_base_domain');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBaseDomainPermission($use_base_domain) {
+    return $this->setValue('use_base_domain', $use_base_domain);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getReferenceUrlPermission() {
+    $config = $this->configFactory->get('lingotek.settings');
+    return $config->get('intelligence.use_reference_url');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setReferenceUrlPermission($use_reference_url) {
+    return $this->setValue('use_reference_url', $use_reference_url);
+  }
+
+  /**
+   * Helper for getting a value from config, validating that the usage is set.
+   *
+   * @param string $key
+   *   The key.
+   *
+   * @return array|mixed|null
+   */
+  protected function getValue($key) {
+    $value = NULL;
+    $config = $this->configFactory->get('lingotek.settings');
+    if ($config->get('intelligence.use_' . $key)) {
+      $value = $config->get('intelligence.' . $key);
+    }
+    return $value;
+  }
+
+  /**
+   * Helper for setting a value to config.
+   *
+   * @param string $key
+   *   The key.
+   * @param $value
+   *   The value.
+   *
+   * @return $this
+   */
+  protected function setValue($key, $value) {
+    $config = $this->configFactory->getEditable('lingotek.settings');
+    $config->set('intelligence.' . $key, $value);
+    $config->save();
+    return $this;
+  }
+
+}
diff --git a/src/LingotekInterface.php b/src/LingotekInterface.php
index 27f67a5..c85b66b 100644
--- a/src/LingotekInterface.php
+++ b/src/LingotekInterface.php
@@ -43,8 +43,9 @@ interface LingotekInterface {
    *
    * @param string $title
    *   The title of the document as it will be seen in the TMS.
-   * @param $content
-   *   The content of the document
+   * @param string|array $content
+   *   The content of the document. It can be a json string or an array that will
+   *   be json encoded.
    * @param string $locale
    *   The Lingotek locale.
    * @param string $url
@@ -61,8 +62,9 @@ interface LingotekInterface {
    *
    * @param string $doc_id
    *   The document id to update.
-   * @param $content
-   *   The content of the document
+   * @param string|array $content
+   *   The content of the document. It can be a json string or an array that will
+   *   be json encoded.
    * @param string $url
    *   (optional) The document url in the site if any. This allows support for in-context review.
    * @param string $title
diff --git a/src/LingotekProfileInterface.php b/src/LingotekProfileInterface.php
index 92682d8..8bc3c5f 100644
--- a/src/LingotekProfileInterface.php
+++ b/src/LingotekProfileInterface.php
@@ -188,4 +188,22 @@ interface LingotekProfileInterface extends ConfigEntityInterface {
    */
   public function hasCustomSettingsForTarget($langcode);
 
+  /**
+   * Checks if the profile overrides settings for Intelligence metadata.
+   *
+   * @return bool
+   *   TRUE if there are Lingotek Intelligence customizations, FALSE if not.
+   */
+  public function hasIntelligenceMetadataOverrides();
+
+  /**
+   * Set if the profile overrides settings for Intelligence metadata.
+   *
+   * @param bool $value
+   *   TRUE if there are Lingotek Intelligence customizations, FALSE if not.
+   *
+   * @return $this
+   */
+  public function setIntelligenceMetadataOverrides($value);
+
 }
diff --git a/src/Tests/Form/IntelligenceMetadataFormTestTrait.php b/src/Tests/Form/IntelligenceMetadataFormTestTrait.php
new file mode 100644
index 0000000..dcbf9a1
--- /dev/null
+++ b/src/Tests/Form/IntelligenceMetadataFormTestTrait.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Drupal\lingotek\Tests\Form;
+
+/**
+ * Utility methods for testing the intelligence metadata forms.
+ *
+ * @package Drupal\lingotek\Tests\Form
+ */
+trait IntelligenceMetadataFormTestTrait {
+
+  /**
+   * Assert field defaults are correct.
+   */
+  protected function assertIntelligenceFieldDefaults() {
+    $this->assertFieldChecked('edit-intelligence-metadata-use-author');
+    $this->assertFieldChecked('edit-intelligence-metadata-use-author-email');
+    $this->assertNoFieldChecked('edit-intelligence-metadata-use-contact-email-for-author');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-business-unit');
+    $this->assertFieldByName('intelligence_metadata[business_unit]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-business-division');
+    $this->assertFieldByName('intelligence_metadata[business_division]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-campaign-id');
+    $this->assertFieldByName('intelligence_metadata[campaign_id]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-campaign-rating');
+    $this->assertFieldByName('intelligence_metadata[campaign_rating]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-channel');
+    $this->assertFieldByName('intelligence_metadata[channel]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-contact-name');
+    $this->assertFieldByName('intelligence_metadata[contact_name]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-contact-email');
+    $this->assertFieldByName('intelligence_metadata[contact_email]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-content-description');
+    $this->assertFieldByName('intelligence_metadata[content_description]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-base-domain');
+    $this->assertFieldChecked('edit-intelligence-metadata-use-reference-url');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-external-style-id');
+    $this->assertFieldByName('intelligence_metadata[external_style_id]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-purchase-order');
+    $this->assertFieldByName('intelligence_metadata[purchase_order]', '');
+
+    $this->assertFieldChecked('edit-intelligence-metadata-use-region');
+    $this->assertFieldByName('intelligence_metadata[region]', '');
+  }
+
+}
diff --git a/src/Tests/Form/LingotekProfileFormTest.php b/src/Tests/Form/LingotekProfileFormTest.php
index 4a39201..07b262d 100644
--- a/src/Tests/Form/LingotekProfileFormTest.php
+++ b/src/Tests/Form/LingotekProfileFormTest.php
@@ -14,6 +14,8 @@ use Drupal\lingotek\Tests\LingotekTestBase;
  */
 class LingotekProfileFormTest extends LingotekTestBase {
 
+  use IntelligenceMetadataFormTestTrait;
+
   /**
    * {@inheritdoc}
    */
@@ -82,6 +84,7 @@ class LingotekProfileFormTest extends LingotekTestBase {
     $this->assertIdentical('default', $profile->getProject());
     $this->assertIdentical('default', $profile->getVault());
     $this->assertIdentical('default', $profile->getWorkflow());
+    $this->assertFalse($profile->hasIntelligenceMetadataOverrides());
   }
 
   /**
@@ -392,6 +395,131 @@ class LingotekProfileFormTest extends LingotekTestBase {
   }
 
   /**
+   * Tests that by default intelligence overrides are disabled.
+   */
+  public function testIntelligenceOverrideDefaults() {
+    $this->drupalGet('admin/lingotek/settings');
+    $this->clickLink(t('Add new Translation Profile'));
+    $this->assertNoFieldChecked('edit-intelligence-metadata-overrides-override');
+    $this->assertIntelligenceFieldDefaults();
+  }
+
+  /**
+   * Tests that we can enable intelligence metadata overrides.
+   */
+  public function testEnableIntelligenceOverride() {
+    $this->drupalGet('admin/lingotek/settings');
+    $this->clickLink(t('Add new Translation Profile'));
+
+    $profile_id = strtolower($this->randomMachineName());
+    $profile_name = $this->randomString();
+    $edit = [
+      'id' => $profile_id,
+      'label' => $profile_name,
+      'auto_upload' => 1,
+      'auto_download' => 1,
+      'intelligence_metadata_overrides[override]' => 1,
+      'intelligence_metadata[use_author]' => 1,
+      'intelligence_metadata[use_author_email]' => 1,
+      'intelligence_metadata[use_contact_email_for_author]' => FALSE,
+      'intelligence_metadata[use_business_unit]' => 1,
+      'intelligence_metadata[use_business_division]' => 1,
+      'intelligence_metadata[use_campaign_id]' => 1,
+      'intelligence_metadata[use_campaign_rating]' => 1,
+      'intelligence_metadata[use_channel]' => 1,
+      'intelligence_metadata[use_contact_name]' => 1,
+      'intelligence_metadata[use_contact_email]' => 1,
+      'intelligence_metadata[use_content_description]' => 1,
+      'intelligence_metadata[use_external_style_id]' => 1,
+      'intelligence_metadata[use_purchase_order]' => 1,
+      'intelligence_metadata[use_region]' => 1,
+      'intelligence_metadata[use_base_domain]' => 1,
+      'intelligence_metadata[use_reference_url]' => 1,
+      'intelligence_metadata[default_author_email]' => 'test@example.com',
+      'intelligence_metadata[business_unit]' => 'Test Business Unit',
+      'intelligence_metadata[business_division]' => 'Test Business Division',
+      'intelligence_metadata[campaign_id]' => 'Campaign ID',
+      'intelligence_metadata[campaign_rating]' => 5,
+      'intelligence_metadata[channel]' => 'Channel Test',
+      'intelligence_metadata[contact_name]' => 'Test Contact Name',
+      'intelligence_metadata[contact_email]' => 'contact@example.com',
+      'intelligence_metadata[content_description]' => 'Content description',
+      'intelligence_metadata[external_style_id]' => 'my-style-id',
+      'intelligence_metadata[purchase_order]' => 'PO32',
+      'intelligence_metadata[region]' => 'region2',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+
+    $this->assertText(t('The Lingotek profile has been successfully saved.'));
+
+    // We can edit them.
+    $this->assertLinkByHref("/admin/lingotek/settings/profile/$profile_id/edit");
+
+    $this->assertFieldChecked("edit-profile-$profile_id-auto-upload");
+    $this->assertFieldChecked("edit-profile-$profile_id-auto-download");
+    $this->assertFieldEnabled("edit-profile-$profile_id-auto-upload");
+    $this->assertFieldEnabled("edit-profile-$profile_id-auto-download");
+
+    $this->drupalGet("/admin/lingotek/settings/profile/$profile_id/edit");
+
+    // Assert the intelligence metadata values.
+    $this->assertFieldChecked('edit-intelligence-metadata-overrides-override');
+    $this->assertNoFieldChecked('edit-intelligence-metadata-use-contact-email-for-author');
+    $this->assertFieldByName('intelligence_metadata[default_author_email]', 'test@example.com');
+    $this->assertFieldByName('intelligence_metadata[business_unit]', 'Test Business Unit');
+    $this->assertFieldByName('intelligence_metadata[business_division]', 'Test Business Division');
+    $this->assertFieldByName('intelligence_metadata[campaign_id]', 'Campaign ID');
+    $this->assertFieldByName('intelligence_metadata[campaign_rating]', 5);
+    $this->assertFieldByName('intelligence_metadata[channel]', 'Channel Test');
+    $this->assertFieldByName('intelligence_metadata[contact_name]', 'Test Contact Name');
+    $this->assertFieldByName('intelligence_metadata[contact_email]', 'contact@example.com');
+    $this->assertFieldByName('intelligence_metadata[content_description]', 'Content description');
+    $this->assertFieldByName('intelligence_metadata[external_style_id]', 'my-style-id');
+    $this->assertFieldByName('intelligence_metadata[purchase_order]', 'PO32');
+    $this->assertFieldByName('intelligence_metadata[region]', 'region2');
+
+    /** @var \Drupal\lingotek\LingotekProfileInterface $profile */
+    $profile = LingotekProfile::load($profile_id);
+    $this->assertTrue($profile->hasAutomaticUpload());
+    $this->assertTrue($profile->hasAutomaticDownload());
+    $this->assertIdentical('default', $profile->getProject());
+    $this->assertIdentical('default', $profile->getVault());
+    $this->assertIdentical('default', $profile->getWorkflow());
+
+    // Assert the intelligence metadata values.
+    $this->assertTrue($profile->hasIntelligenceMetadataOverrides());
+    $this->assertTrue($profile->getAuthorPermission());
+    $this->assertTrue($profile->getAuthorEmailPermission());
+    $this->assertFalse($profile->getContactEmailForAuthorPermission());
+    $this->assertTrue($profile->getBusinessUnitPermission());
+    $this->assertTrue($profile->getBusinessDivisionPermission());
+    $this->assertTrue($profile->getCampaignIdPermission());
+    $this->assertTrue($profile->getCampaignRatingPermission());
+    $this->assertTrue($profile->getChannelPermission());
+    $this->assertTrue($profile->getContactNamePermission());
+    $this->assertTrue($profile->getContactEmailPermission());
+    $this->assertTrue($profile->getContentDescriptionPermission());
+    $this->assertTrue($profile->getExternalStyleIdPermission());
+    $this->assertTrue($profile->getPurchaseOrderPermission());
+    $this->assertTrue($profile->getRegionPermission());
+    $this->assertTrue($profile->getBaseDomainPermission());
+    $this->assertTrue($profile->getReferenceUrlPermission());
+
+    $this->assertIdentical($profile->getDefaultAuthorEmail(), 'test@example.com');
+    $this->assertIdentical($profile->getBusinessUnit(), 'Test Business Unit');
+    $this->assertIdentical($profile->getBusinessDivision(), 'Test Business Division');
+    $this->assertIdentical($profile->getCampaignId(), 'Campaign ID');
+    $this->assertIdentical($profile->getCampaignRating(), 5);
+    $this->assertIdentical($profile->getChannel(), 'Channel Test');
+    $this->assertIdentical($profile->getContactName(), 'Test Contact Name');
+    $this->assertIdentical($profile->getContactEmail(), 'contact@example.com');
+    $this->assertIdentical($profile->getContentDescription(), 'Content description');
+    $this->assertIdentical($profile->getExternalStyleId(), 'my-style-id');
+    $this->assertIdentical($profile->getPurchaseOrder(), 'PO32');
+    $this->assertIdentical($profile->getRegion(), 'region2');
+  }
+
+  /**
    * Asserts that a field in the current page is disabled.
    *
    * @param string $id
diff --git a/src/Tests/Form/LingotekSettingsTabIntelligenceMetadataFormTest.php b/src/Tests/Form/LingotekSettingsTabIntelligenceMetadataFormTest.php
new file mode 100644
index 0000000..af1e388
--- /dev/null
+++ b/src/Tests/Form/LingotekSettingsTabIntelligenceMetadataFormTest.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Drupal\lingotek\Tests\Form;
+
+use Drupal\lingotek\Tests\LingotekTestBase;
+
+/**
+ * Tests the Lingotek intelligence metadata settings form.
+ *
+ * @group lingotek
+ */
+class LingotekSettingsTabIntelligenceMetadataFormTest extends LingotekTestBase {
+
+  use IntelligenceMetadataFormTestTrait;
+
+  /**
+   * Test intelligence metadata is saved.
+   */
+  public function testIntelligenceMetadataIsSaved() {
+    $this->drupalGet('admin/lingotek/settings');
+
+    $this->assertRaw('<summary role="button" aria-controls="edit-intelligence-metadata" aria-expanded="false" aria-pressed="false">Lingotek Intelligence Metadata</summary>',
+      'Lingotek Intelligence Metadata tab is present.');
+
+    // Assert defaults are correct.
+    $this->assertIntelligenceFieldDefaults();
+
+    // Check we can store the values.
+    $edit = [
+      'intelligence_metadata[use_author]' => 1,
+      'intelligence_metadata[use_author_email]' => 1,
+      'intelligence_metadata[use_contact_email_for_author]' => FALSE,
+      'intelligence_metadata[use_business_unit]' => 1,
+      'intelligence_metadata[use_business_division]' => 1,
+      'intelligence_metadata[use_campaign_id]' => 1,
+      'intelligence_metadata[use_campaign_rating]' => 1,
+      'intelligence_metadata[use_channel]' => 1,
+      'intelligence_metadata[use_contact_name]' => 1,
+      'intelligence_metadata[use_contact_email]' => 1,
+      'intelligence_metadata[use_content_description]' => 1,
+      'intelligence_metadata[use_external_style_id]' => 1,
+      'intelligence_metadata[use_purchase_order]' => 1,
+      'intelligence_metadata[use_region]' => 1,
+      'intelligence_metadata[use_base_domain]' => 1,
+      'intelligence_metadata[use_reference_url]' => 1,
+      'intelligence_metadata[default_author_email]' => 'test@example.com',
+      'intelligence_metadata[business_unit]' => 'Test Business Unit',
+      'intelligence_metadata[business_division]' => 'Test Business Division',
+      'intelligence_metadata[campaign_id]' => 'Campaign ID',
+      'intelligence_metadata[campaign_rating]' => 5,
+      'intelligence_metadata[channel]' => 'Channel Test',
+      'intelligence_metadata[contact_name]' => 'Test Contact Name',
+      'intelligence_metadata[contact_email]' => 'contact@example.com',
+      'intelligence_metadata[content_description]' => 'Content description',
+      'intelligence_metadata[external_style_id]' => 'my-style-id',
+      'intelligence_metadata[purchase_order]' => 'PO32',
+      'intelligence_metadata[region]' => 'region2',
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save Lingotek Intelligence Metadata', [], [], 'lingotekintelligence-metadata-form');
+
+    $this->assertText('Lingotek Intelligence Metadata saved correctly.');
+
+    // The values shown are correct.
+    $this->assertNoFieldChecked('edit-intelligence-metadata-use-contact-email-for-author');
+    $this->assertFieldByName('intelligence_metadata[default_author_email]', 'test@example.com');
+    $this->assertFieldByName('intelligence_metadata[business_unit]', 'Test Business Unit');
+    $this->assertFieldByName('intelligence_metadata[business_division]', 'Test Business Division');
+    $this->assertFieldByName('intelligence_metadata[campaign_id]', 'Campaign ID');
+    $this->assertFieldByName('intelligence_metadata[campaign_rating]', 5);
+    $this->assertFieldByName('intelligence_metadata[channel]', 'Channel Test');
+    $this->assertFieldByName('intelligence_metadata[contact_name]', 'Test Contact Name');
+    $this->assertFieldByName('intelligence_metadata[contact_email]', 'contact@example.com');
+    $this->assertFieldByName('intelligence_metadata[content_description]', 'Content description');
+    $this->assertFieldByName('intelligence_metadata[external_style_id]', 'my-style-id');
+    $this->assertFieldByName('intelligence_metadata[purchase_order]', 'PO32');
+    $this->assertFieldByName('intelligence_metadata[region]', 'region2');
+
+    /** @var \Drupal\lingotek\LingotekIntelligenceMetadataInterface $intelligence */
+    $intelligence = \Drupal::service('lingotek.intelligence');
+    $this->assertTrue($intelligence->getAuthorPermission());
+    $this->assertTrue($intelligence->getAuthorEmailPermission());
+    $this->assertFalse($intelligence->getContactEmailForAuthorPermission());
+    $this->assertTrue($intelligence->getBusinessUnitPermission());
+    $this->assertTrue($intelligence->getBusinessDivisionPermission());
+    $this->assertTrue($intelligence->getCampaignIdPermission());
+    $this->assertTrue($intelligence->getCampaignRatingPermission());
+    $this->assertTrue($intelligence->getChannelPermission());
+    $this->assertTrue($intelligence->getContactNamePermission());
+    $this->assertTrue($intelligence->getContactEmailPermission());
+    $this->assertTrue($intelligence->getContentDescriptionPermission());
+    $this->assertTrue($intelligence->getExternalStyleIdPermission());
+    $this->assertTrue($intelligence->getPurchaseOrderPermission());
+    $this->assertTrue($intelligence->getRegionPermission());
+    $this->assertTrue($intelligence->getBaseDomainPermission());
+    $this->assertTrue($intelligence->getReferenceUrlPermission());
+
+    $this->assertIdentical($intelligence->getDefaultAuthorEmail(), 'test@example.com');
+    $this->assertIdentical($intelligence->getBusinessUnit(), 'Test Business Unit');
+    $this->assertIdentical($intelligence->getBusinessDivision(), 'Test Business Division');
+    $this->assertIdentical($intelligence->getCampaignId(), 'Campaign ID');
+    $this->assertIdentical($intelligence->getCampaignRating(), 5);
+    $this->assertIdentical($intelligence->getChannel(), 'Channel Test');
+    $this->assertIdentical($intelligence->getContactName(), 'Test Contact Name');
+    $this->assertIdentical($intelligence->getContactEmail(), 'contact@example.com');
+    $this->assertIdentical($intelligence->getContentDescription(), 'Content description');
+    $this->assertIdentical($intelligence->getExternalStyleId(), 'my-style-id');
+    $this->assertIdentical($intelligence->getPurchaseOrder(), 'PO32');
+    $this->assertIdentical($intelligence->getRegion(), 'region2');
+  }
+
+}
diff --git a/src/Tests/LingotekIntelligenceMetadataTranslationTest.php b/src/Tests/LingotekIntelligenceMetadataTranslationTest.php
new file mode 100644
index 0000000..b11c2e1
--- /dev/null
+++ b/src/Tests/LingotekIntelligenceMetadataTranslationTest.php
@@ -0,0 +1,465 @@
+<?php
+
+namespace Drupal\lingotek\Tests;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\language\Entity\ContentLanguageSettings;
+use Drupal\lingotek\Tests\Form\IntelligenceMetadataFormTestTrait;
+use Drupal\node\Entity\Node;
+
+/**
+ * Tests if intelligence metadata is used when uploading and updating content.
+ *
+ * @group lingotek
+ */
+class LingotekIntelligenceMetadataTranslationTest extends LingotekTestBase {
+
+  use IntelligenceMetadataFormTestTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['block', 'node'];
+
+  /**
+   * @var \Drupal\node\NodeInterface
+   */
+  protected $node;
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Place the actions and title block.
+    $this->drupalPlaceBlock('page_title_block', [
+      'region' => 'content',
+      'weight' => -5
+    ]);
+    $this->drupalPlaceBlock('local_tasks_block', [
+      'region' => 'content',
+      'weight' => -10
+    ]);
+
+    // Create Article node types.
+    $this->drupalCreateContentType([
+      'type' => 'article',
+      'name' => 'Article'
+    ]);
+
+
+    // Add a language.
+    ConfigurableLanguage::createFromLangcode('es')
+      ->setThirdPartySetting('lingotek', 'locale', 'es_MX')
+      ->save();
+
+    // Enable translation for the current entity type and ensure the change is
+    // picked up.
+    ContentLanguageSettings::loadByEntityTypeBundle('node', 'article')
+      ->setLanguageAlterable(TRUE)
+      ->save();
+    \Drupal::service('content_translation.manager')
+      ->setEnabled('node', 'article', TRUE);
+
+    drupal_static_reset();
+    \Drupal::entityManager()->clearCachedDefinitions();
+    \Drupal::service('entity.definition_update_manager')->applyUpdates();
+    // Rebuild the container so that the new languages are picked up by services
+    // that hold a list of languages.
+    $this->rebuildContainer();
+
+    $edit = [
+      'node[article][enabled]' => 1,
+      'node[article][profiles]' => 'automatic',
+      'node[article][fields][title]' => 1,
+      'node[article][fields][body]' => 1,
+    ];
+    $this->drupalPostForm('admin/lingotek/settings', $edit, 'Save', [], [], 'lingoteksettings-tab-content-form');
+
+  }
+
+  /**
+   * Tests that a node can be translated.
+   */
+  public function testUploadNodeWithNoSettings() {
+    $this->disableIntelligenceMetadata();
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->node = Node::load(1);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Check that only the configured fields have been uploaded.
+    $data = json_decode(\Drupal::state()
+      ->get('lingotek.uploaded_content', '[]'), TRUE);
+    $this->assertUploadedDataFieldCount($data, 2);
+    $this->assertTrue(isset($data['title'][0]['value']));
+    $this->assertEqual(1, count($data['body'][0]));
+    $this->assertTrue(isset($data['body'][0]['value']));
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // Check that the profile used was the right one.
+    $used_profile = \Drupal::state()->get('lingotek.used_profile');
+    $this->assertIdentical('automatic', $used_profile, 'The automatic profile was used.');
+
+    $this->assertEqual(4, count($data['_lingotek_metadata']));
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_revision'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_type_id'], 'node');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_document_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_type'], 'node');
+  }
+
+  public function testUploadNodeWithDefaultSettings() {
+    $domain = \Drupal::request()->getSchemeAndHttpHost();
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->node = Node::load(1);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Check that only the configured fields have been uploaded.
+    $data = json_decode(\Drupal::state()
+      ->get('lingotek.uploaded_content', '[]'), TRUE);
+    $this->assertUploadedDataFieldCount($data, 2);
+    $this->assertTrue(isset($data['title'][0]['value']));
+    $this->assertEqual(1, count($data['body'][0]));
+    $this->assertTrue(isset($data['body'][0]['value']));
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // Check that the profile used was the right one.
+    $used_profile = \Drupal::state()->get('lingotek.used_profile');
+    $this->assertIdentical('automatic', $used_profile, 'The automatic profile was used.');
+
+    $this->assertEqual(4, count($data['_lingotek_metadata']));
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_revision'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_type_id'], 'node');
+
+    $this->assertEqual(17, count($data['_lingotek_metadata']['_intelligence']));
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_document_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_type'], 'node');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['domain'], $domain);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['reference_url'], $this->node->toUrl()->setAbsolute(TRUE)->toString());
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_name'], 'admin');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_email'], 'admin@example.com');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_unit'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_division'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_id'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_rating'], 0);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['channel'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_name'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_email'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_description'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_style_id'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['purchase_order'], NULL);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['region'], NULL);
+  }
+
+  /**
+   * Tests that a node can be translated.
+   */
+  public function testUploadNodeWithGeneralSettings() {
+    $domain = \Drupal::request()->getSchemeAndHttpHost();
+
+    $this->setupGeneralIntelligenceSettings();
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->node = Node::load(1);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Check that only the configured fields have been uploaded.
+    $data = json_decode(\Drupal::state()
+      ->get('lingotek.uploaded_content', '[]'), TRUE);
+    $this->assertUploadedDataFieldCount($data, 2);
+    $this->assertTrue(isset($data['title'][0]['value']));
+    $this->assertEqual(1, count($data['body'][0]));
+    $this->assertTrue(isset($data['body'][0]['value']));
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // Check that the profile used was the right one.
+    $used_profile = \Drupal::state()->get('lingotek.used_profile');
+    $this->assertIdentical('automatic', $used_profile, 'The automatic profile was used.');
+
+    $this->assertEqual(4, count($data['_lingotek_metadata']));
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_revision'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_type_id'], 'node');
+
+    $this->assertEqual(17, count($data['_lingotek_metadata']['_intelligence']));
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_document_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_type'], 'node');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['domain'], $domain);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['reference_url'], $this->node->toUrl()->setAbsolute(TRUE)->toString());
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_name'], 'admin');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_email'], 'admin@example.com');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_unit'], 'General Business Unit');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_division'], 'General Business Division');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_id'], 'General Campaign ID');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_rating'], 3);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['channel'], 'General Channel Test');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_name'], 'General Test Contact Name');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_email'], 'general@example.com');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_description'], 'General Content description');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_style_id'], 'general-my-style-id');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['purchase_order'], 'General PO32');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['region'], 'region2');
+  }
+
+  public function testUploadNodeWithContactEmailAsAuthorSetting() {
+    $domain = \Drupal::request()->getSchemeAndHttpHost();
+
+    $this->setupGeneralIntelligenceSettings();
+    $this->setupContactEmailForAuthorIntelligenceSettings();
+
+    // Create a node.
+    $edit = [];
+    $edit['title[0][value]'] = 'Llamas are cool';
+    $edit['body[0][value]'] = 'Llamas are very cool';
+    $edit['langcode[0][value]'] = 'en';
+
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->node = Node::load(1);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Check that only the configured fields have been uploaded.
+    $data = json_decode(\Drupal::state()
+      ->get('lingotek.uploaded_content', '[]'), TRUE);
+    $this->assertUploadedDataFieldCount($data, 2);
+    $this->assertTrue(isset($data['title'][0]['value']));
+    $this->assertEqual(1, count($data['body'][0]));
+    $this->assertTrue(isset($data['body'][0]['value']));
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // Check that the profile used was the right one.
+    $used_profile = \Drupal::state()->get('lingotek.used_profile');
+    $this->assertIdentical('automatic', $used_profile, 'The automatic profile was used.');
+
+    $this->assertEqual(4, count($data['_lingotek_metadata']));
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_revision'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_type_id'], 'node');
+
+    $this->assertEqual(17, count($data['_lingotek_metadata']['_intelligence']));
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_document_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_type'], 'node');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['domain'], $domain);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['reference_url'], $this->node->toUrl()->setAbsolute(TRUE)->toString());
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_name'], 'admin');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_email'], 'general@example.com');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_unit'], 'General Business Unit');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_division'], 'General Business Division');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_id'], 'General Campaign ID');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_rating'], 3);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['channel'], 'General Channel Test');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_name'], 'General Test Contact Name');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_email'], 'general@example.com');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_description'], 'General Content description');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_style_id'], 'general-my-style-id');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['purchase_order'], 'General PO32');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['region'], 'region2');
+  }
+
+
+  public function testUploadNodeWithProfileOverride() {
+    $domain = \Drupal::request()->getSchemeAndHttpHost();
+
+    $this->setupIntelligenceProfileSettings();
+    $this->setupGeneralIntelligenceSettings();
+
+    // 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'] = 'intelligent_profile';
+
+    $this->saveAndPublishNodeForm($edit);
+
+    $this->node = Node::load(1);
+
+    // Check that the translate tab is in the node.
+    $this->drupalGet('node/1');
+    $this->clickLink('Translate');
+
+    // Check that only the configured fields have been uploaded.
+    $data = json_decode(\Drupal::state()
+      ->get('lingotek.uploaded_content', '[]'), TRUE);
+    $this->assertUploadedDataFieldCount($data, 2);
+    $this->assertTrue(isset($data['title'][0]['value']));
+    $this->assertEqual(1, count($data['body'][0]));
+    $this->assertTrue(isset($data['body'][0]['value']));
+    $this->assertIdentical('en_US', \Drupal::state()
+      ->get('lingotek.uploaded_locale'));
+
+    // Check that the profile used was the right one.
+    $used_profile = \Drupal::state()->get('lingotek.used_profile');
+    $this->assertIdentical('intelligent_profile', $used_profile, 'The Intelligent Profile profile was used.');
+
+    $this->assertEqual(4, count($data['_lingotek_metadata']));
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_revision'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_entity_type_id'], 'node');
+
+    $this->assertEqual(17, count($data['_lingotek_metadata']['_intelligence']));
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_document_id'], '1');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_type'], 'node');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['domain'], $domain);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['reference_url'], $this->node->toUrl()->setAbsolute(TRUE)->toString());
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_name'], 'admin');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['author_email'], 'admin@example.com');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_unit'], 'Profile Business Unit');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['business_division'], 'Profile Business Division');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_id'], 'Profile Campaign ID');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['campaign_rating'], 4);
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['channel'], 'Profile Channel Test');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_name'], 'Profile Test Contact Name');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['contact_email'], 'profile@example.com');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['content_description'], 'Profile Content description');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['external_style_id'], 'profile-my-style-id');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['purchase_order'], 'Profile PO42');
+    $this->assertIdentical($data['_lingotek_metadata']['_intelligence']['region'], 'region2');
+  }
+
+  protected function disableIntelligenceMetadata() {
+    // Check we can store the values.
+    $edit = [
+      'intelligence_metadata[use_author]' => FALSE,
+      'intelligence_metadata[use_author_email]' => FALSE,
+      'intelligence_metadata[use_contact_email_for_author]' => FALSE,
+      'intelligence_metadata[use_business_unit]' => FALSE,
+      'intelligence_metadata[use_business_division]' => FALSE,
+      'intelligence_metadata[use_campaign_id]' => FALSE,
+      'intelligence_metadata[use_campaign_rating]' => FALSE,
+      'intelligence_metadata[use_channel]' => FALSE,
+      'intelligence_metadata[use_contact_name]' => FALSE,
+      'intelligence_metadata[use_contact_email]' => FALSE,
+      'intelligence_metadata[use_content_description]' => FALSE,
+      'intelligence_metadata[use_external_style_id]' => FALSE,
+      'intelligence_metadata[use_purchase_order]' => FALSE,
+      'intelligence_metadata[use_region]' => FALSE,
+      'intelligence_metadata[use_base_domain]' => FALSE,
+      'intelligence_metadata[use_reference_url]' => FALSE,
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save Lingotek Intelligence Metadata', [], [], 'lingotekintelligence-metadata-form');
+  }
+
+  protected function setupIntelligenceProfileSettings() {
+    $this->drupalGet('admin/lingotek/settings');
+    $this->clickLink(t('Add new Translation Profile'));
+
+    $edit = [
+      'id' => 'intelligent_profile',
+      'label' => 'Intelligent Profile',
+      'auto_upload' => 1,
+      'auto_download' => 1,
+      'intelligence_metadata_overrides[override]' => 1,
+      'intelligence_metadata[use_author]' => 1,
+      'intelligence_metadata[use_author_email]' => 1,
+      'intelligence_metadata[use_contact_email_for_author]' => FALSE,
+      'intelligence_metadata[use_business_unit]' => 1,
+      'intelligence_metadata[use_business_division]' => 1,
+      'intelligence_metadata[use_campaign_id]' => 1,
+      'intelligence_metadata[use_campaign_rating]' => 1,
+      'intelligence_metadata[use_channel]' => 1,
+      'intelligence_metadata[use_contact_name]' => 1,
+      'intelligence_metadata[use_contact_email]' => 1,
+      'intelligence_metadata[use_content_description]' => 1,
+      'intelligence_metadata[use_external_style_id]' => 1,
+      'intelligence_metadata[use_purchase_order]' => 1,
+      'intelligence_metadata[use_region]' => 1,
+      'intelligence_metadata[use_base_domain]' => 1,
+      'intelligence_metadata[use_reference_url]' => 1,
+      'intelligence_metadata[default_author_email]' => 'test@example.com',
+      'intelligence_metadata[business_unit]' => 'Profile Business Unit',
+      'intelligence_metadata[business_division]' => 'Profile Business Division',
+      'intelligence_metadata[campaign_id]' => 'Profile Campaign ID',
+      'intelligence_metadata[campaign_rating]' => 4,
+      'intelligence_metadata[channel]' => 'Profile Channel Test',
+      'intelligence_metadata[contact_name]' => 'Profile Test Contact Name',
+      'intelligence_metadata[contact_email]' => 'profile@example.com',
+      'intelligence_metadata[content_description]' => 'Profile Content description',
+      'intelligence_metadata[external_style_id]' => 'profile-my-style-id',
+      'intelligence_metadata[purchase_order]' => 'Profile PO42',
+      'intelligence_metadata[region]' => 'region2',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+
+  }
+
+  protected function setupGeneralIntelligenceSettings() {
+    $edit = [
+      'intelligence_metadata[use_author]' => 1,
+      'intelligence_metadata[use_author_email]' => 1,
+      'intelligence_metadata[use_contact_email_for_author]' => FALSE,
+      'intelligence_metadata[use_business_unit]' => 1,
+      'intelligence_metadata[use_business_division]' => 1,
+      'intelligence_metadata[use_campaign_id]' => 1,
+      'intelligence_metadata[use_campaign_rating]' => 1,
+      'intelligence_metadata[use_channel]' => 1,
+      'intelligence_metadata[use_contact_name]' => 1,
+      'intelligence_metadata[use_contact_email]' => 1,
+      'intelligence_metadata[use_content_description]' => 1,
+      'intelligence_metadata[use_external_style_id]' => 1,
+      'intelligence_metadata[use_purchase_order]' => 1,
+      'intelligence_metadata[use_region]' => 1,
+      'intelligence_metadata[use_base_domain]' => 1,
+      'intelligence_metadata[use_reference_url]' => 1,
+      'intelligence_metadata[default_author_email]' => 'test@example.com',
+      'intelligence_metadata[business_unit]' => 'General Business Unit',
+      'intelligence_metadata[business_division]' => 'General Business Division',
+      'intelligence_metadata[campaign_id]' => 'General Campaign ID',
+      'intelligence_metadata[campaign_rating]' => 3,
+      'intelligence_metadata[channel]' => 'General Channel Test',
+      'intelligence_metadata[contact_name]' => 'General Test Contact Name',
+      'intelligence_metadata[contact_email]' => 'general@example.com',
+      'intelligence_metadata[content_description]' => 'General Content description',
+      'intelligence_metadata[external_style_id]' => 'general-my-style-id',
+      'intelligence_metadata[purchase_order]' => 'General PO32',
+      'intelligence_metadata[region]' => 'region2',
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save Lingotek Intelligence Metadata', [], [], 'lingotekintelligence-metadata-form');
+  }
+
+  protected function setupContactEmailForAuthorIntelligenceSettings() {
+    $edit = [
+      'intelligence_metadata[use_contact_email_for_author]' => TRUE,
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save Lingotek Intelligence Metadata', [], [], 'lingotekintelligence-metadata-form');
+  }
+
+}
diff --git a/src/Tests/Update/LingotekIntelligenceMetadataUpdate8204Test.php b/src/Tests/Update/LingotekIntelligenceMetadataUpdate8204Test.php
new file mode 100644
index 0000000..31120fc
--- /dev/null
+++ b/src/Tests/Update/LingotekIntelligenceMetadataUpdate8204Test.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\lingotek\Tests\Update;
+
+use Drupal\system\Tests\Update\UpdatePathTestBase;
+
+/**
+ * Tests the upgrade path for updating the module weight.
+ *
+ * @group lingotek
+ */
+class LingotekIntelligenceMetadataUpdate8204Test extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../tests/fixtures/update/drupal-8.lingotek.standard.pre8201.php.gz',
+    ];
+  }
+
+  /**
+   * Tests that the module weight update is executed correctly.
+   */
+  public function testIntelligenceMetadataUpdate() {
+    $this->runUpdates();
+
+    $config_factory = \Drupal::configFactory();
+    $config = $config_factory->getEditable('lingotek.settings');
+
+    $this->assertNull($config->get('intelligence.business_unit'), 'Business Unit is set to null');
+    $this->assertNull($config->get('intelligence.business_division'), 'Business Division is set to null');
+    $this->assertNull($config->get('intelligence.campaign_id'), 'Campaign ID is set to null');
+    $this->assertIdentical(0, $config->get('intelligence.campaign_rating'), 'Campaign Rating is set to 0');
+    $this->assertNull($config->get('intelligence.channel'), 'Channel is set to null');
+    $this->assertNull($config->get('intelligence.contact_name'), 'Contact Name is set to null');
+    $this->assertNull($config->get('intelligence.contact_email'), 'Contact Email is set to null');
+    $this->assertNull($config->get('intelligence.content_description'), 'Content Description is set to null');
+    $this->assertNull($config->get('intelligence.external_style_id'), 'External Style ID is set to null');
+    $this->assertNull($config->get('intelligence.purchase_order'), 'Purchase Order is set to null');
+    $this->assertNull($config->get('intelligence.region'), 'Region is set to null');
+    $this->assertTrue($config->get('intelligence.use_author'), 'Use Author Permission is set to true');
+    $this->assertNull($config->get('intelligence.default_author_email'), 'Default Author Email is set to null');
+    $this->assertTrue($config->get('intelligence.use_author_email'), 'Use Author Email Permission is set to true');
+    $this->assertFalse($config->get('intelligence.use_contact_email_for_author'), 'Use Contact Author for Author Permission is set to false');
+    $this->assertTrue($config->get('intelligence.use_business_unit'), 'Use Business Unit Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_business_division'), 'Use Business Division Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_campaign_id'), 'Use Campaign ID Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_campaign_rating'), 'Use Campaign Rating Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_channel'), 'Use Channel Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_contact_name'), 'Use Contact Name Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_contact_email'), 'Use Contact Email Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_content_description'), 'Use Content Description Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_external_style_id'), 'Use External Style ID Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_purchase_order'), 'Use Purchase Order Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_region'), 'Use Region Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_base_domain'), 'Use Base Domain Permission is set to true');
+    $this->assertTrue($config->get('intelligence.use_reference_url'), 'Use Reference URL Permission is set to true');
+  }
+
+}
diff --git a/tests/modules/lingotek_test/src/LingotekFake.php b/tests/modules/lingotek_test/src/LingotekFake.php
index d58229b..a0c773a 100644
--- a/tests/modules/lingotek_test/src/LingotekFake.php
+++ b/tests/modules/lingotek_test/src/LingotekFake.php
@@ -160,6 +160,10 @@ class LingotekFake implements LingotekInterface {
     if (\Drupal::state()->get('lingotek.must_error_in_upload', FALSE)) {
       throw new LingotekApiException();
     }
+    if (is_array($content)) {
+      $content = json_encode($content);
+    }
+
     // If the upload is successful, we must return a valid hash.
     \Drupal::state()->set('lingotek.uploaded_title', $title);
     \Drupal::state()->set('lingotek.uploaded_content', $content);
@@ -188,6 +192,9 @@ class LingotekFake implements LingotekInterface {
     if (\Drupal::state()->get('lingotek.must_error_in_upload', FALSE)) {
       throw new LingotekApiException();
     }
+    if (is_array($content)) {
+      $content = json_encode($content);
+    }
 
     \Drupal::state()->set('lingotek.uploaded_content', $content);
     \Drupal::state()->set('lingotek.uploaded_content_url', $url);
diff --git a/tests/src/Unit/LingotekUnitTest.php b/tests/src/Unit/LingotekUnitTest.php
index a8e09ac..50bd7a9 100644
--- a/tests/src/Unit/LingotekUnitTest.php
+++ b/tests/src/Unit/LingotekUnitTest.php
@@ -272,56 +272,62 @@ class LingotekUnitTest extends UnitTestCase {
     // Vault id has the original value.
     $this->api->expects($this->at(0))
       ->method('addDocument')
-      ->with(['title' => 'title', 'content' => 'content', 'locale_code' => 'es',
+      ->with(['title' => 'title', 'content' => '"content"', 'locale_code' => 'es',
               'format' => 'JSON', 'project_id' => 'my_test_project',
               'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
               'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
-              'vault_id' => 'my_test_vault']);
+              'vault_id' => 'my_test_vault',
+              'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0']);
 
     // Vault id has changed.
     $this->api->expects($this->at(1))
       ->method('addDocument')
-      ->with(['title' => 'title', 'content' => 'content', 'locale_code' => 'es',
+      ->with(['title' => 'title', 'content' => '"content"', 'locale_code' => 'es',
               'format' => 'JSON', 'project_id' => 'another_test_project',
               'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
               'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
-              'vault_id' => 'another_test_vault']);
+              'vault_id' => 'another_test_vault',
+              'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0']);
 
     // If there is a profile with default vault, it must be replaced.
     $this->api->expects($this->at(2))
       ->method('addDocument')
-      ->with(['title' => 'title', 'content' => 'content', 'locale_code' => 'es',
+      ->with(['title' => 'title', 'content' => '"content"', 'locale_code' => 'es',
               'format' => 'JSON', 'project_id' => 'default_project',
               'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
               'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
-              'vault_id' => 'default_vault']);
+              'vault_id' => 'default_vault',
+              'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0']);
 
     // If there is no profile, vault should not be included.
     $this->api->expects($this->at(3))
       ->method('addDocument')
-      ->with(['title' => 'title', 'content' => 'content', 'locale_code' => 'es',
+      ->with(['title' => 'title', 'content' => '"content"', 'locale_code' => 'es',
               'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
               'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
               'format' => 'JSON', 'project_id' => 'default_project',
+              'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0'
              ]);
 
     // If there is an url, it should be included.
     $this->api->expects($this->at(4))
       ->method('addDocument')
-      ->with(['title' => 'title', 'content' => 'content', 'locale_code' => 'es',
+      ->with(['title' => 'title', 'content' => '"content"', 'locale_code' => 'es',
         'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
         'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
-        'format' => 'JSON', 'project_id' => 'default_project', 'external_url' => 'http://example.com/node/1'
+        'format' => 'JSON', 'project_id' => 'default_project', 'external_url' => 'http://example.com/node/1',
+        'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0'
       ]);
 
     // If there is a profile using the project default workflow template vault,
     // vault should not be specified.
     $this->api->expects($this->at(5))
       ->method('addDocument')
-      ->with(['title' => 'title', 'content' => 'content', 'locale_code' => 'es',
+      ->with(['title' => 'title', 'content' => '"content"', 'locale_code' => 'es',
         'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
         'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
         'format' => 'JSON', 'project_id' => 'default_project',
+        'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0'
       ]);
 
 
@@ -370,9 +376,10 @@ class LingotekUnitTest extends UnitTestCase {
     $this->api->expects($this->at(0))
       ->method('patchDocument')
       ->with('my_doc_id', [
-        'format' => 'JSON', 'content' => 'content',
+        'format' => 'JSON', 'content' => '"content"',
         'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
         'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
+        'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0'
       ])
       ->will($this->returnValue($response));
 
@@ -380,9 +387,10 @@ class LingotekUnitTest extends UnitTestCase {
     $this->api->expects($this->at(1))
       ->method('patchDocument')
       ->with('my_doc_id', [
-        'format' => 'JSON', 'content' => 'content', 'external_url' => 'http://example.com/node/1',
+        'format' => 'JSON', 'content' => '"content"', 'external_url' => 'http://example.com/node/1',
         'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
         'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
+        'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0'
       ])
       ->will($this->returnValue($response));
 
@@ -390,9 +398,10 @@ class LingotekUnitTest extends UnitTestCase {
     $this->api->expects($this->at(2))
       ->method('patchDocument')
       ->with('my_doc_id', [
-        'format' => 'JSON', 'content' => 'content', 'title' => 'title',
+        'format' => 'JSON', 'content' => '"content"', 'title' => 'title',
         'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
         'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
+        'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0'
       ])
       ->will($this->returnValue($response));
 
@@ -400,9 +409,10 @@ class LingotekUnitTest extends UnitTestCase {
     $this->api->expects($this->at(3))
       ->method('patchDocument')
       ->with('my_doc_id', [
-        'format' => 'JSON', 'content' => 'content', 'external_url' => 'http://example.com/node/1', 'title' => 'title',
+        'format' => 'JSON', 'content' => '"content"', 'external_url' => 'http://example.com/node/1', 'title' => 'title',
         'fprm_subfilter_id' => '0e79f34d-f27b-4a0c-880e-cd9181a5d265',
         'fprm_id' => '4f91482b-5aa1-4a4a-a43f-712af7b39625',
+        'external_application_id' => 'e39e24c7-6c69-4126-946d-cf8fbff38ef0'
       ])
       ->will($this->returnValue($response));
 
