diff --git a/src/EncryptedFieldValueManager.php b/src/EncryptedFieldValueManager.php
index 435245d..dd7d413 100644
--- a/src/EncryptedFieldValueManager.php
+++ b/src/EncryptedFieldValueManager.php
@@ -51,9 +51,6 @@ class EncryptedFieldValueManager implements EncryptedFieldValueManagerInterface
   public function createEncryptedFieldValue(ContentEntityInterface $entity, $field_name, $delta, $property, $encrypted_value) {
     $langcode = $entity->language()->getId();
     if ($encrypted_field_value = $this->getExistingEntity($entity, $field_name, $delta, $property)) {
-      // Update an existing encrypted field value, taking into account the
-      // parent entity language.
-      $encrypted_field_value = $encrypted_field_value->hasTranslation($langcode) ? $encrypted_field_value->getTranslation($langcode) : $encrypted_field_value->addTranslation($langcode);
       $encrypted_field_value->setEncryptedValue($encrypted_value);
       $encrypted_field_value->save();
     }
@@ -98,7 +95,7 @@ class EncryptedFieldValueManager implements EncryptedFieldValueManagerInterface
    * {@inheritdoc}
    */
   public function getEncryptedFieldValue(ContentEntityInterface $entity, $field_name, $delta, $property) {
-    $field_value_entity = $this->getExistingEntity($entity, $field_name, $delta, $property);
+    $field_value_entity = $this->getExistingEntity($entity, $field_name, $delta, $property, $entity->getRevisionId());
     if ($field_value_entity) {
       $langcode = $entity->language()->getId();
       if ($field_value_entity->hasTranslation($langcode)) {
@@ -117,6 +114,7 @@ class EncryptedFieldValueManager implements EncryptedFieldValueManagerInterface
       ->condition('entity_type', $entity->getEntityTypeId())
       ->condition('entity_id', $entity->id())
       ->condition('entity_revision_id', $this->getEntityRevisionId($entity))
+      ->condition('langcode', $entity->language()->getId())
       ->condition('field_name', $field_name)
       ->condition('field_delta', $delta)
       ->condition('field_property', $property);
diff --git a/src/EncryptedFieldValueManagerInterface.php b/src/EncryptedFieldValueManagerInterface.php
index 38fa885..d4d828f 100644
--- a/src/EncryptedFieldValueManagerInterface.php
+++ b/src/EncryptedFieldValueManagerInterface.php
@@ -74,6 +74,8 @@ interface EncryptedFieldValueManagerInterface {
    *
    * @return bool|\Drupal\field_encrypt\Entity\EncryptedFieldValue
    *   The existing EncryptedFieldValue entity.
+   *
+   * @fixme have its own custom method ...
    */
   public function getExistingEntity(ContentEntityInterface $entity, $field_name, $delta, $property);
 
diff --git a/src/EventSubscriber/ConfigSubscriber.php b/src/EventSubscriber/ConfigSubscriber.php
index 8685a99..115dbac 100644
--- a/src/EventSubscriber/ConfigSubscriber.php
+++ b/src/EventSubscriber/ConfigSubscriber.php
@@ -114,6 +114,8 @@ class ConfigSubscriber implements EventSubscriberInterface {
    *
    * @param ConfigCrudEvent $event
    *   The configuration event.
+   *
+   * @todo why is this not just using hook_field_storage_update?
    */
   public function onConfigSave(ConfigCrudEvent $event) {
     $config = $event->getConfig();
@@ -149,7 +151,7 @@ class ConfigSubscriber implements EventSubscriberInterface {
 
             if (!empty($entity_ids)) {
               // Call the Queue API and add items for processing.
-              /** @var QueueInterface $queue */
+              /** @var \Drupal\Core\Queue\QueueInterface $queue */
               $queue = $this->queueFactory->get('cron_encrypted_field_update');
 
               foreach (array_keys($entity_ids) as $entity_id) {
diff --git a/tests/src/Kernel/FieldEncryptStorageTest.php b/tests/src/Kernel/FieldEncryptStorageTest.php
new file mode 100644
index 0000000..5f32bd8
--- /dev/null
+++ b/tests/src/Kernel/FieldEncryptStorageTest.php
@@ -0,0 +1,243 @@
+<?php
+
+namespace Drupal\Tests\field_encrypt\Kernel;
+
+use Drupal\encrypt\Entity\EncryptionProfile;
+use Drupal\entity_test\Entity\EntityTestMulRev;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\key\Entity\Key;
+use Drupal\language\Entity\ConfigurableLanguage;
+
+/**
+ * Tests the encrypted field storage explicitly.
+ *
+ * On top of that the tests will test translations / revisions.
+ */
+class FieldEncryptStorageTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['field_encrypt', 'key', 'encrypt', 'encrypt_test', 'entity_test', 'field', 'text', 'user', 'filter', 'language', 'content_translation'];
+
+  /**
+   * A list of test keys.
+   *
+   * @var \Drupal\key\Entity\Key[]
+   */
+  protected $testKeys;
+
+  /**
+   * A list of test encryption profiles.
+   *
+   * @var \Drupal\encrypt\Entity\EncryptionProfile[]
+   */
+  protected $encryptionProfiles;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create test keys for encryption.
+    $key_128 = Key::create([
+      'id' => 'testing_key_128',
+      'label' => 'Test Key 128 bit',
+      'key_type' => "encryption",
+      'key_type_settings' => ['key_size' => '128'],
+      'key_provider' => 'config',
+      'key_provider_settings' => ['key_value' => 'mustbesixteenbit'],
+    ]);
+    $key_128->save();
+    $this->testKeys['testing_key_128'] = $key_128;
+
+    $key_256 = Key::create([
+      'id' => 'testing_key_256',
+      'label' => 'Test Key 256 bit',
+      'key_type' => "encryption",
+      'key_type_settings' => ['key_size' => '256'],
+      'key_provider' => 'config',
+      'key_provider_settings' => ['key_value' => 'mustbesixteenbitmustbesixteenbit'],
+    ]);
+    $key_256->save();
+    $this->testKeys['testing_key_256'] = $key_256;
+
+    // Create test encryption profiles.
+    $encryption_profile_1 = EncryptionProfile::create([
+      'id' => 'encryption_profile_1',
+      'label' => 'Encryption profile 1',
+      'encryption_method' => 'test_encryption_method',
+      'encryption_key' => $this->testKeys['testing_key_128']->id(),
+    ]);
+    $encryption_profile_1->save();
+    $this->encryptionProfiles['encryption_profile_1'] = $encryption_profile_1;
+
+    $encryption_profile_2 = EncryptionProfile::create([
+      'id' => 'encryption_profile_2',
+      'label' => 'Encryption profile 2',
+      'encryption_method' => 'config_test_encryption_method',
+      'encryption_method_configuration' => ['mode' => 'CFB'],
+      'encryption_key' => $this->testKeys['testing_key_256']->id(),
+    ]);
+    $encryption_profile_2->save();
+    $this->encryptionProfiles['encryption_profile_2'] = $encryption_profile_2;
+
+    // Create content type to test.
+
+    // Create test fields.
+    $single_field_storage = FieldStorageConfig::create([
+      'field_name' => 'field_test_single',
+      'entity_type' => 'entity_test_mulrev',
+      'type' => 'text_with_summary',
+      'cardinality' => 1,
+    ]);
+    $single_field_storage->setThirdPartySetting('field_encrypt', 'encrypt', TRUE);
+    $single_field_storage->setThirdPartySetting('field_encrypt', 'encryption_profile', 'encryption_profile_1');
+    $single_field_storage->setThirdPartySetting('field_encrypt', 'properties', ['value' => 'value', 'summary' => 'summary']);
+    $single_field_storage->save();
+    $single_field = FieldConfig::create([
+      'field_storage' => $single_field_storage,
+      'bundle' => 'entity_test_mulrev',
+      'label' => 'Single field',
+    ]);
+    $single_field->save();
+
+    $multi_field_storage = FieldStorageConfig::create([
+      'field_name' => 'field_test_multi',
+      'entity_type' => 'entity_test_mulrev',
+      'type' => 'string',
+      'cardinality' => 3,
+    ]);
+    $multi_field_storage->setThirdPartySetting('field_encrypt', 'encrypt', TRUE);
+    $multi_field_storage->setThirdPartySetting('field_encrypt', 'encryption_profile', 'encryption_profile_1');
+    $multi_field_storage->setThirdPartySetting('field_encrypt', 'properties', ['value' => 'value', 'summary' => 'summary']);
+    $multi_field_storage->save();
+    $multi_field = FieldConfig::create([
+      'field_storage' => $multi_field_storage,
+      'bundle' => 'entity_test_mulrev',
+      'label' => 'Multi field',
+    ]);
+    $multi_field->save();
+
+    $this->installEntitySchema('entity_test_mulrev');
+    $this->installEntitySchema('encrypted_field_value');
+    $this->installEntitySchema('user');
+  }
+
+  public function testNoRevisionsAndNoTranslations() {
+    $entity = EntityTestMulRev::create([
+      'type' => 'entity_test_mulrev',
+      'field_test_single' => 'test value',
+    ]);
+    $entity->save();
+    $entity = EntityTestMulRev::load($entity->id());
+
+    $this->assertRawEncryptedValues($entity->id(), 'field_test_single');
+    $this->assertEquals('test value', $entity->field_test_single->value);
+  }
+
+  protected function assertRawEncryptedValues($entity_id, $field) {
+    $result = \Drupal::database()->query("SELECT {$field}_value FROM {entity_test_mulrev__{$field}} WHERE entity_id = :entity_id", [':entity_id' => $entity_id])->fetchAll();
+    foreach ($result as $record) {
+      $this->assertEquals("[ENCRYPTED]", $record->field_test_single_value);
+    }
+  }
+
+  public function testRevisions() {
+    $entity = EntityTestMulRev::create([
+      'type' => 'entity_test_mulrev',
+      'field_test_single' => 'test value',
+    ]);
+    $entity->save();
+
+    $revision = clone $entity;
+    $revision->setNewRevision(TRUE);
+    $revision->isDefaultRevision(FALSE);
+    $revision->field_test_single->value = 'test value r1';
+    $revision->save();
+
+    $storage = \Drupal::entityTypeManager()->getStorage('entity_test_mulrev');
+    $entity = $storage->load($entity->id());
+    $revision = $storage->loadRevision($revision->getRevisionId());
+
+    $this->assertRawEncryptedValues($entity->id(), 'field_test_single');
+    $this->assertEquals('test value', $entity->field_test_single->value);
+    $this->assertEquals('test value r1', $revision->field_test_single->value);
+  }
+
+  public function testTranslations() {
+    $this->setupTranslationSettings();
+    $entity = EntityTestMulRev::create([
+      'type' => 'entity_test_mulrev',
+      'field_test_single' => 'test value',
+      'langcode' => 'en',
+    ]);
+    $entity->save();
+
+    $translation = $entity->addTranslation('fr');
+    $translation->field_test_single->value = 'test value FR';
+    $translation->save();
+
+    $storage = \Drupal::entityTypeManager()->getStorage('entity_test_mulrev');
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+    $entity = $storage->load($entity->id());
+    $translation = $entity->getTranslation('fr');
+
+    $this->assertRawEncryptedValues($entity->id(), 'field_test_single');
+    $this->assertEquals('test value FR', $translation->field_test_single->value);
+    $this->assertEquals('test value', $entity->field_test_single->value);
+    
+  }
+
+  public function testRevisionsAndTranslations() {
+    $this->setupTranslationSettings();
+    $entity = EntityTestMulRev::create([
+      'type' => 'entity_test_mulrev',
+      'field_test_single' => 'test value',
+      'langcode' => 'en',
+    ]);
+    $entity->save();
+
+    $revision = clone $entity;
+    $revision->setNewRevision(TRUE);
+    $revision->isDefaultRevision(FALSE);
+    $revision->field_test_single->value = 'test value r1';
+    $revision->save();
+
+    $translation = $entity->addTranslation('fr');
+    $translation->field_test_single->value = 'test value FR';
+    $translation->save();
+
+    $storage = \Drupal::entityTypeManager()->getStorage('entity_test_mulrev');
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+    $entity = $storage->load($entity->id());
+    $translation = $entity->getTranslation('fr');
+    $revision = $storage->loadRevision($revision->getRevisionId());
+
+    $this->assertRawEncryptedValues($entity->id(), 'field_test_single');
+    $this->assertEquals('test value FR', $translation->field_test_single->value);
+    $this->assertEquals('test value r1', $revision->field_test_single->value);
+    $this->assertEquals('test value', $entity->field_test_single->value);
+  }
+
+  /**
+   * Set up translation settings for content translation test.
+   */
+  protected function setupTranslationSettings() {
+    // Set up extra language.
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    // Enable translation for the current entity type and ensure the change is
+    // picked up.
+    \Drupal::service('content_translation.manager')
+      ->setEnabled('entity_test_mulrev', 'entity_test_mulrev', TRUE);
+    drupal_static_reset();
+    \Drupal::entityManager()->clearCachedDefinitions();
+    \Drupal::service('router.builder')->rebuild();
+    \Drupal::service('entity.definition_update_manager')->applyUpdates();
+    \Drupal::service('kernel')->rebuildContainer();
+  }
+
+}
