diff --git a/single_image.info b/single_image.info
deleted file mode 100644
index e4d24df..0000000
--- a/single_image.info
+++ /dev/null
@@ -1,5 +0,0 @@
-name = Single Image Formatter
-description = Print only one image on a multiple images field
-core = 7.x
-package = Fields
-dependencies[] = image
\ No newline at end of file
diff --git a/single_image.info.yml b/single_image.info.yml
new file mode 100644
index 0000000..125193e
--- /dev/null
+++ b/single_image.info.yml
@@ -0,0 +1,5 @@
+type: module
+name: Single Image Formatter
+description: 'Print only one image on a multiple images field'
+package: Fields
+core: '8.x'
diff --git a/single_image.module b/single_image.module
deleted file mode 100644
index e0af4ff..0000000
--- a/single_image.module
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * @file
- * Main file for sinagle_image formatter module.
- */
-
-/**
- * Implements hook_field_formatter_info().
- */
-function single_image_field_formatter_info() {
-  $formatters = array(
-    'single_image' => array(
-      'label' => t('Single Image'), 
-      'field types' => array('image'), 
-      'settings' => array(
-        'image_style' => '',
-        'image_link' => '',
-        'single_image_delta' => '',
-      ),
-    ),
-  );
-
-  return $formatters;
-}
-
-/**
- * Implements hook_field_formatter_settings_form().
- */
-function single_image_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
-  // Get default 
-  $element = image_field_formatter_settings_form($field, $instance, $view_mode, $form, $form_state);
-  $display = $instance['display'][$view_mode];
-  $settings = $display['settings'];
-
-  $element['single_image_delta'] = array(
-    '#title' => t('Image to display'),
-    '#description' => t('Chose which image number to display.'),
-    '#type' => 'textfield',
-    '#default_value' => $settings['single_image_delta'],
-    '#empty_option' => t('Random'),
-    '#element_validate' => array('element_validate_integer_positive'),
-  );
-
-  return $element;
-}
-
-/**
- * Implements hook_field_formatter_settings_summary().
- */
-function single_image_field_formatter_settings_summary($field, $instance, $view_mode) {
-  $display = $instance['display'][$view_mode];
-  $settings = $display['settings'];
-  $summary = image_field_formatter_settings_summary($field, $instance, $view_mode);
-  $summary .= '<br />' . T('Image to display: @number', array('@number' => $settings['single_image_delta']));
-  return $summary;
-}
-
-/**
- * Implements hook_field_formatter_view().
- */
-function single_image_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
-  $element = array();
-  if ($items) {
-    $delta = $display['settings']['single_image_delta'];
-    $which = isset($items[$delta]) ? $delta : array_rand($items);
-    $items = array($items[$which]);
-    $element = image_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display);
-  }
-  return $element;
-}
diff --git a/src/Plugin/Field/FieldFormatter/SingleImageFormatter.php b/src/Plugin/Field/FieldFormatter/SingleImageFormatter.php
new file mode 100644
index 0000000..da251e3
--- /dev/null
+++ b/src/Plugin/Field/FieldFormatter/SingleImageFormatter.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Drupal\single_image\Plugin\Field\FieldFormatter;
+
+use Drupal\image\Plugin\Field\FieldFormatter\ImageFormatter;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+
+/**
+ * Plugin implementation of the 'Single image' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "single_image_formatter",
+ *   label = @Translation("Single image Formatter"),
+ *   description = @Translation("Prints only one image on a multiple images field."),
+ *   field_types = {
+ *     "image"
+ *   }
+ * )
+ */
+class SingleImageFormatter extends ImageFormatter {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return array(
+      'single_image_delta' => '',
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $form = parent::settingsForm($form, $form_state);
+    $form['single_image_delta'] = array(
+      '#title' => $this->t('Image to display'),
+      '#description' => $this->t('Chose which image number to display. Selection must be made using a positive integer where 1 will print delta 0.'),
+      '#type' => 'number',
+      '#min' => 0,
+      '#step' => 1,
+      '#default_value' => $this->getSetting('single_image_delta'),
+      '#empty_option' => $this->t('Random'),
+    );
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = parent::settingsSummary();
+    $summary[] = $this->t('Image to display: @number.', array('@number' => !empty($this->getSetting('single_image_delta')) ? $this->getSetting('single_image_delta') : $this->t('Random')));
+    return $summary;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items, $langcode) {
+    $elements = parent::viewElements($items, $langcode);
+    if (!$elements) {
+      return $elements;
+    }
+    $delta = $this->getSetting('single_image_delta') - 1;
+    $which = isset($elements[$delta]) ? $delta : array_rand($elements);
+    return array($elements[$which]);
+  }
+
+}
