diff --git a/core/modules/email/email.install b/core/modules/email/email.install
deleted file mode 100644
index 9af9b9a..0000000
--- a/core/modules/email/email.install
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * @file
- * Install, update and uninstall functions for the E-mail module.
- */
-
-/**
- * Implements hook_field_schema().
- */
-function email_field_schema($field) {
-  $columns = array(
-    'value' => array(
-      'type' => 'varchar',
-      // The maximum length of an e-mail address is 254 characters. RFC 3696
-      // specifies a total length of 320 characters, but mentions that
-      // addresses longer than 256 characters are not normally useful. Erratum
-      // 1690 was then released which corrected this value to 254 characters.
-      // @see http://tools.ietf.org/html/rfc3696#section-3
-      // @see http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690
-      'length' => 254,
-      'not null' => FALSE,
-    ),
-  );
-  return array(
-    'columns' => $columns,
-  );
-}
diff --git a/core/modules/email/email.module b/core/modules/email/email.module
index 2d24c39..3b2fbbb 100644
--- a/core/modules/email/email.module
+++ b/core/modules/email/email.module
@@ -19,25 +19,10 @@ function email_help($path, $arg) {
 }
 
 /**
- * Implements hook_field_info().
- */
-function email_field_info() {
-  return array(
-    'email' => array(
-      'label' => t('E-mail'),
-      'description' => t('This field stores an e-mail address in the database.'),
-      'default_widget' => 'email_default',
-      'default_formatter' => 'email_mailto',
-      'class' => 'Drupal\Core\Entity\Field\Type\EmailItem',
-    ),
-  );
-}
-
-/**
  * Implements hook_field_info_alter().
  */
 function email_field_info_alter(&$info) {
-  if (module_exists('text')) {
+  if (Drupal::moduleHandler()->moduleExists('text')) {
     $info['email']['default_formatter'] = 'text_plain';
   }
 }
diff --git a/core/modules/email/lib/Drupal/email/Plugin/field/field_type/EmailItem.php b/core/modules/email/lib/Drupal/email/Plugin/field/field_type/EmailItem.php
new file mode 100644
index 0000000..3530f34
--- /dev/null
+++ b/core/modules/email/lib/Drupal/email/Plugin/field/field_type/EmailItem.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\email\Plugin\field\field_type\EmailItem.
+ */
+
+namespace Drupal\email\Plugin\field\field_type;
+
+use Drupal\Core\Entity\Annotation\FieldType;
+use Drupal\Core\Annotation\Translation;
+use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemBase;
+use Drupal\field\Plugin\Core\Entity\Field;
+
+/**
+ * Plugin implementation of the 'email' field type.
+ *
+ * @FieldType(
+ *   id = "email",
+ *   module = "email",
+ *   label = @Translation("E-mail"),
+ *   description = @Translation("This field stores an e-mail address in the database."),
+ *   default_widget = "email_default",
+ *   default_formatter = "email_mailto"
+ * )
+ */
+class EmailItem extends ConfigFieldItemBase {
+
+  /**
+   * Definitions of the contained properties.
+   *
+   * @var array
+   */
+  static $propertyDefinitions;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(Field $field) {
+    return array(
+      'columns' => array(
+        'value' => array(
+          'type' => 'varchar',
+          'length' => 254,
+          'not null' => FALSE,
+        ),
+      ),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPropertyDefinitions() {
+    if (!isset(static::$propertyDefinitions)) {
+      static::$propertyDefinitions['value'] = array(
+        'type' => 'string',
+        'label' => t('E-mail address'),
+      );
+    }
+    return static::$propertyDefinitions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isEmpty() {
+    $value = $this->get('value')->getValue();
+    return $value === NULL || $value === '';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConstraints() {
+    $constraint_manager = \Drupal::typedData()->getValidationConstraintManager();
+    $constraints = parent::getConstraints();
+
+    $max_length = 254;
+    $constraints[] = $constraint_manager->create('ComplexData', array(
+      'value' => array(
+        'Length' => array(
+          'max' => $max_length,
+          'maxMessage' => t('%name: the e-mail address may not be longer than @max characters.', array('%name' => $this->getInstance()->label, '@max' => $max_length)),
+        )
+      ),
+    ));
+
+    return $constraints;
+  }
+
+}
