diff --git a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
index a608873..226ca0f 100644
--- a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
+++ b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
@@ -54,12 +54,13 @@ function testURLValidation() {
       'entity_type' => 'test_entity',
       'bundle' => 'test_bundle',
       'settings' => array(
+        'anchor_text' => DRUPAL_DISABLED,
         'title' => DRUPAL_DISABLED,
       ),
       'widget' => array(
         'type' => 'link_default',
         'settings' => array(
-          'placeholder_url' => 'http://example.com',
+          'placeholder_url' => 'http://example1.com',
         ),
       ),
     );
@@ -75,10 +76,10 @@ function testURLValidation() {
     // Display creation form.
     $this->drupalGet('test-entity/add/test_bundle');
     $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][url]", '', 'Link URL field is displayed');
-    $this->assertRaw('placeholder="http://example.com"');
+    $this->assertRaw('placeholder="http://example1.com"');
 
     // Verify that a valid URL can be submitted.
-    $value = 'http://www.example.com/';
+    $value = 'http://www.example1.com/';
     $edit = array(
       "{$this->field['field_name']}[$langcode][0][url]" => $value,
     );
@@ -108,9 +109,9 @@ function testURLValidation() {
   }
 
   /**
-   * Tests the title settings of a link field.
+   * Tests the anchor text settings of a link field.
    */
-  function testLinkTitle() {
+  function testLinkAnchorText() {
     // Create a field with settings to validate.
     $this->field = array(
       'field_name' => drupal_strtolower($this->randomName()),
@@ -122,13 +123,15 @@ function testLinkTitle() {
       'entity_type' => 'test_entity',
       'bundle' => 'test_bundle',
       'settings' => array(
+        'anchor_text' => DRUPAL_OPTIONAL,
         'title' => DRUPAL_OPTIONAL,
       ),
       'widget' => array(
         'type' => 'link_default',
         'settings' => array(
-          'placeholder_url' => 'http://example.com',
-          'placeholder_title' => 'Enter a title for this link',
+          'placeholder_url' => 'http://example2.com',
+          'placeholder_anchor_text' => 'Enter anchor text for this link',
+          'placeholder_title' => 'Enter title attribute for this link',
         ),
       ),
     );
@@ -142,57 +145,63 @@ function testLinkTitle() {
 
     $langcode = LANGUAGE_NOT_SPECIFIED;
 
-    // Verify that the title field works according to the field setting.
-    foreach (array(DRUPAL_DISABLED, DRUPAL_REQUIRED, DRUPAL_OPTIONAL) as $title_setting) {
-      // Update the title field setting.
-      $this->instance['settings']['title'] = $title_setting;
+    // Verify that the anchor text field works according to the field setting.
+    foreach (array(DRUPAL_DISABLED, DRUPAL_REQUIRED, DRUPAL_OPTIONAL) as $anchor_text_setting) {
+      // Update the anchor text field setting.
+      $this->instance['settings']['anchor_text'] = $anchor_text_setting;
       field_update_instance($this->instance);
 
       // Display creation form.
       $this->drupalGet('test-entity/add/test_bundle');
       $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][url]", '', 'URL field found.');
-      $this->assertRaw('placeholder="http://example.com"');
+      $this->assertRaw('placeholder="http://example2.com"');
 
-      if ($title_setting === DRUPAL_DISABLED) {
-        $this->assertNoFieldByName("{$this->field['field_name']}[$langcode][0][title]", '', 'Title field not found.');
-        $this->assertNoRaw('placeholder="Enter a title for this link"');
+      if ($anchor_text_setting === DRUPAL_DISABLED) {
+        $this->assertNoFieldByName("{$this->field['field_name']}[$langcode][0][anchor_text]", '', 'Anchor text field not found.');
+#        $this->assertNoRaw('placeholder="Enter a title for this link"');
+        $this->assertRaw('placeholder="Enter anchor text for this link"');
+#        $this->assertNoRaw('placeholder="Enter anchor text attribute for this link"');
       }
       else {
-        $this->assertRaw('placeholder="Enter a title for this link"');
-
-        $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][title]", '', 'Title field found.');
-        if ($title_setting === DRUPAL_REQUIRED) {
+#        $this->assertRaw('placeholder="Enter a title for this link"');
+        $this->assertRaw('placeholder="Enter anchor text for this link"');
+#        $this->assertRaw('placeholder="Enter title attribute for this link"');
+        $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][anchor_text]", '', 'Anchor text field found.');
+        if ($anchor_text_setting === DRUPAL_REQUIRED) {
           // Verify that the title is required, if the URL is non-empty.
           $edit = array(
-            "{$this->field['field_name']}[$langcode][0][url]" => 'http://www.example.com',
+            "{$this->field['field_name']}[$langcode][0][url]" => 'http://www.example3.com',
           );
           $this->drupalPost(NULL, $edit, t('Save'));
-          $this->assertText(t('!name field is required.', array('!name' => t('Title'))));
+          $this->assertText(t('!name field is required.', array('!name' => t('Anchor text'))));
 
-          // Verify that the title is not required, if the URL is empty.
+          // Verify that the anchor text is not required, if the URL is empty.
           $edit = array(
             "{$this->field['field_name']}[$langcode][0][url]" => '',
           );
           $this->drupalPost(NULL, $edit, t('Save'));
-          $this->assertNoText(t('!name field is required.', array('!name' => t('Title'))));
+          $this->assertNoText(t('!name field is required.', array('!name' => t('Anchor text'))));
 
-          // Verify that a URL and title meets requirements.
+          // Verify that a URL and anchor text meets requirements.
           $this->drupalGet('test-entity/add/test_bundle');
           $edit = array(
-            "{$this->field['field_name']}[$langcode][0][url]" => 'http://www.example.com',
-            "{$this->field['field_name']}[$langcode][0][title]" => 'Example',
+            "{$this->field['field_name']}[$langcode][0][url]" => 'http://www.example3.com',
+            "{$this->field['field_name']}[$langcode][0][anchor_text]" => 'Example',
           );
           $this->drupalPost(NULL, $edit, t('Save'));
-          $this->assertNoText(t('!name field is required.', array('!name' => t('Title'))));
+          $this->assertNoText(t('!name field is required.', array('!name' => t('Anchor text'))));
         }
       }
     }
 
-    // Verify that a link without title is rendered using the URL as link text.
-    $value = 'http://www.example.com/';
+    // Verify that a link without anchor text is rendered using the URL as link text.
+    $value = 'http://www.example3.com/';
+    $link_attributes['#options']['attributes']['title'] = 'Example title';
+
     $edit = array(
       "{$this->field['field_name']}[$langcode][0][url]" => $value,
-      "{$this->field['field_name']}[$langcode][0][title]" => '',
+      "{$this->field['field_name']}[$langcode][0][anchor_text]" => $value,
+#      "{$this->field['field_name']}[$langcode][0][title]" => $link_attributes,
     );
     $this->drupalPost(NULL, $edit, t('Save'));
     preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
@@ -200,19 +209,27 @@ function testLinkTitle() {
     $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)));
 
     $this->renderTestEntity($id);
-    $expected_link = l($value, $value);
+    $expected_link = l($value, $value, $link_attributes);
     $this->assertRaw($expected_link);
 
-    // Verify that a link with title is rendered using the title as link text.
+    // Verify that a link with anchor text is rendered using the title as link text.
+    $anchor_text = $this->randomName();
     $title = $this->randomName();
+
     $edit = array(
-      "{$this->field['field_name']}[$langcode][0][title]" => $title,
+      "{$this->field['field_name']}[$langcode][0][anchor_text]" => $anchor_text,
+#      "{$this->field['field_name']}[$langcode][0][title]" => $title,
     );
     $this->drupalPost("test-entity/manage/$id/edit", $edit, t('Save'));
     $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)));
 
+    $link_attributes['#options']['attributes']['title'] = $title;
+// print_r($link_attributes);
+// Array ( [options] => Array ( [title] => aA3scJST 
+// $element[$delta]['#options']['attributes']['title'] = $item['title'];
+
     $this->renderTestEntity($id);
-    $expected_link = l($title, $value);
+    $expected_link = l($anchor_text, $value, $link_attributes);
     $this->assertRaw($expected_link);
   }
 
@@ -232,6 +249,7 @@ function testLinkFormatter() {
       'entity_type' => 'test_entity',
       'bundle' => 'test_bundle',
       'settings' => array(
+        'anchor_text' => DRUPAL_OPTIONAL,
         'title' => DRUPAL_OPTIONAL,
       ),
       'widget' => array(
@@ -257,15 +275,15 @@ function testLinkFormatter() {
     $this->drupalGet('test-entity/add/test_bundle');
     $url1 = 'http://www.example.com/content/articles/archive?author=John&year=2012#com';
     $url2 = 'http://www.example.org/content/articles/archive?author=John&year=2012#org';
-    $title1 = $url1;
+    $anchor_text1 = $url1;
     // Intentionally contains an ampersand that needs sanitization on output.
-    $title2 = 'A very long & strange example title that could break the nice layout of the site';
+    $anchor_text2 = 'A very long & strange example title that could break the nice layout of the site';
     $edit = array(
       "{$this->field['field_name']}[$langcode][0][url]" => $url1,
-      // Note that $title1 is not submitted.
-      "{$this->field['field_name']}[$langcode][0][title]" => '',
+      // Note that $anchor_text1 is not submitted.
+      "{$this->field['field_name']}[$langcode][0][anchor_text]" => '',
       "{$this->field['field_name']}[$langcode][1][url]" => $url2,
-      "{$this->field['field_name']}[$langcode][1][title]" => $title2,
+      "{$this->field['field_name']}[$langcode][1][anchor_text]" => $anchor_text2,
     );
     $this->drupalPost(NULL, $edit, t('Save'));
     preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
@@ -305,31 +323,31 @@ function testLinkFormatter() {
         switch ($setting) {
           case 'trim_length':
             $url = $url1;
-            $title = isset($new_value) ? truncate_utf8($title1, $new_value, FALSE, TRUE) : $title1;
-            $this->assertRaw('<a href="' . check_plain($url) . '">' . check_plain($title) . '</a>');
+            $anchor_text = isset($new_value) ? truncate_utf8($anchor_text1, $new_value, FALSE, TRUE) : $anchor_text1;
+            $this->assertRaw('<a href="' . check_plain($url) . '">' . check_plain($anchor_text) . '</a>');
 
             $url = $url2;
-            $title = isset($new_value) ? truncate_utf8($title2, $new_value, FALSE, TRUE) : $title2;
-            $this->assertRaw('<a href="' . check_plain($url) . '">' . check_plain($title) . '</a>');
+            $anchor_text = isset($new_value) ? truncate_utf8($anchor_text2, $new_value, FALSE, TRUE) : $anchor_text2;
+            $this->assertRaw('<a href="' . check_plain($url) . '">' . check_plain($anchor_text) . '</a>');
             break;
 
           case 'rel':
             $rel = isset($new_value) ? ' rel="' . $new_value . '"' : '';
-            $this->assertRaw('<a href="' . check_plain($url1) . '"' . $rel . '>' . check_plain($title1) . '</a>');
-            $this->assertRaw('<a href="' . check_plain($url2) . '"' . $rel . '>' . check_plain($title2) . '</a>');
+            $this->assertRaw('<a href="' . check_plain($url1) . '"' . $rel . '>' . check_plain($anchor_text1) . '</a>');
+            $this->assertRaw('<a href="' . check_plain($url2) . '"' . $rel . '>' . check_plain($anchor_text2) . '</a>');
             break;
 
           case 'target':
             $target = isset($new_value) ? ' target="' . $new_value . '"' : '';
-            $this->assertRaw('<a href="' . check_plain($url1) . '"' . $target . '>' . check_plain($title1) . '</a>');
-            $this->assertRaw('<a href="' . check_plain($url2) . '"' . $target . '>' . check_plain($title2) . '</a>');
+            $this->assertRaw('<a href="' . check_plain($url1) . '"' . $target . '>' . check_plain($anchor_text1) . '</a>');
+            $this->assertRaw('<a href="' . check_plain($url2) . '"' . $target . '>' . check_plain($anchor_text2) . '</a>');
             break;
 
           case 'url_only':
             // In this case, $new_value is an array.
             if (!$new_value['url_only']) {
-              $this->assertRaw('<a href="' . check_plain($url1) . '">' . check_plain($title1) . '</a>');
-              $this->assertRaw('<a href="' . check_plain($url2) . '">' . check_plain($title2) . '</a>');
+              $this->assertRaw('<a href="' . check_plain($url1) . '">' . check_plain($anchor_text1) . '</a>');
+              $this->assertRaw('<a href="' . check_plain($url2) . '">' . check_plain($anchor_text2) . '</a>');
             }
             else {
               if (empty($new_value['url_plain'])) {
@@ -368,6 +386,7 @@ function testLinkSeparateFormatter() {
       'entity_type' => 'test_entity',
       'bundle' => 'test_bundle',
       'settings' => array(
+        'anchor_text' => DRUPAL_OPTIONAL,
         'title' => DRUPAL_OPTIONAL,
       ),
       'widget' => array(
@@ -387,18 +406,20 @@ function testLinkSeparateFormatter() {
 
     // Create an entity with two link field values:
     // - The first field item uses a URL only.
-    // - The second field item uses a URL and title.
-    // For consistency in assertion code below, the URL is assigned to the title
+    // - The second field item uses a URL and anchor text.
+    // For consistency in assertion code below, the URL is assigned to the anchor_text
     // variable for the first field.
     $this->drupalGet('test-entity/add/test_bundle');
     $url1 = 'http://www.example.com/content/articles/archive?author=John&year=2012#com';
     $url2 = 'http://www.example.org/content/articles/archive?author=John&year=2012#org';
     // Intentionally contains an ampersand that needs sanitization on output.
-    $title2 = 'A very long & strange example title that could break the nice layout of the site';
+    $anchor_text2 = 'A very long & strange example anchor text that could break the nice layout of the site';
     $edit = array(
       "{$this->field['field_name']}[$langcode][0][url]" => $url1,
       "{$this->field['field_name']}[$langcode][1][url]" => $url2,
-      "{$this->field['field_name']}[$langcode][1][title]" => $title2,
+      "{$this->field['field_name']}[$langcode][0][anchor_text]" => $url1,
+      "{$this->field['field_name']}[$langcode][1][anchor_text]" => $anchor_text2,
+      "{$this->field['field_name']}[$langcode][1][anchor_text]" => $anchor_text2,
     );
     $this->drupalPost(NULL, $edit, t('Save'));
     preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
@@ -423,18 +444,18 @@ function testLinkSeparateFormatter() {
         switch ($setting) {
           case 'trim_length':
             $url = $url1;
-            $url_title = isset($new_value) ? truncate_utf8($url, $new_value, FALSE, TRUE) : $url;
+            $url_anchor_text = isset($new_value) ? truncate_utf8($url, $new_value, FALSE, TRUE) : $url;
             $expected = '<div class="link-item">';
-            $expected .= '<div class="link-url"><a href="' . check_plain($url) . '">' . check_plain($url_title) . '</a></div>';
+            $expected .= '<div class="link-url"><a href="' . check_plain($url) . '">' . check_plain($url_anchor_text) . '</a></div>';
             $expected .= '</div>';
             $this->assertRaw($expected);
 
             $url = $url2;
-            $url_title = isset($new_value) ? truncate_utf8($url, $new_value, FALSE, TRUE) : $url;
-            $title = isset($new_value) ? truncate_utf8($title2, $new_value, FALSE, TRUE) : $title2;
+            $url_anchor_text = isset($new_value) ? truncate_utf8($url, $new_value, FALSE, TRUE) : $url;
+            $anchor_text = isset($new_value) ? truncate_utf8($anchor_text2, $new_value, FALSE, TRUE) : $anchor_text2;
             $expected = '<div class="link-item">';
-            $expected .= '<div class="link-title">' . check_plain($title) . '</div>';
-            $expected .= '<div class="link-url"><a href="' . check_plain($url) . '">' . check_plain($url_title) . '</a></div>';
+            $expected .= '<div class="link-anchor-text">' . check_plain($anchor_text) . '</div>';
+            $expected .= '<div class="link-url"><a href="' . check_plain($url) . '">' . check_plain($url_anchor_text) . '</a></div>';
             $expected .= '</div>';
             $this->assertRaw($expected);
             break;
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;
 }
