diff --git a/focal_point.module b/focal_point.module
index 5557735..4cccd1d 100644
--- a/focal_point.module
+++ b/focal_point.module
@@ -11,6 +11,10 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\Core\Url;
+use Drupal\focal_point\FocalPointHelper;
+use Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget;
 
 /**
  * Implements hook_theme().
@@ -63,3 +67,125 @@ function focal_point_field_widget_form_alter(&$element, FormStateInterface $form
     $element['#value_callback'] = array('Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget', 'value');
   }
 }
+
+/**
+ * Implements hook_form_file_image_edit_form_alter().
+ * File entity integration.
+ */
+function focal_point_form_file_image_edit_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
+  $file_entity_edit_form = $form_state->getBuildInfo()['callback_object'];
+  $file = $file_entity_edit_form->getEntity();
+  $element_selector = 'focal-point-' . $file->id();
+
+  $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;
+  }
+
+  $default_focal_point_value = FocalPointHelper::calculateDefaultValue($file, $preview_image_render['width'], $preview_image_render['height']);
+
+  $form['preview'] = array(
+    '#weight' => -1,
+    'indicator' => array(
+      '#theme_wrappers' => array('container'),
+      '#attributes' => array(
+        'class' => array('focal-point-indicator'),
+        'data-selector' => $element_selector,
+        'data-field-name' => 'file-entity',
+      ),
+      '#markup' => '',
+    ),
+    'thumbnail' => array(
+      '#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'],
+    ),
+  );
+
+  $display_preview_link = \Drupal::config('focal_point.preview')->get('display_link');
+
+  // Even for image fields with a cardinality higher than 1 the correct fid
+  // can always be found in $item['fids'][0].
+  $fid = $file->id();
+  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_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' => FocalPointImageWidget::getPreviewToken()),
+        ]),
+      '#attributes' => [
+        'class' => array('focal-point-preview-link'),
+        'data-selector' => $element_selector,
+        'data-field-name' => 'file-entity',
+        'target' => '_blank',
+      ],
+    ];
+
+    $form['preview']['preview_link'] = $preview_link;
+  }
+
+  $form['focal_point'] = 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' => $default_focal_point_value,
+    '#element_validate' => array('\Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget::validateFocalPoint'),
+    '#attributes' => array(
+      'class' => array('focal-point', $element_selector),
+      'data-selector' => $element_selector,
+      'data-field-name' => 'file-entity',
+    ),
+    '#attached' => array(
+      'library' => array('focal_point/drupal.focal_point'),
+    ),
+  );
+
+  $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, \Drupal\Core\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);
+    }
+  }
+}
+
+function focal_point_form_file_image_inline_edit_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
+  focal_point_form_file_image_edit_form_alter($form, $form_state);
+}
+
+function focal_point_form_file_image_inline_edit_form_submit(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
+  focal_point_form_file_image_edit_form_submit($form, $form_state);
+}
diff --git a/src/FocalPointHelper.php b/src/FocalPointHelper.php
new file mode 100644
index 0000000..98ab588
--- /dev/null
+++ b/src/FocalPointHelper.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\focal_point\FocalPointHelper.
+ */
+
+namespace Drupal\focal_point;
+
+use Drupal\crop\Entity\Crop;
+use Drupal\file\FileInterface;
+
+class FocalPointHelper {
+
+  public static function calculateDefaultValue(FileInterface $file, $width = NULL, $height = NULL) {
+    $crop_type = \Drupal::config('focal_point.settings')->get('crop_type');
+    $crop = Crop::findCrop($file->getFileUri(), $crop_type);
+    if ($crop) {
+      if ($width == NULL || $height == NULL) {
+        $image = \Drupal::service('image.factory')->get($file->getFileUri());
+        if ($image->valid()) {
+          $width = $image->getWidth();
+          $height = $image->getHeight();
+        }
+      }
+      $anchor = \Drupal::service('focal_point.manager')->absoluteToRelative($crop->x->value, $crop->y->value, $width, $height);
+      return "{$anchor['x']},{$anchor['y']}";
+    }
+    return \Drupal::config('focal_point.settings')->get('default_value');
+  }
+
+}
diff --git a/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php b/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
index 3dae58c..83a7a36 100644
--- a/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
+++ b/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
@@ -5,6 +5,7 @@ namespace Drupal\focal_point\Plugin\Field\FieldWidget;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\crop\Entity\Crop;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\focal_point\FocalPointHelper;
 use Drupal\image\Plugin\Field\FieldWidget\ImageWidget;
 use Drupal\Core\Url;
 
@@ -137,13 +138,7 @@ class FocalPointImageWidget extends ImageWidget {
         ->getStorage('file')
         ->load($return['target_id']);
       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'] = FocalPointHelper::calculateDefaultValue($file, $return['width'], $return['height']);
       }
       else {
         \Drupal::logger('focal_point')->notice("Attempted to get a focal point value for an invalid or temporary file.");
