diff --git a/core/modules/link/link.install b/core/modules/link/link.install
index 3714d35..83a2df1 100644
--- a/core/modules/link/link.install
+++ b/core/modules/link/link.install
@@ -15,8 +15,14 @@ function link_field_schema($field) {
     'length' => 2048,
     'not null' => FALSE,
   );
+  $schema['columns']['anchor_text'] = array(
+    'description' => 'The link anchor text.',
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => FALSE,
+  );    
   $schema['columns']['title'] = array(
-    'description' => 'The link text.',
+    'description' => 'The link title attribute.',
     'type' => 'varchar',
     'length' => 255,
     'not null' => FALSE,
diff --git a/core/modules/link/link.module b/core/modules/link/link.module
index f8ee409..a877d8a 100644
--- a/core/modules/link/link.module
+++ b/core/modules/link/link.module
@@ -26,8 +26,9 @@ function link_help($path, $arg) {
 function link_field_info() {
   $types['link'] = array(
     'label' => t('Link'),
-    'description' => t('Stores a URL string, optional varchar title, and optional blob of attributes to assemble a link.'),
-    'instance_settings' => array(
+    'description' => t('Stores a URL string, optional varchar anchor text, optional varchar link title and optional blob of attributes to assemble a link.'),
+     'instance_settings' => array(
+      'anchor_text' => DRUPAL_OPTIONAL,
       'title' => DRUPAL_OPTIONAL,
     ),
     'default_widget' => 'link_default',
@@ -40,9 +41,19 @@ function link_field_info() {
  * Implements hook_field_instance_settings_form().
  */
 function link_field_instance_settings_form($field, $instance) {
+  $form['anchor_text'] = array(
+    '#type' => 'radios',
+    '#title' => t('Allow link anchor text'),
+    '#default_value' => isset($instance['settings']['anchor_text']) ? $instance['settings']['anchor_text'] : DRUPAL_OPTIONAL,
+    '#options' => array(
+      DRUPAL_DISABLED => t('Disabled'),
+      DRUPAL_OPTIONAL => t('Optional'),
+      DRUPAL_REQUIRED => t('Required'),
+    ),
+  );
   $form['title'] = array(
     '#type' => 'radios',
-    '#title' => t('Allow link title'),
+    '#title' => t('Allow link title attribute'),
     '#default_value' => isset($instance['settings']['title']) ? $instance['settings']['title'] : DRUPAL_OPTIONAL,
     '#options' => array(
       DRUPAL_DISABLED => t('Disabled'),
@@ -83,8 +94,9 @@ function link_field_is_empty($item, $field) {
  */
 function link_field_presave(EntityInterface $entity, $field, $instance, $langcode, &$items) {
   foreach ($items as $delta => &$item) {
-    // Trim any spaces around the URL and title.
+    // Trim any spaces around the URL, anchor text and and title.
     $item['url'] = trim($item['url']);
+    $item['anchor_text'] = trim($item['anchor_text']);
     $item['title'] = trim($item['title']);
 
     // Serialize the attributes array.
@@ -100,8 +112,9 @@ function link_field_widget_info() {
     'label' => 'Link',
     'field types' => array('link'),
     'settings' => array(
-      'placeholder_title' => '',
       'placeholder_url' => '',
+      'placeholder_anchor_text' => '',
+      'placeholder_title' => '',
     ),
   );
   return $widgets;
@@ -120,9 +133,20 @@ function link_field_widget_settings_form($field, $instance) {
     '#default_value' => $settings['placeholder_url'],
     '#description' => t('The placeholder is a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
   );
+  $form['placeholder_anchor_text'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Placeholder for link anchor text'),
+    '#default_value' => $settings['placeholder_anchor_text'],
+    '#description' => t('The placeholder is a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
+    '#states' => array(
+      'invisible' => array(
+        ':input[name="instance[settings][anchor_text]"]' => array('value' => DRUPAL_DISABLED),
+      ),
+    ),
+  );
   $form['placeholder_title'] = array(
     '#type' => 'textfield',
-    '#title' => t('Placeholder for link title'),
+    '#title' => t('Placeholder for link title attribute'),
     '#default_value' => $settings['placeholder_title'],
     '#description' => t('The placeholder is a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
     '#states' => array(
@@ -150,6 +174,14 @@ function link_field_widget_form(&$form, &$form_state, $field, $instance, $langco
     '#maxlength' => 2048,
     '#required' => $element['#required'],
   );
+  $element['anchor_text'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Anchor text'),
+    '#placeholder' => isset($widget_settings['placeholder_anchor_text']) ? $widget_settings['placeholder_anchor_text'] : '',
+    '#default_value' => isset($items[$delta]['anchor_text']) ? $items[$delta]['anchor_text'] : NULL,
+    '#maxlength' => 255,
+    '#access' => $settings['anchor_text'] != DRUPAL_DISABLED,
+  );
   $element['title'] = array(
     '#type' => 'textfield',
     '#title' => t('Title'),
@@ -158,13 +190,14 @@ function link_field_widget_form(&$form, &$form_state, $field, $instance, $langco
     '#maxlength' => 255,
     '#access' => $settings['title'] != DRUPAL_DISABLED,
   );
-  // Post-process the title field to make it conditionally required if URL is
-  // non-empty. Omit the validation on the field edit form, since the field
-  // settings cannot be saved otherwise.
+  // Post-process the anchor text and title field to make it conditionally 
+  // required if URL is non-empty. Omit the validation on the field edit form, 
+  // since the field settings cannot be saved otherwise.
   $is_field_edit_form = ($element['#entity'] === NULL);
-  if (!$is_field_edit_form && $settings['title'] == DRUPAL_REQUIRED) {
-    $element['#element_validate'][] = 'link_field_widget_validate_title';
-  }
+  if (!$is_field_edit_form) {
+    ($settings['anchor_text'] == DRUPAL_REQUIRED) ? $element['#element_validate'][] = 'link_field_widget_validate_anchor_text' : '';
+    $settings['title'] == DRUPAL_REQUIRED ? $element['#element_validate'][] = 'link_field_widget_validate_title' : '';
+   }
 
   // Exposing the attributes array in the widget is left for alternate and more
   // advanced field widgets.
@@ -181,6 +214,18 @@ function link_field_widget_form(&$form, &$form_state, $field, $instance, $langco
 /**
  * Form element validation handler for link_field_widget_form().
  *
+ * Conditionally requires the link anchor text if a URL value was filled in.
+ */
+function link_field_widget_validate_anchor_text(&$element, &$form_state, $form) {
+  if ($element['url']['#value'] !== '' && $element['anchor_text']['#value'] === '') {
+    $element['anchor_text']['#required'] = TRUE;
+    form_error($element['anchor_text'], t('!name field is required.', array('!name' => $element['anchor_text']['#title'])));
+  }
+}
+
+/**
+ * Form element validation handler for link_field_widget_form().
+ *
  * Conditionally requires the link title if a URL value was filled in.
  */
 function link_field_widget_validate_title(&$element, &$form_state, $form) {
@@ -286,7 +331,7 @@ function link_field_formatter_settings_form($field, $instance, $view_mode, $form
 }
 
 /**
- * Implements hook_field_formatter_settings_form().
+ * Implements hook_field_formatter_settings_summary().
  */
 function link_field_formatter_settings_summary($field, $instance, $view_mode) {
   $display = $instance['display'][$view_mode];
@@ -346,58 +391,64 @@ function link_field_formatter_view(EntityInterface $entity, $field, $instance, $
   $settings = $display['settings'];
 
   foreach ($items as $delta => $item) {
-    // By default use the full URL as the link title.
+    // By default use the full URL as the link anchor text.
     $link_title = $item['url'];
 
-    // If the title field value is available, use it for the link title.
-    if (empty($settings['url_only']) && !empty($item['title'])) {
-      // Unsanitizied token replacement here because $options['html'] is FALSE
+    if (empty($settings['url_only']) && !empty($item['anchor_text'])) {
+      // Unsanitized token replacement here because $options['html'] is FALSE
       // by default in theme_link().
-      $link_title = token_replace($item['title'], array($entity->entityType() => $entity), array('sanitize' => FALSE, 'clear' => TRUE));
+// NOTE - $entity_type IS UNDEFINED!
+      $link_anchor_text = token_replace($item['anchor_text'], array(), array('sanitize' => FALSE, 'clear' => TRUE));
     }
 
-    // Trim the link title to the desired length.
+    // Trim the link anchor text to the desired length.
     if (!empty($settings['trim_length'])) {
-      $link_title = truncate_utf8($link_title, $settings['trim_length'], FALSE, TRUE);
+      $link_anchor_text = truncate_utf8($link_anchor_text, $settings['trim_length'], FALSE, TRUE);
     }
 
     if ($display['type'] == 'link') {
       if (!empty($settings['url_only']) && !empty($settings['url_plain'])) {
         $element[$delta] = array(
           '#type' => 'markup',
-          '#markup' => check_plain($link_title),
+          '#markup' => check_plain($link_anchor_text),
         );
       }
       else {
         $element[$delta] = array(
           '#type' => 'link',
-          '#title' => $link_title,
+          '#title' => $link_anchor_text,
           '#href' => $item['path'],
           '#options' => $item['options'],
         );
       }
     }
     elseif ($display['type'] == 'link_separate') {
-      // The link_separate formatter has two titles; the link title (as in the
-      // field values) and the URL itself. If there is no title value,
-      // $link_title defaults to the URL, so it needs to be unset.
-      // The URL title may need to be trimmed as well.
-      if (empty($item['title'])) {
-        $link_title = NULL;
+      // The link_separate formatter has two anchor texts: the link anchor text (as in the
+      // field values) and the URL itself. If there is no anchor text value,
+      // $link_anchor_text defaults to the URL, so it needs to be unset.
+      // The URL anchor text may need to be trimmed as well.
+      if (empty($item['anchor_text'])) {
+        $link_anchor_text = NULL;
       }
-      $url_title = $item['url'];
+      $url_anchor_text = $item['url'];
       if (!empty($settings['trim_length'])) {
-        $url_title = truncate_utf8($item['url'], $settings['trim_length'], FALSE, TRUE);
+        $url_anchor_text = truncate_utf8($item['url'], $settings['trim_length'], FALSE, TRUE);
       }
       $element[$delta] = array(
         '#theme' => 'link_formatter_link_separate',
-        '#title' => $link_title,
-        '#url_title' => $url_title,
+        '#title' => $link_anchor_text,
+        '#url_title' => $url_anchor_text,
         '#href' => $item['path'],
         '#options' => $item['options'],
       );
     }
   }
+
+  // Make title available as an attribute.
+  if (isset($item['title']) && !empty($item['title'])) {
+    $element[$delta]['#options']['attributes']['title'] = $item['title'];
+  }
+
   return $element;
 }
 
@@ -407,21 +458,21 @@ function link_field_formatter_view(EntityInterface $entity, $field, $instance, $
 function link_theme() {
   return array(
     'link_formatter_link_separate' => array(
-      'variables' => array('title' => NULL, 'url_title' => NULL, 'href' => NULL, 'options' => array()),
+      'variables' => array('anchor_text' => NULL, 'url_anchor_text' => NULL, 'href' => NULL, 'options' => array()),
     ),
   );
 }
 
 /**
- * Formats a link as separate title and URL elements.
+ * Formats a link as separate anchor text and URL elements.
  */
 function theme_link_formatter_link_separate($vars) {
   $output = '';
   $output .= '<div class="link-item">';
-  if (!empty($vars['title'])) {
-    $output .= '<div class="link-title">' . check_plain($vars['title']) . '</div>';
-  }
-  $output .= '<div class="link-url">' . l($vars['url_title'], $vars['href'], $vars['options']) . '</div>';
+  if (!empty($vars['anchor_text'])) {
+    $output .= '<div class="link-title">' . check_plain($vars['anchor_text']) . '</div>';
+   }
+  $output .= '<div class="link-url">' . l($vars['url_anchor_text'], $vars['href'], $vars['options']) . '</div>';
   $output .= '</div>';
   return $output;
 }
