diff --git a/core/modules/field/modules/telephone/lib/Drupal/telephone/Plugin/field/formatter/TelephoneLinkFormatter.php b/core/modules/field/modules/telephone/lib/Drupal/telephone/Plugin/field/formatter/TelephoneLinkFormatter.php
new file mode 100644
index 0000000..299e0b5
--- /dev/null
+++ b/core/modules/field/modules/telephone/lib/Drupal/telephone/Plugin/field/formatter/TelephoneLinkFormatter.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\link\Plugin\field\formatter\TelephoneLinkFormatter.
+ */
+
+namespace Drupal\telephone\Plugin\field\formatter;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\field\Plugin\Type\Formatter\FormatterBase;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Plugin implementation of the 'telephone_link' formatter.
+ *
+ * @Plugin(
+ *   id = "telephone_link",
+ *   module = "telephone",
+ *   label = @Translation("Telephone link"),
+ *   field_types = {
+ *     "telephone"
+ *   },
+ *   settings = {
+ *     "title" = ""
+ *   }
+ * )
+ */
+class TelephoneLinkFormatter extends FormatterBase {
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::settingsForm().
+   */
+  public function settingsForm(array $form, array &$form_state) {
+    $elements['title'] = array(
+      '#type' => 'textfield',
+      '#title' => t('The links title to display'),
+      '#default_value' => $this->getSetting('title'),
+      '#description' => t('Leave blank to use the telephone number itself instead.'),
+    );
+
+    return $elements;
+  }
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::settingsSummary().
+   */
+  public function settingsSummary() {
+    $settings = $this->getSettings();
+
+    if (!empty($settings['title'])) {
+      $summary = t('Link title: @title', array('@title' => $settings['title']));
+    }
+    else {
+      $summary = t('Telephone number as link title.');
+    }
+
+    return $summary;
+  }
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::prepareView().
+   */
+  public function prepareView(array $entities, $langcode, array &$items) {
+    foreach ($entities as $id => $entity) {
+      $settings = $this->getSettings();
+
+      foreach ($items[$id] as $delta => &$item) {
+        // If available, set custom link title.
+        if (!empty($settings['title'])) {
+          $item['title'] = $settings['title'];
+        }
+        // Otherwise, use telephone number itself as title.
+        else {
+          $item['title'] = $item['value'];
+        }
+
+      }
+    }
+  }
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::viewElements().
+   */
+  public function viewElements(EntityInterface $entity, $langcode, array $items) {
+    $element = array();
+    $settings = $this->getSettings();
+
+    foreach ($items as $delta => $item) {
+
+      // Prepend 'tel:' to the telephone number.
+      $link = 'tel:' . $item['value'];
+
+      // Render each element as link.
+      $element[$delta] = array(
+        '#type' => 'link',
+        '#title' => $item['title'],
+        '#href' => $link,
+      );
+
+    }
+    return $element;
+  }
+}
\ No newline at end of file
diff --git a/core/modules/field/modules/telephone/lib/Drupal/telephone/Plugin/field/widget/TelephoneDefaultWidget.php b/core/modules/field/modules/telephone/lib/Drupal/telephone/Plugin/field/widget/TelephoneDefaultWidget.php
new file mode 100644
index 0000000..a0b0e96
--- /dev/null
+++ b/core/modules/field/modules/telephone/lib/Drupal/telephone/Plugin/field/widget/TelephoneDefaultWidget.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\telephone\Plugin\field\widget\TelephoneDefaultWidget.
+ */
+
+namespace Drupal\telephone\Plugin\field\widget;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\field\Plugin\Type\Widget\WidgetBase;
+
+/**
+ * Plugin implementation of the 'telephone_default' widget.
+ *
+ * @Plugin(
+ *   id = "telephone_default",
+ *   module = "telephone",
+ *   label = @Translation("Telephone number"),
+ *   field_types = {
+ *     "telephone"
+ *   }
+ * )
+ */
+class TelephoneDefaultWidget extends WidgetBase {
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
+   */
+  public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
+    $element['value'] = $element + array(
+      '#type' => 'tel',
+      '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
+    );
+    return $element;
+  }
+
+}
diff --git a/core/modules/field/modules/telephone/telephone.info b/core/modules/field/modules/telephone/telephone.info
new file mode 100644
index 0000000..90b1fcd
--- /dev/null
+++ b/core/modules/field/modules/telephone/telephone.info
@@ -0,0 +1,7 @@
+name = Telephone
+description = Defines a field type for telephone numbers.
+package = Core
+version = VERSION
+core = 8.x
+dependencies[] = field
+dependencies[] = text
diff --git a/core/modules/field/modules/telephone/telephone.install b/core/modules/field/modules/telephone/telephone.install
new file mode 100644
index 0000000..d409b8b
--- /dev/null
+++ b/core/modules/field/modules/telephone/telephone.install
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the Telephone module.
+ */
+
+/**
+ * Implements hook_field_schema().
+ */
+function telephone_field_schema($field) {
+  $columns = array(
+    'value' => array(
+      'type' => 'varchar',
+      'length' => 256,
+      'not null' => FALSE,
+    ),
+  );
+  return array(
+    'columns' => $columns,
+  );
+}
diff --git a/core/modules/field/modules/telephone/telephone.module b/core/modules/field/modules/telephone/telephone.module
new file mode 100644
index 0000000..61bdfdd
--- /dev/null
+++ b/core/modules/field/modules/telephone/telephone.module
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Defines a simple telephone number field type.
+ */
+/**
+ * Implements hook_field_info().
+ */
+function telephone_field_info() {
+  return array(
+    'telephone' => array(
+      'label' => t('Telephone number'),
+      'description' => t('This field stores a telephone number in the database.'),
+      'default_widget' => 'telephone_default',
+      'default_formatter' => 'text_plain',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function telephone_field_is_empty($item, $field) {
+  return !isset($item['value']) || $item['value'] === '';
+}
+
+/**
+ * Implements hook_field_formatter_info_alter().
+ */
+function telephone_field_formatter_info_alter(&$info) {
+  if (isset($info['text_plain'])) {
+    $info['text_plain']['field_types'][] = 'telephone';
+  }
+}
\ No newline at end of file
