diff --git a/focal_point.module b/focal_point.module
index 41f3a6c..60e932b 100644
--- a/focal_point.module
+++ b/focal_point.module
@@ -12,6 +12,7 @@ use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget;
 
 /**
  * Implements hook_help().
@@ -75,3 +76,72 @@ function focal_point_entity_update(EntityInterface $entity) {
     }
   }
 }
+
+/**
+ * Implements hook_form_file_image_edit_form_alter().
+ *
+ * File entity integration.
+ */
+function focal_point_form_file_image_edit_form_alter(&$form, FormStateInterface $form_state) {
+  $file_entity_edit_form = $form_state->getBuildInfo()['callback_object'];
+  $file = $file_entity_edit_form->getEntity();
+
+  $preview_image_render = array(
+    'style_name' => 'medium',
+    'uri' => $file->getFileUri(),
+  );
+
+  $image = \Drupal::service('image.factory')->get($file->getFileUri());
+  if ($image->isValid()) {
+    $preview_image_render['width'] = $image->getWidth();
+    $preview_image_render['height'] = $image->getHeight();
+  }
+  else {
+    $preview_image_render['width'] = $preview_image_render['height'] = NULL;
+  }
+
+  $form['preview'] = [
+    '#theme' => 'image_style',
+    '#width' => $preview_image_render['width'],
+    '#height' => $preview_image_render['height'],
+    '#style_name' => $preview_image_render['style_name'],
+    '#uri' => $preview_image_render['uri'],
+  ];
+
+  $form = FocalPointImageWidget::attachFocalPoint($form, $file->id(), \Drupal::service('focal_point.manager')->getFocalPointFromFile($file));
+  $form['actions']['submit']['#submit'][] = 'focal_point_form_file_image_edit_form_submit';
+}
+
+/**
+ * Custom submit handler for the file entity image edit form.
+ */
+function focal_point_form_file_image_edit_form_submit(&$form, FormStateInterface $form_state) {
+  $file_entity_edit_form = $form_state->getBuildInfo()['callback_object'];
+  $entity = $file_entity_edit_form->getEntity();
+  $focal_point_new_value = $form_state->getValue('focal_point');
+  $fpm = \Drupal::service('focal_point.manager');
+  if ($fpm->validateFocalPoint($focal_point_new_value)) {
+    list($x, $y) = explode(',', $focal_point_new_value);
+    $crop_type = \Drupal::config('focal_point.settings')->get('crop_type');
+    $crop = \Drupal::service('focal_point.manager')->getCropEntity($entity, $crop_type);
+    $image = \Drupal::service('image.factory')->get($entity->getFileUri());
+    if ($image->isValid()) {
+      \Drupal::service('focal_point.manager')->saveCropEntity($x, $y, $image->getWidth(), $image->getHeight(), $crop);
+    }
+  }
+}
+
+/**
+ * Implements hook_form_file_image_inline_edit_form_alter().
+ */
+function focal_point_form_file_image_inline_edit_form_alter(&$form, FormStateInterface $form_state) {
+  focal_point_form_file_image_edit_form_alter($form, $form_state);
+}
+
+/**
+ * Implements hook_form_file_image_inline_edit_form_submit().
+ */
+function focal_point_form_file_image_inline_edit_form_submit(&$form, FormStateInterface $form_state) {
+  focal_point_form_file_image_edit_form_submit($form, $form_state);
+}
+
diff --git a/src/FocalPointManager.php b/src/FocalPointManager.php
index 4bbd66a..65996c5 100644
--- a/src/FocalPointManager.php
+++ b/src/FocalPointManager.php
@@ -104,4 +104,25 @@ class FocalPointManager implements FocalPointManagerInterface {
     return $crop;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getFocalPointFromFile(FileInterface $file) {
+    $crop_type = \Drupal::config('focal_point.settings')->get('crop_type');
+    $crop = Crop::findCrop($file->getFileUri(), $crop_type);
+
+    if ($crop) {
+      $image = \Drupal::service('image.factory')->get($file->getFileUri());
+      if ($image->isValid()) {
+        // Because we are loading this image directly from the database, as
+        // opposed to passing it in as an argument during the image effect
+        // workflow, we can rely on the width and heights being accurate.
+        $anchor = $this->absoluteToRelative($crop->x->value, $crop->y->value, $image->getWidth(), $image->getHeight());
+        return "{$anchor['x']},{$anchor['y']}";
+      }
+    }
+
+    return '50,50';
+  }
+
 }
diff --git a/src/FocalPointManagerInterface.php b/src/FocalPointManagerInterface.php
index 06c1c05..e7aa534 100644
--- a/src/FocalPointManagerInterface.php
+++ b/src/FocalPointManagerInterface.php
@@ -95,4 +95,17 @@ interface FocalPointManagerInterface {
    */
   public function saveCropEntity($x, $y, $width, $height, CropInterface $crop);
 
+  /**
+   * Gets the focal point for a given file.
+   *
+   * Returns a default value if the file has no focal point.
+   *
+   * @param \Drupal\file\FileInterface $file
+   *   The file.
+   *
+   * @return string
+   *   The focal point in the format x,y.
+   */
+  public function getFocalPointFromFile(FileInterface $file);
+
 }
diff --git a/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php b/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
index 80c290e..f185c2f 100644
--- a/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
+++ b/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
@@ -113,9 +113,35 @@ class FocalPointImageWidget extends ImageWidget {
 
     $item = $element['#value'];
     $item['fids'] = $element['fids']['#value'];
-    $element_selector = 'focal-point-' . implode('-', $element['#parents']);
 
-    $default_focal_point_value = isset($item['focal_point']) ? $item['focal_point'] : $element['#focal_point']['offsets'];
+    // Even for image fields with a cardinality higher than 1 the correct fid
+    // can always be found in $item['fids'][0].
+    $fid = isset($item['fids'][0]) ? $item['fids'][0] : '';
+    $offsets = isset($item['focal_point']) ? $item['focal_point'] : $element['#focal_point']['offsets'];
+
+    $element = static::attachFocalPoint($element, $fid, $offsets);
+    return $element;
+  }
+
+  /**
+   * Add the necessary form elements to support focal point.
+   *
+   * @param array $element
+   *   The image form element to which the focal point is being attached.
+   * @param int $fid
+   *   The file id for the image in question. If no image has been set, this
+   *   will empty.
+   * @param string $offsets
+   *   The current focal point offsets.
+   *
+   * @return array
+   *   The altered form element.
+   */
+  public static function attachFocalPoint($element, $fid, $offsets) {
+    $element_selector = 'focal-point';
+    if (!empty($element['#parents'])) {
+      $element_selector .= '-' . implode('-', $element['#parents']);
+    }
 
     // Add the focal point indicator to preview.
     if (isset($element['preview'])) {
@@ -141,7 +167,7 @@ class FocalPointImageWidget extends ImageWidget {
       $fid = isset($item['fids'][0]) ? $item['fids'][0] : '';
       if ($display_preview_link && !empty($fid)) {
         // Replace comma (,) with an x to make javascript handling easier.
-        $preview_focal_point_value = str_replace(',', 'x', $default_focal_point_value);
+        $preview_focal_point_value = str_replace(',', 'x', $offsets);
 
         // Create a token to be used during an access check on the preview page.
         $token = self::getPreviewToken();
@@ -182,7 +208,7 @@ class FocalPointImageWidget extends ImageWidget {
       '#type' => 'textfield',
       '#title' => new TranslatableMarkup('Focal point'),
       '#description' => new TranslatableMarkup('Specify the focus of this image in the form "leftoffset,topoffset" where offsets are in percents. Ex: 25,75'),
-      '#default_value' => $default_focal_point_value,
+      '#default_value' => $offsets,
       '#element_validate' => [[static::class, 'validateFocalPoint']],
       '#attributes' => array(
         'class' => array('focal-point', $element_selector),
@@ -212,14 +238,10 @@ class FocalPointImageWidget extends ImageWidget {
       $file = \Drupal::service('entity_type.manager')
         ->getStorage('file')
         ->load($return['target_id']);
+
+      // @todo: consider moving this logic to getFocalPointFromFile
       if ($file) {
-        $crop_type = \Drupal::config('focal_point.settings')->get('crop_type');
-        $crop = Crop::findCrop($file->getFileUri(), $crop_type);
-        if ($crop) {
-          $anchor = \Drupal::service('focal_point.manager')
-            ->absoluteToRelative($crop->x->value, $crop->y->value, $return['width'], $return['height']);
-          $return['focal_point'] = "{$anchor['x']},{$anchor['y']}";
-        }
+        $return['focal_point'] = \Drupal::service('focal_point.manager')->getFocalPointFromFile($file);
       }
       else {
         \Drupal::logger('focal_point')->notice("Attempted to get a focal point value for an invalid or temporary file.");
@@ -273,4 +295,115 @@ class FocalPointImageWidget extends ImageWidget {
     return \Drupal::csrfToken()->validate($token, self::PREVIEW_TOKEN_NAME);
   }
 
+  /**
+   * Builds the form element for the focal point indicator.
+   *
+   * @param array $element
+   *   The image form element to which the focal point is being attached.
+   * @param string $element_selector
+   *   The data selector for the focal point form elements.
+   *
+   * @return array
+   *   The indicator form element.
+   */
+  protected static function buildIndicatorFormElement($element, $element_selector) {
+    $indicator = array(
+      '#theme_wrappers' => array('container'),
+      '#attributes' => array(
+        'class' => array('focal-point-indicator'),
+        'data-selector' => $element_selector,
+      ),
+      '#markup' => '',
+    );
+
+    if (isset($element['#delta'])) {
+      $indicator['#attributes']['data-delta'] = $element['#delta'];
+    }
+
+    return $indicator;
+  }
+
+  /**
+   * Builds the form element for the focal point preview.
+   *
+   * @param array $element
+   *   The image form element to which the focal point is being attached.
+   * @param string $element_selector
+   *   The data selector for the focal point form elements.
+   * @param string $offsets
+   *   The current focal point value.
+   * @param int $fid
+   *   The file id for the image in question.
+   *
+   * @return array
+   *   The indicator form element.
+   */
+  protected static function buildPreviewLinkFormElement($element, $element_selector, $offsets, $fid) {
+    // Replace comma (,) with an x to make javascript handling easier.
+    $preview_focal_point_value = str_replace(',', 'x', $offsets);
+
+    // Create a token to be used during an access check on the preview page.
+    $token = self::getPreviewToken();
+
+    $preview_link = [
+      '#type' => 'link',
+      '#title' => t('Preview'),
+      '#url' => new Url('focal_point.preview',
+        [
+          'fid' => $fid,
+          'focal_point_value' => $preview_focal_point_value,
+        ],
+        [
+          'query' => array('focal_point_token' => $token),
+        ]),
+      '#attributes' => [
+        'class' => array('focal-point-preview-link'),
+        'data-selector' => $element_selector,
+        'target' => '_blank',
+      ],
+    ];
+
+    if (isset($element['#field_name'])) {
+      $preview_link['#attributes']['data-field-name'] = $element['#field_name'];
+    }
+
+    return $preview_link;
+  }
+
+  /**
+   * Builds the form element for the focal point field.
+   *
+   * @param array $element
+   *   The image form element to which the focal point is being attached.
+   * @param string $element_selector
+   *   The data selector for the focal point form elements.
+   * @param string $offsets
+   *   The current focal point value.
+   *
+   * @return array
+   *   The indicator form element.
+   */
+  protected static function buildFocalPointFormElement($element, $element_selector, $offsets) {
+    $focal_point_element = array(
+      '#type' => 'textfield',
+      '#title' => 'Focal point',
+      '#description' => new TranslatableMarkup('Specify the focus of this image in the form "leftoffset,topoffset" where offsets are in percents. Ex: 25,75'),
+      '#default_value' => $offsets,
+      '#element_validate' => array('\Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget::validateFocalPoint'),
+      '#attributes' => array(
+        'class' => array('focal-point', $element_selector),
+        'data-selector' => $element_selector,
+      ),
+      '#attached' => array(
+        'library' => array('focal_point/drupal.focal_point'),
+      ),
+    );
+
+    if (isset($element['#field_name'])) {
+      $focal_point_element['#attributes']['data-field-name'] = $element['#field_name'];
+    }
+
+    return $focal_point_element;
+  }
+
 }
