diff --git a/README.md b/README.md
index abd9f43..e0c9349 100644
--- a/README.md
+++ b/README.md
@@ -23,8 +23,8 @@ Currently, Focal Point integrates with the standard image fields.
 ### Setting up image fields
 
 Install the module as usual. On the "Manage Form Display" page (e.g.
-admin/structure/types/manage/article/form-display) choose the Image (focal
-point) widget for your image field.
+admin/structure/types/manage/article/form-display) choose the "Image (Focal
+Point)" widget for your image field.
 
 ### Setting the focal point for an image
 
diff --git a/config/install/focal_point.preview.yml b/config/install/focal_point.preview.yml
deleted file mode 100644
index 68f2342..0000000
--- a/config/install/focal_point.preview.yml
+++ /dev/null
@@ -1 +0,0 @@
-display_link: true
diff --git a/config/schema/focal_point.schema.yml b/config/schema/focal_point.schema.yml
index a46ccf2..a909e9d 100644
--- a/config/schema/focal_point.schema.yml
+++ b/config/schema/focal_point.schema.yml
@@ -9,14 +9,6 @@ focal_point.settings:
       type: string
       label: 'The default value to use for focal point when none is specified'
 
-focal_point.preview:
-  type: config_object
-  label: 'Focal point preview settings'
-  mapping:
-    display_link:
-      type: boolean
-      label: 'Display preview link with image field widgets'
-
 image.effect.focal_point_scale_and_crop:
   type: image_size
   label: 'Focal Point Scale and Crop'
@@ -28,3 +20,20 @@ image.effect.focal_point_crop:
     anchor:
       label: 'Anchor'
       type: string
+
+field.widget.settings.image_focal_point:
+  type: mapping
+  label: 'Focal Point widget settings'
+  mapping:
+    progress_indicator:
+      type: string
+      label: 'Progress indicator'
+    preview_image_style:
+      type: string
+      label: 'Preview image style'
+    preview_link:
+      type: boolean
+      label: 'Preview link'
+    offsets:
+      type: string
+      label: 'Focal point offsets'
diff --git a/focal_point.install b/focal_point.install
index ad59d03..7988384 100644
--- a/focal_point.install
+++ b/focal_point.install
@@ -142,3 +142,36 @@ function focal_point_update_8003() {
   // new configuration.
   $existing_config->save();
 }
+
+/**
+ * Migrates image fields to new focus image widget.
+ */
+function focal_point_update_8004() {
+  $mapping = \Drupal::service('entity_field.manager')->getFieldMapByFieldType('image');
+  $formStorage = \Drupal::entityTypeManager()->getStorage('entity_form_display');
+  $previewLink = \Drupal::config('focal_point.preview')->get('display_link');
+
+  foreach ($mapping as $entity => $fields) {
+    foreach ($fields as $fieldName => $def) {
+      foreach ($def['bundles'] as $bundle) {
+        $properties = [
+          'targetEntityType' => $entity,
+          'bundle' => $bundle,
+        ];
+        if ($formDisplays = $formStorage->loadByProperties($properties)) {
+          /** @var \Drupal\Core\Entity\Entity\EntityFormDisplay $formDisplay */
+          foreach ($formDisplays as $formDisplay) {
+            if (is_array($componentConfig = $formDisplay->getComponent($fieldName))) {
+              $componentConfig['type'] = 'image_focal_point';
+              $componentConfig['settings']['preview_link'] = $previewLink;
+              $componentConfig['settings']['offsets'] = '50,50';
+              $formDisplay->setComponent($fieldName, $componentConfig)->save();
+            }
+          }
+        }
+      }
+    }
+  }
+
+  \Drupal::configFactory()->getEditable('focal_point.preview')->delete();
+}
diff --git a/focal_point.module b/focal_point.module
index 9a7192b..41f3a6c 100644
--- a/focal_point.module
+++ b/focal_point.module
@@ -75,13 +75,3 @@ function focal_point_entity_update(EntityInterface $entity) {
     }
   }
 }
-
-/**
- * Implements hook_field_widget_form_alter().
- */
-function focal_point_field_widget_form_alter(&$element, FormStateInterface $form_state, $context) {
-  if (get_class($context['widget']) === 'Drupal\image\Plugin\Field\FieldWidget\ImageWidget') {
-    $element['#process'][] = array('Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget', 'process');
-    $element['#value_callback'] = array('Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget', 'value');
-  }
-}
diff --git a/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php b/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
index 52c2fde..80c290e 100644
--- a/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
+++ b/src/Plugin/Field/FieldWidget/FocalPointImageWidget.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\focal_point\Plugin\Field\FieldWidget;
 
+use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\crop\Entity\Crop;
 use Drupal\Core\Form\FormStateInterface;
@@ -9,13 +10,15 @@ use Drupal\image\Plugin\Field\FieldWidget\ImageWidget;
 use Drupal\Core\Url;
 
 /**
- * Plugin implementation of the 'image_fp' widget.
+ * Plugin implementation of the 'image_focal_point' widget.
  *
- * The annotation has been intentionally omitted. Rather than create an entirely
- * separate widget for image fields, this class is used to supplant the existing
- * widget that comes with the core image module.
- *
- * @see focal_point_field_widget_form_alter
+ * @FieldWidget(
+ *   id = "image_focal_point",
+ *   label = @Translation("Image (Focal Point)"),
+ *   field_types = {
+ *     "image"
+ *   }
+ * )
  */
 class FocalPointImageWidget extends ImageWidget {
 
@@ -23,12 +26,87 @@ class FocalPointImageWidget extends ImageWidget {
 
   /**
    * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return [
+      'progress_indicator' => 'throbber',
+      'preview_image_style' => 'thumbnail',
+      'preview_link' => TRUE,
+      'offsets' => '50,50',
+    ] + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $form = parent::settingsForm($form, $form_state);
+
+    // We need a preview image for this widget.
+    $form['preview_image_style']['#required'] = TRUE;
+    unset($form['preview_image_style']['#empty_option']);
+
+    $form['preview_link'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Preview link'),
+      '#default_value' => $this->getSetting('preview_link'),
+      '#weight' => 30,
+    ];
+
+    $form['offsets'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Focal point offsets'),
+      '#default_value' => $this->getSetting('offsets'),
+      '#description' => $this->t('Specify the default focus of this widget in the form "leftoffset,topoffset" where offsets are in percentages. Ex: 25,75.'),
+      '#size' => 7,
+      '#maxlength' => 7,
+      '#element_validate' => [[$this, 'validateFocalPointWidget']],
+      '#required' => TRUE,
+      '#weight' => 35,
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = parent::settingsSummary();
+
+    $status = $this->getSetting('preview_link') ? $this->t('Yes') : $this->t('No');
+    $summary[] = $this->t('Preview link: @status', array('@status' => $status));
+
+    $offsets = $this->getSetting('offsets');
+    $summary[] = $this->t('Offsets: @offsets', array('@offsets' => $offsets));
+
+    return $summary;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
+    $element = parent::formElement($items, $delta, $element, $form, $form_state);
+    $element['#process'][] = [static::class, 'process'];
+    $element['#focal_point'] = [
+      'preview_link' => $this->getSetting('preview_link'),
+      'offsets' => $this->getSetting('offsets'),
+    ];
+
+    return $element;
+  }
+
+  /**
+   * Processes an image_focal_point field Widget.
    *
-   * Form API callback: Processes an image_fp field element.
-   *
-   * Expands the image_fp type to include the focal_point field.
-   *
+   * Expands the image_focal_point Widget to include the focal_point field.
    * This method is assigned as a #process callback in formElement() method.
+   *
+   * @todo Implement https://www.drupal.org/node/2657592
+   *   Convert focal point selector tool into a standalone form element.
+   * @todo Implement https://www.drupal.org/node/2848511
+   *   Focal Point offsets not accessible by keyboard.
    */
   public static function process($element, FormStateInterface $form_state, $form) {
     $element = parent::process($element, $form_state, $form);
@@ -37,7 +115,7 @@ class FocalPointImageWidget extends ImageWidget {
     $item['fids'] = $element['fids']['#value'];
     $element_selector = 'focal-point-' . implode('-', $element['#parents']);
 
-    $default_focal_point_value = isset($item['focal_point']) ? $item['focal_point'] : \Drupal::config('focal_point.settings')->get('default_value');
+    $default_focal_point_value = isset($item['focal_point']) ? $item['focal_point'] : $element['#focal_point']['offsets'];
 
     // Add the focal point indicator to preview.
     if (isset($element['preview'])) {
@@ -56,7 +134,7 @@ class FocalPointImageWidget extends ImageWidget {
         'thumbnail' => $element['preview'],
       );
 
-      $display_preview_link = \Drupal::config('focal_point.preview')->get('display_link');
+      $display_preview_link = $element['#focal_point']['preview_link'];
 
       // Even for image fields with a cardinality higher than 1 the correct fid
       // can always be found in $item['fids'][0].
@@ -105,7 +183,7 @@ class FocalPointImageWidget extends ImageWidget {
       '#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,
-      '#element_validate' => array('\Drupal\focal_point\Plugin\Field\FieldWidget\FocalPointImageWidget::validateFocalPoint'),
+      '#element_validate' => [[static::class, 'validateFocalPoint']],
       '#attributes' => array(
         'class' => array('focal-point', $element_selector),
         'data-selector' => $element_selector,
@@ -120,8 +198,6 @@ class FocalPointImageWidget extends ImageWidget {
   }
 
   /**
-   * {@inheritdoc}
-   *
    * Form API callback. Retrieves the value for the file_generic field element.
    *
    * This method is assigned as a #value_callback in formElement() method.
@@ -147,16 +223,14 @@ class FocalPointImageWidget extends ImageWidget {
       }
       else {
         \Drupal::logger('focal_point')->notice("Attempted to get a focal point value for an invalid or temporary file.");
-        $return['focal_point'] = \Drupal::config('focal_point.settings')->get('default_value');
+        $return['focal_point'] = $element['#focal_point']['offsets'];
       }
     }
     return $return;
   }
 
   /**
-   * {@inheritdoc}
-   *
-   * Validate callback for the focal point field.
+   * Validation Callback; Focal Point process field.
    */
   public static function validateFocalPoint($element, FormStateInterface $form_state) {
     if (empty($element['#value']) || (FALSE === \Drupal::service('focal_point.manager')->validateFocalPoint($element['#value']))) {
@@ -166,6 +240,13 @@ class FocalPointImageWidget extends ImageWidget {
   }
 
   /**
+   * Validation Callback; Focal Point widget setting.
+   */
+  public function validateFocalPointWidget(array &$element, FormStateInterface $form_state) {
+    static::validateFocalPoint($element, $form_state);
+  }
+
+  /**
    * Create and return a token to use for accessing the preview page.
    *
    * @return string
