diff --git a/modules/local_translation_content/css/fields_translations_preview.css b/modules/local_translation_content/css/fields_translations_preview.css
new file mode 100644
index 0000000..de39a06
--- /dev/null
+++ b/modules/local_translation_content/css/fields_translations_preview.css
@@ -0,0 +1,24 @@
+.local-translation-preview {
+  background-color: #cccccc;
+  float: left;
+  width: 100%;
+  margin: 10px 0;
+  padding: 5px;
+}
+.local-translation-preview .field_value,
+.local-translation-preview .field_language {
+  display: inline-block;
+}
+.local-translation-preview .field_value {
+  float: left;
+  width: 80%;
+  margin-left: 10px;
+}
+.local-translation-preview .field_language {
+  float: right;
+  margin-right: 10px;
+}
+.form-textarea-wrapper {
+  display: inline-block;
+  width: 100%;
+}
diff --git a/modules/local_translation_content/js/fields_translations_preview.js b/modules/local_translation_content/js/fields_translations_preview.js
new file mode 100644
index 0000000..9da744f
--- /dev/null
+++ b/modules/local_translation_content/js/fields_translations_preview.js
@@ -0,0 +1,37 @@
+(function ($, Drupal, window) {
+  'use strict';
+
+  Drupal.behaviors.fieldsTranslationsPreview = {
+    attach: function (context, settings) {
+      settings.localTranslationFieldsTranslationsPreview
+        = settings.localTranslationFieldsTranslationsPreview || false;
+      var translations = settings.localTranslationFieldsTranslationsPreview;
+      if (translations) {
+        var prefix = 'field--name-';
+        $.each(translations, function (language, fields) {
+          $.each(fields, function (name, value) {
+            var $field = $('.' + prefix + name.replace('_', '-'), context);
+            if ($field.length > 0) {
+              if (!$field.find('.form-item label').next().hasClass('local-translation-preview')) {
+                $('<div class="local-translation-preview"></div>')
+                  .insertAfter(
+                    $field.find('.form-item > label:not([for*="format"],[for*="alt"],[for*="title"]), .form-item > label[for*="title-0-value"]')
+                  );
+              }
+              var $container = $field.find('.local-translation-preview');
+              var $row = $('<div class="preview-row" id="' + language + '"></div>');
+              if (!$container.find('#' + language).length) {
+                $('<div class="field_value">' + value + '</div>')
+                  .appendTo($row);
+                $('<div class="field_language">' + language + '</div>')
+                  .appendTo($row);
+                $row.appendTo($container);
+              }
+            }
+          });
+        });
+      }
+    }
+  };
+
+})(jQuery, Drupal, window);
diff --git a/modules/local_translation_content/local_translation_content.libraries.yml b/modules/local_translation_content/local_translation_content.libraries.yml
new file mode 100644
index 0000000..6183887
--- /dev/null
+++ b/modules/local_translation_content/local_translation_content.libraries.yml
@@ -0,0 +1,9 @@
+fields-translations-preview:
+  css:
+    component:
+      css/fields_translations_preview.css: {preprocess: false}
+  js:
+    js/fields_translations_preview.js: {preprocess: false}
+  dependencies:
+    - core/drupal
+    - core/jquery
diff --git a/modules/local_translation_content/local_translation_content.module b/modules/local_translation_content/local_translation_content.module
index 6b782f5..b05f077 100644
--- a/modules/local_translation_content/local_translation_content.module
+++ b/modules/local_translation_content/local_translation_content.module
@@ -8,6 +8,7 @@
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\local_translation_content\Processor\LocalTranslationPreviewProcessor;
 use Drupal\local_translation_content\Controller\LocalTranslationContentLanguageCtrl;
 use Drupal\local_translation_content\Plugin\views\filter\TranslationLanguageLimitedToTranslationSkills;
 use Drupal\views\Plugin\views\query\Sql;
@@ -161,37 +162,56 @@ function local_translation_content_config_schema_info_alter(&$definitions) {
 function local_translation_content_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
   if (stripos($form_id, 'node_') !== FALSE) {
     $node = \Drupal::routeMatch()->getParameter('node');
-    if ($node instanceof Node && isset($form['source_langcode'])) {
-      $source =& $form['source_langcode']['source'];
-      if (isset($source['#options'])) {
-        $operation = \Drupal::routeMatch()
-          ->getRouteObject()
-          ->getRequirement('_access_content_translation_manage');
-        $user_skills = \Drupal::service('local_translation.user_skills')
-          ->getSourceSkills();
-        if (!empty($user_skills)) {
-          $user = \Drupal::currentUser();
-          if ($user->hasPermission("local_translation_content $operation content translations")
-            && !$user->hasPermission("$operation content translations")) {
-            // Leave only "from" languages.
-            foreach ($source['#options'] as $langcode => $label) {
-              if (!in_array($langcode, $user_skills)) {
-                unset($source['#options'][$langcode]);
+    if ($node instanceof Node) {
+      // Process the fields preview functionality.
+      $processor = new LocalTranslationPreviewProcessor($node);
+      $languages = $processor->getPreviewLanguages();
+      $translations_preview = [];
+      foreach ($languages as $langcode => $language) {
+        $translation = $processor->getTranslation($langcode);
+        if (!is_null($translation) && $translation instanceof Node) {
+          $fields = $processor->getFieldNames();
+          $translations_preview[$language->getName()] = $processor
+            ->getFieldsTranslations($fields, $translation);
+        }
+      }
+      if (!empty($translations_preview)) {
+        $form['#attached']['drupalSettings']['localTranslationFieldsTranslationsPreview'] = $translations_preview;
+      }
+      $form['#attached']['library'][] = 'local_translation_content/fields-translations-preview';
+
+      if (isset($form['source_langcode'])) {
+        $source =& $form['source_langcode']['source'];
+        if (isset($source['#options'])) {
+          $operation = \Drupal::routeMatch()
+            ->getRouteObject()
+            ->getRequirement('_access_content_translation_manage');
+          $user_skills = \Drupal::service('local_translation.user_skills')
+            ->getSourceSkills();
+          if (!empty($user_skills)) {
+            $user = \Drupal::currentUser();
+            if ($user->hasPermission("local_translation_content $operation content translations")
+              && !$user->hasPermission("$operation content translations")) {
+              // Leave only "from" languages.
+              foreach ($source['#options'] as $langcode => $label) {
+                if (!in_array($langcode, $user_skills)) {
+                  unset($source['#options'][$langcode]);
+                }
               }
             }
-          }
-          elseif ($user->hasPermission("$operation content translations")) {
-            // Group different languages into opt groups.
-            $languages = $source['#options'];
-            $source['#options'] = ['Translation Skills' => [], 'Others' => []];
-            foreach ($user_skills as $langcode) {
-              if (isset($languages[$langcode])) {
-                $source['#options']['Translation Skills'][$langcode] = $languages[$langcode];
+            elseif ($user->hasPermission("$operation content translations")) {
+              // Group different languages into opt groups.
+              $languages = $source['#options'];
+              $source['#options'] = ['Translation Skills' => [], 'Others' => []];
+              foreach ($user_skills as $langcode) {
+                if (isset($languages[$langcode])) {
+                  $source['#options']['Translation Skills'][$langcode] = $languages[$langcode];
+                }
               }
-            }
-            foreach ($languages as $langcode => $name) {
-              if (!in_array($langcode, $user_skills) && $node->hasTranslation($langcode)) {
-                $source['#options']['Others'][$langcode] = $name;
+              foreach ($languages as $langcode => $name) {
+                if (!in_array($langcode, $user_skills) && $node->hasTranslation($langcode)) {
+                  $source['#options']['Others'][$langcode] = $name;
+                }
               }
             }
           }
diff --git a/modules/local_translation_content/src/Processor/LocalTranslationPreviewProcessor.php b/modules/local_translation_content/src/Processor/LocalTranslationPreviewProcessor.php
new file mode 100644
index 0000000..1a43f2e
--- /dev/null
+++ b/modules/local_translation_content/src/Processor/LocalTranslationPreviewProcessor.php
@@ -0,0 +1,152 @@
+<?php
+
+namespace Drupal\local_translation_content\Processor;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\node\Entity\Node;
+
+/**
+ * Class LocalTranslationPreviewProcessor.
+ *
+ * @package Drupal\local_translation_content\Processor
+ */
+class LocalTranslationPreviewProcessor extends ControllerBase {
+
+  /**
+   * Current language ID.
+   *
+   * @var string
+   */
+  protected $currentLanguage;
+  /**
+   * All enabled languages.
+   *
+   * @var \Drupal\Core\Language\LanguageInterface[]
+   */
+  protected $languages;
+  /**
+   * Processed node object.
+   *
+   * @var \Drupal\node\Entity\Node
+   */
+  protected $node;
+
+  /**
+   * LocalTranslationPreviewProcessor constructor.
+   */
+  public function __construct(Node $node) {
+    $this->node            = $node;
+    $this->languages       = $this->languageManager()->getNativeLanguages();
+    $this->currentLanguage = $this->languageManager()
+      ->getCurrentLanguage()
+      ->getId();
+  }
+
+  /**
+   * Get languages for preview.
+   *
+   * @return \Drupal\Core\Language\LanguageInterface[]
+   *   Language objects available for preview.
+   */
+  public function getPreviewLanguages() {
+    $languages = $this->languages;
+    unset($languages[$this->currentLanguage]);
+    foreach ($languages as $langcode => $language) {
+      if (!$this->node->hasTranslation($langcode)
+        || !\Drupal::service('local_translation.user_skills')->userHasSkill($langcode)
+      ) {
+        unset($languages[$langcode]);
+      }
+    }
+    return $languages;
+  }
+
+  /**
+   * Get node's translation.
+   *
+   * @param string $langcode
+   *   Language ID.
+   *
+   * @return \Drupal\node\Entity\Node|null
+   *   Translation object or NULL if translation doesn't exist.
+   */
+  public function getTranslation($langcode) {
+    return $this->node->hasTranslation($langcode)
+      ? $this->node->getTranslation($langcode)
+      : NULL;
+  }
+
+  /**
+   * Get field names of the field widgets we need to alter.
+   *
+   * @return array
+   *   Array of field names.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   */
+  public function getFieldNames() {
+    $field_names = [];
+
+    $display = $this->entityTypeManager()
+      ->getStorage('entity_form_display')
+      ->load($this->node->getEntityTypeId()
+        . '.' . $this->node->bundle()
+        . '.default');
+
+    if (!$display instanceof EntityFormDisplay) {
+      return $field_names;
+    }
+    $components = array_keys($display->getComponents());
+
+    $reserved = ['title', 'body'];
+    foreach ($components as $key => $component) {
+      if (in_array($component, $reserved)) {
+        continue;
+      }
+      if (stripos($component, 'field_') === 0) {
+        continue;
+      }
+      unset($components[$key]);
+    }
+    $field_names = array_values($components);
+    return $field_names;
+  }
+
+  /**
+   * Get fields' translations.
+   *
+   * @param array $fields
+   *   Array of field names.
+   * @param \Drupal\node\Entity\Node $translation
+   *   Translation version of the node.
+   * @param bool $rendered
+   *   Optional. Render fields or not. Defaults to FALSE.
+   *
+   * @return array
+   *   Fields' translations array.
+   */
+  public function getFieldsTranslations(array $fields, Node $translation, $rendered = TRUE) {
+    $translations = [];
+    if (empty($fields)) {
+      return $translations;
+    }
+    foreach ($fields as $field_name) {
+      if (!$translation->hasField($field_name)) {
+        continue;
+      }
+      $field = $translation->get($field_name);
+      if ($field->isEmpty()) {
+        continue;
+      }
+      $translations[$field_name] = $field->view();
+      if ($rendered) {
+        $translations[$field_name] = \Drupal::service('renderer')
+          ->renderRoot($translations[$field_name]);
+      }
+    }
+    return $translations;
+  }
+
+}
