diff --git a/paragraphs_asymmetric_translation_widgets.module b/paragraphs_asymmetric_translation_widgets.module
index 77fd943..5c6eff7 100644
--- a/paragraphs_asymmetric_translation_widgets.module
+++ b/paragraphs_asymmetric_translation_widgets.module
@@ -7,6 +7,7 @@

 use Drupal\Core\Entity\EntityInterface;
 use Drupal\paragraphs\ParagraphInterface;
+use Drush\Drush;

 /**
  * Implements hook_field_formatter_info_alter().
@@ -118,3 +119,62 @@ function paragraphs_asymmetric_translation_widgets_entity_translation_delete(Ent
     }
   }
 }
+
+/**
+ * Automatically migrate paragraphs fields from symmetrical to non-symmetrical.
+ *
+ * This hook is supposed to run in the following situations:
+ * - when importing config through Drush
+ * - when importing config through the form at
+ *   /admin/config/development/configuration.
+ * - when updating config through the edit form
+ *   at /admin/structure/types/manage/content/fields/<id>
+ * - when updating config through the overview form
+ *   at /admin/config/regional/content-language.
+ *
+ * Implements hook_entity_field_config_update().
+ */
+function paragraphs_asymmetric_translation_widgets_field_config_update(EntityInterface $entity) {
+  /** @var \Drupal\field\Entity\FieldConfig $entity */
+  if ($entity->getType() !== 'entity_reference_revisions') {
+    return;
+  }
+
+  if (!($entity->isTranslatable() && !$entity->original->isTranslatable())) {
+    return;
+  }
+
+  $fieldName = $entity->getName();
+  $entityTypeId = $entity->getTargetEntityTypeId();
+  $bundle = $entity->getTargetBundle();
+
+  // Build and execute batch.
+  $batch = \Drupal::service('paragraphs_asymmetric_translation_widgets.migrate')
+    ->getBatch($entityTypeId, $bundle, $fieldName);
+
+  if (!is_array($batch)) {
+    return;
+  }
+
+  batch_set($batch);
+
+  if (Drush::hasContainer()) {
+    drush_backend_batch_process();
+  }
+}
+
+/**
+ * Implements hook_entity_type_alter().
+ */
+function paragraphs_asymmetric_translation_widgets_entity_type_alter(array &$entity_types) {
+  foreach ($entity_types as $entity_type) {
+    if ($entity_type->get('id') == 'paragraph') {
+      // Disable untranslated field validation when editing non-default
+      // revision, see https://www.drupal.org/node/2938191 for more information.
+      $constraints = $entity_type->getConstraints();
+      unset($constraints['EntityUntranslatableFields']);
+      $entity_type->setConstraints($constraints);
+    }
+  }
+}
+
diff --git a/paragraphs_asymmetric_translation_widgets.services.yml b/paragraphs_asymmetric_translation_widgets.services.yml
new file mode 100644
index 0000000..bcc18f5
--- /dev/null
+++ b/paragraphs_asymmetric_translation_widgets.services.yml
@@ -0,0 +1,13 @@
+services:
+  paragraphs_asymmetric_translation_widgets.migrate:
+    class: Drupal\paragraphs_asymmetric_translation_widgets\MigrateParagraphs
+    arguments:
+      - '@entity_type.manager'
+      - '@messenger'
+
+  paragraphs_asymmetric_translation_widgets.migrate.command:
+    class: Drupal\paragraphs_asymmetric_translation_widgets\Commands\MigrateParagraphsCommand
+    tags:
+      - { name: drush.command }
+    arguments:
+      - '@paragraphs_asymmetric_translation_widgets.migrate'
diff --git a/src/Commands/MigrateParagraphsCommand.php b/src/Commands/MigrateParagraphsCommand.php
new file mode 100644
index 0000000..7e40f46
--- /dev/null
+++ b/src/Commands/MigrateParagraphsCommand.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Drupal\paragraphs_asymmetric_translation_widgets\Commands;
+
+use Drupal\paragraphs_asymmetric_translation_widgets\MigrateParagraphs;
+use Drush\Commands\DrushCommands;
+
+/**
+ * Drush command for migrating paragraphs fields.
+ */
+class MigrateParagraphsCommand extends DrushCommands {
+
+  /**
+   * The paragraphs migration service.
+   *
+   * @var \Drupal\paragraphs_asymmetric_translation_widgets\MigrateParagraphs
+   */
+  protected $migrateParagraphs;
+
+  /**
+   * Constructs a new MigrateParagraphsCommand object.
+   *
+   * @param \Drupal\paragraphs_asymmetric_translation_widgets\MigrateParagraphs $migrateParagraphs
+   *   The paragraphs migration service.
+   */
+  public function __construct(
+    MigrateParagraphs $migrateParagraphs
+  ) {
+    $this->migrateParagraphs = $migrateParagraphs;
+  }
+
+  /**
+   * Migrate paragraphs fields from symmetrical to non-symmetrical.
+   *
+   * @param string $entityTypeId
+   *   The entity type ID the field is attached to.
+   * @param string $fieldName
+   *   The name of the field whose paragraphs will be migrated.
+   *
+   * @command paragraphs:migrate-to-non-symmetrical
+   *
+   * @usage paragraphs:migrate $entity_type $field_name
+   */
+  public function migrateCommand(string $entityTypeId, string $fieldName) {
+    $batch = $this->migrateParagraphs->getBatch($entityTypeId, NULL, $fieldName);
+
+    if (!is_array($batch)) {
+      $this->io()->success('No paragraphs to migrate.');
+    }
+
+    batch_set($batch);
+    drush_backend_batch_process();
+  }
+
+}
diff --git a/src/MigrateParagraphs.php b/src/MigrateParagraphs.php
new file mode 100644
index 0000000..869db35
--- /dev/null
+++ b/src/MigrateParagraphs.php
@@ -0,0 +1,161 @@
+<?php
+
+namespace Drupal\paragraphs_asymmetric_translation_widgets;
+
+use Drupal\Core\Batch\BatchBuilder;
+use Drupal\Core\DependencyInjection\DependencySerializationTrait;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\TranslatableInterface;
+use Drupal\Core\Messenger\MessengerInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Service for migrating paragraphs from symmetric to asymmetric.
+ */
+class MigrateParagraphs {
+
+  use DependencySerializationTrait;
+  use StringTranslationTrait;
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The messenger service.
+   *
+   * @var \Drupal\Core\Messenger\MessengerInterface
+   */
+  protected $messenger;
+
+  /**
+   * Constructs a new MigrateParagraphs object.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
+   *   The entity type manager.
+   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
+   *   The messenger service.
+   */
+  public function __construct(
+    EntityTypeManagerInterface $entityTypeManager,
+    MessengerInterface $messenger
+  ) {
+    $this->entityTypeManager = $entityTypeManager;
+    $this->messenger = $messenger;
+  }
+
+  /**
+   * Create a batch array for migrating paragraphs.
+   */
+  public function getBatch(string $entityTypeId, ?string $bundle, string $fieldName): ?array {
+    $storage = $this->entityTypeManager
+      ->getStorage($entityTypeId);
+    $definition = $this->entityTypeManager
+      ->getDefinition($entityTypeId);
+
+    $entityQuery = $storage->getQuery()
+      ->accessCheck(FALSE)
+      ->exists($fieldName);
+
+    if ($bundle && $bundleKey = $definition->getKey('bundle')) {
+      $entityQuery->condition($bundleKey, $bundle);
+    }
+
+    $entityIds = $entityQuery->execute();
+
+    if ($entityIds === []) {
+      return NULL;
+    }
+
+    $batch_builder = (new BatchBuilder())
+      ->setTitle(t('Migrating paragraphs'))
+      ->setFinishCallback([$this, 'batchFinishCallback']);
+
+    foreach ($entityIds as $entityId) {
+      $batch_builder->addOperation(
+        [$this, 'migrateEntity'],
+        [$fieldName, $entityTypeId, $entityId]
+      );
+    }
+
+    return $batch_builder->toArray();
+  }
+
+    /**
+     * Migrate paragraphs from symmetric to asymmetric for a single entity.
+     *
+     * @param string $fieldName
+     *   The name of the paragraphs field that will be migrated.
+     * @param string $entityTypeId
+     *   The entity type ID of the entity whose paragraphs will be migrated.
+     * @param string $entityId
+     *   The ID of the entity whose paragraphs will be migrated.
+     * @param array|\DrushBatchContext $context
+     *   An associative array containing contextual information.
+     */
+  public function migrateEntity(string $fieldName, string $entityTypeId, string $entityId, &$context): void {
+    $entityTypeDefinition = $this->entityTypeManager->getDefinition($entityTypeId);
+    $entity = $this->entityTypeManager->getStorage($entityTypeId)->load($entityId);
+
+    if ($entity instanceof TranslatableInterface) {
+      foreach ($entity->getTranslationLanguages(FALSE) as $language) {
+        // Go through all translations of the entity and set the values from
+        // original entity if there are no existing values.
+        $entity_translation = $entity->getTranslation($language->getId());
+
+        if ($entity_translation->get($fieldName)->target_id === NULL) {
+          $entity_translation->{$fieldName} = $entity->{$fieldName};
+          $entity_translation->save();
+        }
+      }
+    }
+
+    // Collect processed entities
+    $context['results'][] = $entityId;
+
+    // Optional message displayed under the progress bar.
+    $context['message'] = $this->t('Migrating @field_name from symmetric to asymmetric for @entity_type_label with bundle @bundle and ID @id.', [
+      '@field_name' => $fieldName,
+      '@entity_type_label' => $entityTypeDefinition->getSingularLabel(),
+      '@bundle' => $entity->bundle(),
+      '@id' => $entityId,
+    ]);
+  }
+
+  /**
+   * Finish callback for the batch process.
+   *
+   * @param bool $success
+   *   Success of the operation.
+   * @param array $results
+   *   Array of results for post processing.
+   * @param array $operations
+   *   Array of operations.
+   */
+  public function batchFinishCallback(bool $success, array $results, array $operations) {
+    if ($success) {
+      $this->messenger->addMessage(
+        $this->formatPlural(
+          count($results),
+          'Successfully migrated paragraphs for 1 entity.',
+          'Successfully migrated paragraphs for @count entities.',
+        )
+      );
+    }
+    else {
+      // An error occurred.
+      // $operations contains the operations that remained unprocessed.
+      $error_operation = reset($operations);
+      $this->messenger->addMessage(
+        $this->t('An error occurred while processing @operation with arguments: @args', [
+          '@operation' => $error_operation[0],
+          '@args' => print_r($error_operation[0], TRUE),
+        ])
+      );
+    }
+  }
+
+}
diff --git a/src/Plugin/Field/FieldWidget/ParagraphsClassicAsymmetricWidget.php b/src/Plugin/Field/FieldWidget/ParagraphsClassicAsymmetricWidget.php
index ded41a5..f67ef94 100644
--- a/src/Plugin/Field/FieldWidget/ParagraphsClassicAsymmetricWidget.php
+++ b/src/Plugin/Field/FieldWidget/ParagraphsClassicAsymmetricWidget.php
@@ -134,6 +134,12 @@ class ParagraphsClassicAsymmetricWidget extends InlineParagraphsWidget {
         if (!empty($form_state->get('content_translation'))) {
           $paragraphs_entity = $this->createDuplicateWithSingleLanguage($paragraphs_entity, $langcode);
         }
+        elseif ($paragraphs_entity->hasTranslation($langcode)) {
+          // If host entity translation refers to same paragraph entity, then
+          // fetch that instead. This is possible if Classic widget has been
+          // changed to Asymmetric widget with existing content.
+          $paragraphs_entity = $paragraphs_entity->getTranslation($langcode);
+        }
       }
       // -- paragraphs_asymmetric_translation_widgets addition end
       else {
