diff --git a/src/Controller/ViewUsageController.php b/src/Controller/ViewUsageController.php
index 07cf240..30ea9ab 100644
--- a/src/Controller/ViewUsageController.php
+++ b/src/Controller/ViewUsageController.php
@@ -80,13 +80,16 @@ class ViewUsageController extends ControllerBase {
     $flat_data = $data_service->flatten($data);
     $data_item_key = str_replace('|', '][', $tmgmt_memory_usage->getDataItemKey());
     if ($langcode == $target_langcode) {
-      $segments = $segmenter->getSegmentsOfData($segmenter->segmentData($flat_data[$data_item_key]['#translation']['#text']));
+      $unflattened_field = $data_service->unflatten([$data_item_key => $flat_data[$data_item_key]]);
+      $segmented_data = $data_service->flatten($segmenter->getSegmentedData($unflattened_field));
+      $segmented_text = $segmented_data[$data_item_key]['#translation']['#segmented_text'];
     }
     else {
-      $segments = $segmenter->getSegmentsOfData($flat_data[$data_item_key]['#segmented_text']);
+      $segmented_text = $flat_data[$data_item_key]['#segmented_text'];
     }
+    $segments = $segmenter->getSegmentsOfData($segmented_text);
 
-    $page['#segment'] = $segments[$tmgmt_memory_usage->getSegmentDelta()];
+    $page['#segment'] = $segments[$tmgmt_memory_usage->getSegmentDelta()]['data'];
     $page['#attached']['library'][] = 'tmgmt_memory/admin';
     $page['#post_render'][] = [$this, 'postRender'];
 
diff --git a/src/Form/ImportForm.php b/src/Form/ImportForm.php
index 7edfa2f..806d4d5 100644
--- a/src/Form/ImportForm.php
+++ b/src/Form/ImportForm.php
@@ -56,8 +56,6 @@ class ImportForm extends FormBase {
   public function submitForm(array &$form, FormStateInterface $form_state) {
     /** @var \Drupal\tmgmt_memory\MemoryManager $memory_manager */
     $memory_manager = \Drupal::service('tmgmt_memory.memory_manager');
-    /** @var \Drupal\tmgmt_memory\Segmenter $segmenter */
-    $segmenter = \Drupal::service('tmgmt.segmenter');
     $supported_formats = ['tmx'];
     $translations = [];
     $sources = [];
@@ -84,23 +82,21 @@ class ImportForm extends FormBase {
                   $translations[$target_langcode]['quality'] = $tuv_child->nodeValue;
                 }
                 elseif ($tuv_child->nodeName == 'seg') {
-                  $target_data = $tuv_child->nodeValue;
-                  $segmented_data = $segmenter->segmentData($target_data);
-                  $translations[$target_langcode]['values'] = $segmenter->getSegmentsOfData($segmented_data);
+                  $target_data = html_entity_decode($tuv_child->nodeValue);
+                  $translations[$target_langcode]['values'][$segment_id] = $target_data;
                 }
               }
             }
             else {
-              $source_data = $child->nodeValue;
-              $segmented_data = $segmenter->segmentData($source_data);
-              $sources = $segmenter->getSegmentsOfData($segmented_data);
+              $source_data = html_entity_decode($child->nodeValue);
+              $sources[$segment_id] = $source_data;
             }
           }
           elseif ($child->nodeName == 'prop') {
             if ($child->getAttribute('type') == 'data-key') {
               $data_key = $child->nodeValue;
             }
-            if ($child->getAttribute('type') == 'segment') {
+            if ($child->getAttribute('type') == 'segment-id') {
               $segment_id = $child->nodeValue;
             }
           }
diff --git a/src/MemoryManager.php b/src/MemoryManager.php
index a94a4ac..d982353 100644
--- a/src/MemoryManager.php
+++ b/src/MemoryManager.php
@@ -315,12 +315,11 @@ class MemoryManager {
     $segmenter = \Drupal::service('tmgmt.segmenter');
     /** @var \Drupal\tmgmt_memory\UsageTranslationStorageInterface $usage_translation_storage */
     $usage_translation_storage = \Drupal::entityTypeManager()->getStorage('tmgmt_memory_usage_translation');
-    $segmented_item = $segmenter->segmentData($data_item);
-    if ($segmented_item) {
-      $segments = $segmenter->getSegmentsOfData($segmented_item);
+    if ($data_item['#segmented_text']) {
+      $segments = $segmenter->getSegmentsOfData($data_item['#segmented_text']);
       $translated_segments = [];
       foreach ($segments as $segment) {
-        $entity = $usage_translation_storage->loadBestMatchByLanguageAndData($source_language, $segment, $target_language);
+        $entity = $usage_translation_storage->loadBestMatchByLanguageAndData($source_language, $segment['data'], $target_language);
         if (!isset($entity)) {
           return NULL;
         }
diff --git a/src/Segmenter.php b/src/Segmenter.php
index 783e63f..c583795 100644
--- a/src/Segmenter.php
+++ b/src/Segmenter.php
@@ -4,6 +4,8 @@ namespace Drupal\tmgmt_memory;
 
 use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\tmgmt\JobItemInterface;
 use Drupal\tmgmt\SegmenterInterface;
 
 /**
@@ -12,9 +14,20 @@ use Drupal\tmgmt\SegmenterInterface;
 class Segmenter implements SegmenterInterface {
 
   /**
-   * {@inheritdoc}
+   * Add the "tmgmt-segment" tags to each paragraph or division/section.
+   *
+   * This function will return the same data adding the "tmgmt-segment"
+   * XML Element with an attribute "id" that will identify the segment.
+   * This XML Element will be added as the parent element of each paragraph
+   * "<p>" or division/section "<div>".
+   *
+   * @param string $data
+   *   The data to segment.
+   *
+   * @return string
+   *   A string with the data with the tags added.
    */
-  public function segmentData($data) {
+  protected function segmentData($data) {
     $dom = Html::load('<tmgmt-root>' . $data . '</tmgmt-root>');
     $id = 1;
     $root = $dom->getElementsByTagName('tmgmt-root');
@@ -81,12 +94,12 @@ class Segmenter implements SegmenterInterface {
    *   The DOMDocument.
    * @param \DOMNodeList $nodes
    *   The nodes where add the tag.
-   * @param int &$id
+   * @param int &$delta
    *   The id of the first segment.
    */
-  private function addTagToNodes(\DOMDocument $dom, \DOMNodeList $nodes, &$id) {
+  private function addTagToNodes(\DOMDocument $dom, \DOMNodeList $nodes, &$delta) {
     for ($i = 0; $i < $nodes->length; $i++) {
-      $this->addTagToNode($dom, $nodes->item($i), $id);
+      $this->addTagToNode($dom, $nodes->item($i), $delta);
     }
   }
 
@@ -97,15 +110,15 @@ class Segmenter implements SegmenterInterface {
    *   The DOMDocument.
    * @param \DOMNode $node
    *   The nodes where add the tag.
-   * @param int &$id
+   * @param int &$delta
    *   The id of the first segment.
    */
-  private function addTagToNode(\DOMDocument $dom, \DOMNode $node, &$id) {
+  private function addTagToNode(\DOMDocument $dom, \DOMNode $node, &$delta) {
     $parent = $node->parentNode;
     $new_node = $dom->createElement('tmgmt-segment');
-    $new_node->setAttribute('id', $id);
+    $new_node->setAttribute('id', $delta);
     $new_node->appendChild($node->cloneNode(TRUE));
-    $id++;
+    $delta++;
     $parent->replaceChild($new_node, $node);
   }
 
@@ -166,8 +179,8 @@ class Segmenter implements SegmenterInterface {
   /**
    * {@inheritdoc}
    */
-  public function getSegmentsOfData($data) {
-    $dom = Html::load($data);
+  public function getSegmentsOfData($serialized_data) {
+    $dom = Html::load($serialized_data);
     $nodes = $dom->getElementsByTagName('tmgmt-segment');
     $segments = [];
     for ($i = 0; $i < $nodes->length; $i++) {
@@ -183,7 +196,11 @@ class Segmenter implements SegmenterInterface {
         $parent = $item->parentNode;
         $parent->removeChild($item);
       }
-      $segments[$node->attributes->getNamedItem('id')->nodeValue] = $newdoc->saveXML($newdoc->firstChild);
+      $segments[$node->attributes->getNamedItem('id')->nodeValue] = [
+        'hash' => hash('sha256', $newdoc->saveXML($newdoc->firstChild)),
+        'id' => $node->attributes->getNamedItem('id')->nodeValue,
+        'data' => $newdoc->saveXML($newdoc->firstChild),
+      ];
     }
     return $segments;
   }
@@ -192,17 +209,25 @@ class Segmenter implements SegmenterInterface {
    * {@inheritdoc}
    */
   public function getSegmentedData($data) {
-    /** @var \Drupal\tmgmt\SegmenterInterface $segmenter */
-    $segmenter = \Drupal::service('tmgmt.segmenter');
     /** @var \Drupal\tmgmt\Data $data_service */
     $data_service = \Drupal::service('tmgmt.data');
     $fields = $data_service->flatten($data);
     foreach ($fields as $key => $field) {
-      if (isset($field['#translate'])) {
+      if (isset($field['#translate']) && $field['#translate']) {
+        $segmented_text = NULL;
         if (!isset($field['#segmented_text'])) {
-          $segmented_data = $segmenter->segmentData($field['#text']);
-          if ($segmented_data) {
-            $field['#segmented_text'] = $segmented_data;
+          $segmented_text = $this->segmentData($field['#text']);
+          if ($segmented_text) {
+            $field['#segmented_text'] = $segmented_text;
+          }
+        }
+        else {
+          $segmented_text = $field['#segmented_text'];
+        }
+        if ($segmented_text && isset($field['#translation'])) {
+          $segmented_text = $this->segmentData($field['#translation']['#text']);
+          if ($segmented_text) {
+            $field['#translation']['#segmented_text'] = $segmented_text;
           }
         }
         NestedArray::setValue($data, \Drupal::service('tmgmt.data')
@@ -212,4 +237,28 @@ class Segmenter implements SegmenterInterface {
     return $data;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function validateFormTranslation(FormStateInterface &$form_state, $element, JobItemInterface $job_item) {
+    if (isset($element['value'])) {
+      $translation_text = $element['value']['#value'];
+    }
+    else {
+      $translation_text = $element['#value'];
+    }
+    $translated_segmented_data = $this->segmentData($translation_text);
+    if ($translated_segmented_data) {
+      $array_key = explode('|', $element['#parents'][0]);
+      $data = $job_item->getData($array_key);
+      if (isset($data['#segmented_text'])) {
+        $segmented_data = $data['#segmented_text'];
+        $segments = $this->getSegmentsOfData($segmented_data);
+        $translated_segments = $this->getSegmentsOfData($translated_segmented_data);
+        if (count($segments) != count($translated_segments)) {
+          $form_state->setError($element, t('The translation has different amount of segments than the source text.'));
+        }
+      }
+    }
+  }
 }
diff --git a/src/Tmx.php b/src/Tmx.php
index fb9e8b0..ee4fa37 100644
--- a/src/Tmx.php
+++ b/src/Tmx.php
@@ -25,11 +25,11 @@ class Tmx extends \XMLWriter {
     /** @var \Drupal\tmgmt_memory\UsageInterface $source */
     $source = reset($usage_translations)->getSource();
     $this->startElement('tu');
-    $job_item_id = $source->getJobItemId();
-    if ($job_item_id) {
+    $job_item = $source->getJobItem();
+    if ($job_item) {
       $this->startElement('prop');
-      $this->writeAttribute('type', 'job-item-id');
-      $this->text($job_item_id);
+      $this->writeAttribute('type', 'job-item-uuid');
+      $this->text($job_item->uuid());
       $this->endElement();
     }
     $data_item_key = $source->getDataItemKey();
@@ -40,14 +40,18 @@ class Tmx extends \XMLWriter {
       $this->endElement();
     }
     $this->startElement('prop');
-    $this->writeAttribute('type', 'segment');
+    $this->writeAttribute('type', 'segment-delta');
     $this->text($source->getSegmentDelta());
     $this->endElement();
+    $this->startElement('prop');
+    $this->writeAttribute('type', 'segment-id');
+    $this->text(hash('sha256', $source->getData()));
+    $this->endElement();
 
     // Add source.
     $this->startElement('tuv');
     $this->writeAttribute('xml:lang', $source->getLangcode());
-    $this->writeElement('seg', $source->getData());
+    $this->writeElement('seg', htmlentities($source->getData()));
     $this->endElement();
 
     // Add translations.
@@ -56,11 +60,13 @@ class Tmx extends \XMLWriter {
       $target = $usage_translation->getTarget();
       $this->startElement('tuv');
       $this->writeAttribute('xml:lang', $target->getLangcode());
-      $this->startElement('prop');
-      $this->writeAttribute('type', 'quality');
-      $this->text($usage_translation->getQuality());
-      $this->endElement();
-      $this->writeElement('seg', $target->getData());
+      if ($usage_translation->getQuality()) {
+        $this->startElement('prop');
+        $this->writeAttribute('type', 'quality');
+        $this->text($usage_translation->getQuality());
+        $this->endElement();
+      }
+      $this->writeElement('seg', htmlentities($target->getData()));
       $this->endElement();
     }
 
diff --git a/src/UsageTranslationStorage.php b/src/UsageTranslationStorage.php
index 32ba55f..07ebf16 100644
--- a/src/UsageTranslationStorage.php
+++ b/src/UsageTranslationStorage.php
@@ -60,12 +60,14 @@ class UsageTranslationStorage extends SqlContentEntityStorage implements UsageTr
   /**
    * {@inheritdoc}
    */
-  public function loadMultipleBySourcesAndTargets(array $sources, array $targets = NULL) {
+  public function loadMultipleBySourcesAndTargets(array $sources = NULL, array $targets = NULL) {
     $query = \Drupal::entityQuery('tmgmt_memory_usage_translation');
-    $and = $query->andConditionGroup()
-      ->condition('source', array_map(function (&$value){
+    $and = $query->andConditionGroup();
+    if ($sources) {
+      $and->condition('source', array_map(function (&$value) {
         return $value->id();
       }, $sources), 'IN');
+    }
     if ($targets) {
       $and->condition('target', array_map(function (&$value) {
         return $value->id();
diff --git a/src/UsageTranslationStorageInterface.php b/src/UsageTranslationStorageInterface.php
index 5f67018..0d292db 100644
--- a/src/UsageTranslationStorageInterface.php
+++ b/src/UsageTranslationStorageInterface.php
@@ -47,15 +47,18 @@ interface UsageTranslationStorageInterface extends EntityStorageInterface {
   /**
    * Loads the translation using the source and target usages.
    *
+   * If no sources or targets are provided, will return all the
+   * UsageTranslations.
+   *
    * @param \Drupal\tmgmt_memory\UsageInterface[] $sources
-   *   The sources.
+   *   (Optional) The sources. If not set, will filter using just the targets.
    * @param \Drupal\tmgmt_memory\UsageInterface[] $targets
-   *   (Optional) The targets. If not set, will filter using just the source.
+   *   (Optional) The targets. If not set, will filter using just the sources.
    *
    * @return \Drupal\tmgmt_memory\UsageTranslationInterface[]
    *   An array of UsageTranslation objects. Returns an empty array if no
    *   matching entities are found.
    */
-  public function loadMultipleBySourcesAndTargets(array $sources, array $targets = NULL);
+  public function loadMultipleBySourcesAndTargets(array $sources = NULL, array $targets = NULL);
 
 }
diff --git a/tests/src/Kernel/MemoryManagerTest.php b/tests/src/Kernel/MemoryManagerTest.php
index b8b8c8f..c9fcff5 100644
--- a/tests/src/Kernel/MemoryManagerTest.php
+++ b/tests/src/Kernel/MemoryManagerTest.php
@@ -39,7 +39,7 @@ class MemoryManagerTest extends TMGMTKernelTestBase {
     $segmenter = \Drupal::service('tmgmt.segmenter');
     $segments = $segmenter->getSegmentsOfData($segmented_sample);
     $segment = reset($segments);
-    $stripped_data = strip_tags($segment);
+    $stripped_data = strip_tags($segment['data']);
     /** @var \Drupal\tmgmt_memory\MemoryManager $memory_manager */
     $memory_manager = \Drupal::service('tmgmt_memory.memory_manager');
 
@@ -119,24 +119,22 @@ class MemoryManagerTest extends TMGMTKernelTestBase {
         'deep_nesting' => [
           '#text' => '<p>First paragraph in source language.</p><p>Second paragraph in source language.</p>',
           '#label' => 'Label',
+          '#translate' => TRUE,
         ],
       ],
     ]);
     $item1 = $job1->addItem('test_source', 'test', 1);
-    $source_data = $item1->getData(['dummy', 'deep_nesting', '#text']);
-    $source_segmented_data = $segmenter->segmentData($source_data);
+    $data = $item1->getData();
+    $source_data_item = $data['dummy']['deep_nesting'];
+    $source_segmented_data = $source_data_item['#segmented_text'];
     $source_segments = $segmenter->getSegmentsOfData($source_segmented_data);
 
     // Add translation.
     $translation['dummy']['deep_nesting']['#text'] = '<p>(ca) First paragraph in target language.</p><p>(ca) Second paragraph in target language.</p>';
     $item1->addTranslatedData($translation);
-    $target_data = $item1->getData([
-      'dummy',
-      'deep_nesting',
-      '#translation',
-      '#text',
-    ]);
-    $target_segmented_data = $segmenter->segmentData($target_data);
+    $data = $segmenter->getSegmentedData($item1->getData());
+    $target_data = $data['dummy']['deep_nesting']['#translation']['#text'];
+    $target_segmented_data = $data['dummy']['deep_nesting']['#translation']['#segmented_text'];
     $target_segments = $segmenter->getSegmentsOfData($target_segmented_data);
 
     $job2 = $this->createJob('en', 'ca');
@@ -145,42 +143,38 @@ class MemoryManagerTest extends TMGMTKernelTestBase {
         'deep_nesting' => [
           '#text' => '<p>First paragraph in <span>source language</span>.</p><p>Second paragraph in <span>source language</span>.</p>',
           '#label' => 'Label',
+          '#translate' => TRUE,
         ],
       ],
     ]);
     $item2 = $job2->addItem('test_source', 'test', 1);
-    $source_data2 = $item2->getData(['dummy', 'deep_nesting', '#text']);
-    $source_segmented_data2 = $segmenter->segmentData($source_data2);
+    $data = $item2->getData();
+    $source_segmented_data2 = $data['dummy']['deep_nesting']['#segmented_text'];
     $source_segments2 = $segmenter->getSegmentsOfData($source_segmented_data2);
 
     // Add translation.
     $translation['dummy']['deep_nesting']['#text'] = '<p>(ca) First paragraph in <span>target language</span>.</p><p>(ca) Second paragraph in <span>target language</span>.</p>';
     $item2->addTranslatedData($translation);
-    $target_data2 = $item2->getData([
-      'dummy',
-      'deep_nesting',
-      '#translation',
-      '#text',
-    ]);
-    $target_segmented_data2 = $segmenter->segmentData($target_data2);
+    $data = $segmenter->getSegmentedData($item2->getData());
+    $target_segmented_data2 = $data['dummy']['deep_nesting']['#translation']['#segmented_text'];
     $target_segments2 = $segmenter->getSegmentsOfData($target_segmented_data2);
 
     foreach ($source_segments as $delta => $source_segment) {
-      $source_usage = $memory_manager->addUsage('en', $source_segment, $item1->id(), 'data_item', $delta);
-      $target_usage = $memory_manager->addUsage('ca', $target_segments[$delta], $item1->id(), 'data_item', $delta);
+      $source_usage = $memory_manager->addUsage('en', $source_segment['data'], $item1->id(), 'data_item', $delta);
+      $target_usage = $memory_manager->addUsage('ca', $target_segments[$delta]['data'], $item1->id(), 'data_item', $delta);
       $memory_manager->addUsageTranslation($source_usage, $target_usage);
-      $source_usage2 = $memory_manager->addUsage('en', $source_segments2[$delta], $item2->id(), 'data_item', $delta);
-      $target_usage2 = $memory_manager->addUsage('ca', $target_segments2[$delta], $item2->id(), 'data_item', $delta);
+      $source_usage2 = $memory_manager->addUsage('en', $source_segments2[$delta]['data'], $item2->id(), 'data_item', $delta);
+      $target_usage2 = $memory_manager->addUsage('ca', $target_segments2[$delta]['data'], $item2->id(), 'data_item', $delta);
       $memory_manager->addUsageTranslation($source_usage2, $target_usage2);
     }
 
-    $match = $memory_manager->getPerfectMatchForDataItem('en', 'ca', $source_data);
+    $match = $memory_manager->getPerfectMatchForDataItem('en', 'ca', $source_data_item);
     $this->assertEquals($target_data, $match);
 
     // Check there is just 1 register in tmgmt_segment.
     /** @var \Drupal\tmgmt_memory\SegmentStorageInterface $storage */
     $storage = \Drupal::entityTypeManager()->getStorage('tmgmt_memory_segment');
-    $segments = $storage->loadMultipleByLanguageAndData('en', strip_tags($source_segments[1]));
+    $segments = $storage->loadMultipleByLanguageAndData('en', strip_tags($source_segments[1]['data']));
     $this->assertEquals(1, count($segments));
 
     // Check this segment has 2 usages.
@@ -191,16 +185,16 @@ class MemoryManagerTest extends TMGMTKernelTestBase {
     // Add a new translation.
     $target = '<tmgmt-segment id="1"><p>A paragraph in <span>alternative translation for target language</span>.</p></tmgmt-segment><tmgmt-segment id="2"><div>nested 1<tmgmt-segment id="3"><div>nested 2<tmgmt-segment id="4"><div>nested 3</div></tmgmt-segment></div></tmgmt-segment></div></tmgmt-segment>';
     $target_segments = $segmenter->getSegmentsOfData($target);
-    $source_usage = $memory_manager->addUsage('en', $source_segments[1], $item2->id(), 'data_item', 1);
-    $target_usage = $memory_manager->addUsage('ca', $target_segments[1], $item2->id(), 'data_item', 1);
+    $source_usage = $memory_manager->addUsage('en', $source_segments[1]['data'], $item2->id(), 'data_item', 1);
+    $target_usage = $memory_manager->addUsage('ca', $target_segments[1]['data'], $item2->id(), 'data_item', 1);
     $memory_manager->addUsageTranslation($source_usage, $target_usage);
 
     // Check there is 2 registers in tmgmt_segment_translation.
-    $results = $memory_manager->getSegmentTranslations('en', strip_tags($source_segments[1]), 'ca');
+    $results = $memory_manager->getSegmentTranslations('en', strip_tags($source_segments[1]['data']), 'ca');
     $this->assertEquals(2, count($results));
 
     // Check there is 1 register in tmgmt_usage_translation.
-    $results = $memory_manager->getUsageTranslations('en', $source_segments[1], 'ca');
+    $results = $memory_manager->getUsageTranslations('en', $source_segments[1]['data'], 'ca');
     $this->assertEquals(1, count($results));
   }
 
@@ -216,8 +210,8 @@ class MemoryManagerTest extends TMGMTKernelTestBase {
     // Create a new Job.
     $job2 = $this->createJob('en', 'ca');
     $item2 = $job2->addItem('test_source', 'test', 1);
-    $source_data = $item2->getData(['dummy', 'deep_nesting', '#text']);
-    $result = $memory_manager->getPerfectMatchForDataItem('en', 'ca', $source_data);
+    $source_data_item = $item2->getData(['dummy', 'deep_nesting']);
+    $result = $memory_manager->getPerfectMatchForDataItem('en', 'ca', $source_data_item);
     $this->assertEquals($target_segments, $result);
   }
 
diff --git a/tests/src/Kernel/SegmenterTest.php b/tests/src/Kernel/SegmenterTest.php
index cc94b5c..93d8a86 100644
--- a/tests/src/Kernel/SegmenterTest.php
+++ b/tests/src/Kernel/SegmenterTest.php
@@ -27,8 +27,11 @@ class SegmenterTest extends KernelTestBase {
     /** @var \Drupal\tmgmt_memory\Segmenter $segmenter */
     $segmenter = \Drupal::service('tmgmt.segmenter');
 
-    $segmented_data = $segmenter->segmentData($sample);
-    $this->assertEquals(str_replace(PHP_EOL, '', $segmented_sample), str_replace(PHP_EOL, '', $segmented_data));
+    $segmented_data = $segmenter->getSegmentedData(['key' => [
+      '#text' => $sample,
+      '#translate' => TRUE,
+    ]]);
+    $this->assertEquals(str_replace(PHP_EOL, '', $segmented_sample), str_replace(PHP_EOL, '', $segmented_data['key']['#segmented_text']));
   }
 
   /**
@@ -50,17 +53,61 @@ class SegmenterTest extends KernelTestBase {
   public function testGetSegmentsOfData() {
     $segmented_sample = file_get_contents(drupal_get_path('module', 'tmgmt_memory') . '/tests/testing_html/segmented_sample.html');
     $expected = [
-      1 => 'Text not inside a paragraph.',
-      2 => '<p>one paragraph with special characters: äöüľščťžýáíéäňú©«®™»</p>',
-      3 => '<p>one paragraph with a <br/>break line</p>',
-      4 => '<p>one paragraph with html entities: &amp;&lt;&gt;</p>',
-      5 => '<p>and here we have some link <a href="http://example.com">break line</a></p>',
-      6 => '<p>one paragraph with an <img src="not-existing.gif" alt="not existing image" title="not existing image"/>image</p>',
-      7 => '<p>hello <span class="green">world</span> this is <span class="red">simple html</span></p>',
-      8 => '<div>nested 1</div>',
-      9 => '<div>nested 2</div>',
-      10 => '<div>nested 3</div>',
-      11 => 'more text',
+      1 => [
+        'hash' => hash('sha256', 'Text not inside a paragraph.'),
+        'id' => 1,
+        'data' => 'Text not inside a paragraph.',
+      ],
+      2 => [
+        'hash' => hash('sha256', '<p>one paragraph with special characters: äöüľščťžýáíéäňú©«®™»</p>'),
+        'id' => 2,
+        'data' => '<p>one paragraph with special characters: äöüľščťžýáíéäňú©«®™»</p>',
+      ],
+      3 => [
+        'hash' => hash('sha256', '<p>one paragraph with a <br/>break line</p>'),
+        'id' => 3,
+        'data' => '<p>one paragraph with a <br/>break line</p>',
+      ],
+      4 => [
+        'hash' => hash('sha256', '<p>one paragraph with html entities: &amp;&lt;&gt;</p>'),
+        'id' => 4,
+        'data' => '<p>one paragraph with html entities: &amp;&lt;&gt;</p>',
+      ],
+      5 => [
+        'hash' => hash('sha256', '<p>and here we have some link <a href="http://example.com">break line</a></p>'),
+        'id' => 5,
+        'data' => '<p>and here we have some link <a href="http://example.com">break line</a></p>',
+      ],
+      6 => [
+        'hash' => hash('sha256', '<p>one paragraph with an <img src="not-existing.gif" alt="not existing image" title="not existing image"/>image</p>'),
+        'id' => 6,
+        'data' => '<p>one paragraph with an <img src="not-existing.gif" alt="not existing image" title="not existing image"/>image</p>',
+      ],
+      7 => [
+        'hash' => hash('sha256', '<p>hello <span class="green">world</span> this is <span class="red">simple html</span></p>'),
+        'id' => 7,
+        'data' => '<p>hello <span class="green">world</span> this is <span class="red">simple html</span></p>',
+      ],
+      8 => [
+        'hash' => hash('sha256', '<div>nested 1</div>'),
+        'id' => 8,
+        'data' => '<div>nested 1</div>',
+      ],
+      9 => [
+        'hash' => hash('sha256', '<div>nested 2</div>'),
+        'id' => 9,
+        'data' => '<div>nested 2</div>',
+      ],
+      10 => [
+        'hash' => hash('sha256', '<div>nested 3</div>'),
+        'id' => 10,
+        'data' => '<div>nested 3</div>',
+      ],
+      11 => [
+        'hash' => hash('sha256', 'more text'),
+        'id' => 11,
+        'data' => 'more text',
+      ],
     ];
     /** @var \Drupal\tmgmt_memory\Segmenter $segmenter */
     $segmenter = \Drupal::service('tmgmt.segmenter');
diff --git a/tests/testing_tmx/example.tmx b/tests/testing_tmx/example.tmx
index 7a3252b..e896dc1 100644
--- a/tests/testing_tmx/example.tmx
+++ b/tests/testing_tmx/example.tmx
@@ -9,7 +9,8 @@
   <body>
     <tu>
       <prop type="data-key">body|0|value</prop>
-      <prop type="segment">0</prop>
+      <prop type="segment-delta">0</prop>
+      <prop type="segment-id">7018b838ce3171df22a6ff6b7d2e9c0570ed229c0428fdde51d7935dc497fd0b</prop>
       <tuv xml:lang="en">
         <seg>&lt;p&gt;Hello world!&lt;/p&gt;</seg>
       </tuv>
@@ -24,7 +25,8 @@
     </tu>
     <tu>
       <prop type="data-key">body|0|value</prop>
-      <prop type="segment">1</prop>
+      <prop type="segment-delta">1</prop>
+      <prop type="segment-id">392239381e271a4b3b601d3f2d47f12cb8cb7967d7fe7cd549b909886df44c8b</prop>
       <tuv xml:lang="en">
         <seg>&lt;p&gt;Another paragraph.&lt;/p&gt;</seg>
       </tuv>
diff --git a/tmgmt_memory.module b/tmgmt_memory.module
index cbf3122..b00e81f 100644
--- a/tmgmt_memory.module
+++ b/tmgmt_memory.module
@@ -17,30 +17,28 @@ function tmgmt_memory_tmgmt_job_item_update(JobItemInterface $job_item) {
   // Save the segments of a completed translation.
   if (!$original->isAccepted() && $job_item->isAccepted()) {
     $unfiltered_data = $job_item->getData();
+    /** @var \Drupal\tmgmt_memory\Segmenter $segmenter */
+    $segmenter = \Drupal::service('tmgmt.segmenter');
+    $unfiltered_data = $segmenter->getSegmentedData($unfiltered_data);
     /** @var \Drupal\tmgmt\Data $data_service */
     $data_service = \Drupal::service('tmgmt.data');
     $fields = $data_service->filterTranslatable($unfiltered_data);
     foreach ($fields as $field_key => $field) {
       if (isset($field['#translation'])) {
         $key = explode('][', $field_key);
-        /** @var \Drupal\tmgmt_memory\Segmenter $segmenter */
-        $segmenter = \Drupal::service('tmgmt.segmenter');
-        $segmented_source = $segmenter->segmentData($field['#text']);
-        $segmented_target = $segmenter->segmentData($field['#translation']['#text']);
-        $source_segments = $segmenter->getSegmentsOfData($segmented_source);
-        $target_segments = $segmenter->getSegmentsOfData($segmented_target);
+        $source_segments = $segmenter->getSegmentsOfData($field['#segmented_text']);
+        $target_segments = $segmenter->getSegmentsOfData($field['#translation']['#segmented_text']);
 
         /** @var \Drupal\tmgmt_memory\MemoryManager $memory_manager */
         $memory_manager = \Drupal::service('tmgmt_memory.memory_manager');
         /** @var \Drupal\tmgmt_memory\Entity\UsageTranslation $translation */
-        foreach (array_keys($source_segments) as $delta) {
-          $source_segment = $source_segments[$delta];
+        foreach ($source_segments as $id => $source_segment) {
           $source_usage = $memory_manager->addUsage($job_item->getJob()
-            ->getSourceLangcode(), $source_segment, $job_item->id(), implode('|', $key), $delta);
-          if (isset($target_segments[$delta])) {
-            $target_segment = $target_segments[$delta];
+            ->getSourceLangcode(), $source_segment['data'], $job_item->id(), implode('|', $key), $id);
+          if (isset($target_segments[$id])) {
+            $target_segment = $target_segments[$id]['data'];
             $target_usage = $memory_manager->addUsage($job_item->getJob()
-              ->getTargetLangcode(), $target_segment, $job_item->id(), implode('|', $key), $delta);
+              ->getTargetLangcode(), $target_segment, $job_item->id(), implode('|', $key), $id);
             $memory_manager->addUsageTranslation($source_usage, $target_usage);
           }
         }
@@ -67,8 +65,7 @@ function tmgmt_memory_tmgmt_job_before_request_translation(array $items) {
     $fields = $data_service->filterTranslatable($unfiltered_data);
     foreach ($fields as $field_key => $field) {
       $key = explode('][', $field_key);
-      $source_data = $job_item->getData(array_merge($key, ['#text']));
-      $target_data = $memory_manager->getPerfectMatchForDataItem($job_item->getJob()->getSourceLangcode(), $job_item->getJob()->getTargetLangcode(), $source_data);
+      $target_data = $memory_manager->getPerfectMatchForDataItem($job_item->getJob()->getSourceLangcode(), $job_item->getJob()->getTargetLangcode(), $field);
       if ($target_data) {
         $field['#text'] = $target_data;
         $job_item->addTranslatedData($field, $key);
@@ -91,8 +88,6 @@ function tmgmt_memory_tmgmt_job_before_request_translation(array $items) {
 function tmgmt_memory_tmgmt_job_after_request_translation(array $items) {
   /** @var \Drupal\tmgmt\Data $data_service */
   $data_service = \Drupal::service('tmgmt.data');
-  /** @var \Drupal\tmgmt_memory\MemoryManager $memory_manager */
-  $memory_manager = \Drupal::service('tmgmt_memory.memory_manager');
 
   // Translate exact matches on submission.
   foreach ($items as $job_item) {
@@ -102,16 +97,11 @@ function tmgmt_memory_tmgmt_job_after_request_translation(array $items) {
       $key = explode('][', $field_key);
       $source = $job_item->getData($data_service->ensureArrayKey($key));
       if (isset($source['#tmgmt_memory_translate'])) {
-        $target_data = $memory_manager->getPerfectMatchForDataItem($job_item->getJob()
-          ->getSourceLangcode(), $job_item->getJob()
-          ->getTargetLangcode(), $source['#text']);
-        if ($target_data) {
-          $data = $job_item->getData($data_service->ensureArrayKey($key));
-          $data['#translate'] = TRUE;
-          unset($data['#tmgmt_memory_translate']);
-          $job_item->updateData($key, $data);
-          $job_item->save();
-        }
+        $data = $job_item->getData($data_service->ensureArrayKey($key));
+        $data['#translate'] = TRUE;
+        unset($data['#tmgmt_memory_translate']);
+        $job_item->updateData($key, $data);
+        $job_item->save();
       }
     }
   }
