diff --git a/core/modules/contact/contact.views.inc b/core/modules/contact/contact.views.inc
new file mode 100644
index 0000000..6795b0e
--- /dev/null
+++ b/core/modules/contact/contact.views.inc
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Provide views data for contact.module.
+ *
+ * @ingroup views_module_handlers
+ */
+
+/**
+ * Implements hook_views_data_alter().
+ */
+function contact_views_data_alter(&$data) {
+  $data['users']['contact'] = array(
+    'field' => array(
+      'title' => t('Contact link'),
+      'help' => t('Provide a simple link to the user contact page.'),
+      'id' => 'contact_link',
+    ),
+  );
+}
diff --git a/core/modules/contact/lib/Drupal/contact/Plugin/views/field/ContactLink.php b/core/modules/contact/lib/Drupal/contact/Plugin/views/field/ContactLink.php
new file mode 100644
index 0000000..18a9560
--- /dev/null
+++ b/core/modules/contact/lib/Drupal/contact/Plugin/views/field/ContactLink.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\contact\Plugin\views\field\ContactLink.
+ */
+
+namespace Drupal\contact\Plugin\views\field;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\user\Plugin\views\field\Link;
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a field that links to the user contact page, if access is permitted.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @Plugin(
+ *   id = "contact_link",
+ *   module = "contact"
+ * )
+ */
+class ContactLink extends Link {
+
+  /**
+   * Overrides \Drupal\user\Plugin\views\field\Link::init().
+   */
+  public function buildOptionsForm(&$form, &$form_state) {
+    $form['text']['#title'] = t('Link label');
+    $form['text']['#required'] = TRUE;
+    $form['text']['#default_value'] = empty($this->options['text']) ? t('contact') : $this->options['text'];
+    parent::buildOptionsForm($form, $form_state);
+  }
+
+  /**
+   * Overrides \Drupal\user\Plugin\views\field\Link::access().
+   */
+  public function access() {
+    // The access logic is implemented per row.
+    return TRUE;
+  }
+
+
+  /**
+   * Overrides \Drupal\user\Plugin\views\field\Link::render_link().
+   *
+   * @see _contact_personal_tab_access
+   */
+  public function render_link(EntityInterface $entity, \stdClass $values) {
+
+    if (empty($entity)) {
+      return;
+    }
+
+    // Check access when we pull up the user account so we know
+    // if the user has made the contact page available.
+    $uid = $entity->id();
+
+    $path = "user/$uid/contact";
+    if (!_contact_personal_tab_access($entity)) {
+      return;
+    }
+
+    $this->options['alter']['make_link'] = TRUE;
+    $this->options['alter']['path'] = $path;
+
+    $title = t('Contact %user', array('%user' => $entity->name));
+    $this->options['alter']['attributes'] = array('title' => $title);
+
+    if (!empty($this->options['text'])) {
+      return $this->options['text'];
+    }
+    else {
+      return $title;
+    }
+  }
+
+}
diff --git a/core/modules/contact/lib/Drupal/contact/Tests/Views/ContactLinkTest.php b/core/modules/contact/lib/Drupal/contact/Tests/Views/ContactLinkTest.php
new file mode 100644
index 0000000..66f88f7
--- /dev/null
+++ b/core/modules/contact/lib/Drupal/contact/Tests/Views/ContactLinkTest.php
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\contact\Tests\Views\ContactLinkTest.
+ */
+
+namespace Drupal\contact\Tests\Views;
+
+use Drupal\views\Tests\ViewTestBase;
+use Drupal\views\Tests\ViewTestData;
+
+/**
+ * Tests the contact link field.
+ *
+ * @see \Drupal\contact\Plugin\views\field\ContactLink.
+ */
+class ContactLinkTest extends ViewTestBase {
+  /**
+   * Stores the user data service used by the test.
+   *
+   * @var \Drupal\user\UserDataInterface
+   */
+  public $userData;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('contact', 'contact_test_views');
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_contact_link');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Contact: Link Field',
+      'description' => 'Tests the contact link field.',
+      'group' => 'Views Modules',
+    );
+  }
+
+  protected function setUp() {
+    parent::setUp();
+
+    ViewTestData::importTestViews(get_class($this), array('contact_test_views'));
+
+    $this->userData = drupal_container()->get('user.data');
+  }
+
+
+  /**
+   * Tests contact link.
+   */
+  protected function testContactLink() {
+    $accounts = array();
+    $accounts['root'] = user_load(1);
+    // Create an account with access to all contact pages.
+    $admin_account = $this->drupalCreateUser(array('administer users'));
+    $accounts['admin'] = $admin_account;
+    // Create an account with no access to contact pages.
+    $no_contact_account = $this->drupalCreateUser();
+    $accounts['no_contact'] = $no_contact_account;
+
+    // Create an account with access to contact pages.
+    $contact_account = $this->drupalCreateUser(array('access user contact forms'));
+    $accounts['contact'] = $contact_account;
+
+    $this->drupalLogin($admin_account);
+    $this->drupalGet('test-contact-link');
+    // The admin user has access to all contact links beside his own.
+    $this->assertContactLinks($accounts, array('root', 'no_contact', 'contact'));
+
+    $this->drupalLogin($no_contact_account);
+    $this->drupalGet('test-contact-link');
+    // Ensure that the user without the permission doesn't see any link.
+    $this->assertContactLinks($accounts, array());
+
+    $this->drupalLogin($contact_account);
+    $this->drupalGet('test-contact-link');
+    $this->assertContactLinks($accounts, array('root', 'admin', 'no_contact'));
+
+    // Disable contact link for no_contact.
+    $this->userData->set('contact', $no_contact_account->id(), 'enabled', FALSE);
+    $this->drupalGet('test-contact-link');
+    $this->assertContactLinks($accounts, array('root', 'admin'));
+  }
+
+  /**
+   * Asserts whether certain users contact links appear on the page.
+   *
+   * @param array $accounts
+   *   All user objects used by the test.
+   * @param array $names
+   *   Users which should have contact links.
+   */
+  protected function assertContactLinks(array $accounts, array $names) {
+    $result = $this->xpath('//div[contains(@class, "views-field-contact")]//a');
+    $this->assertEqual(count($result), count($names));
+    foreach ($names as $name) {
+      $account = $accounts[$name];
+
+      $uri = $account->uri();
+      $contact_uri = $uri['path'] . '/contact';
+      $result = $this->xpath('//div[contains(@class, "views-field-contact")]//a[contains(@href, :uri)]', array(':uri' => $contact_uri));
+      $this->assertTrue(count($result));
+    }
+  }
+
+}
diff --git a/core/modules/contact/tests/modules/contact_test_views/contact_test_views.info b/core/modules/contact/tests/modules/contact_test_views/contact_test_views.info
new file mode 100644
index 0000000..ceb41fc
--- /dev/null
+++ b/core/modules/contact/tests/modules/contact_test_views/contact_test_views.info
@@ -0,0 +1,8 @@
+name = Contact test views
+description = Provides default views for views contact tests.
+package = Testing
+version = VERSION
+core = 8.x
+dependencies[] = contact
+dependencies[] = views
+hidden = TRUE
diff --git a/core/modules/contact/tests/modules/contact_test_views/contact_test_views.module b/core/modules/contact/tests/modules/contact_test_views/contact_test_views.module
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/core/modules/contact/tests/modules/contact_test_views/contact_test_views.module
@@ -0,0 +1 @@
+<?php
diff --git a/core/modules/contact/tests/modules/contact_test_views/test_views/views.view.test_contact_link.yml b/core/modules/contact/tests/modules/contact_test_views/test_views/views.view.test_contact_link.yml
new file mode 100644
index 0000000..04d5699
--- /dev/null
+++ b/core/modules/contact/tests/modules/contact_test_views/test_views/views.view.test_contact_link.yml
@@ -0,0 +1,119 @@
+base_field: uid
+base_table: users
+core: 8.x
+description: ''
+status: '1'
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: ''
+    display_options:
+      access:
+        type: perm
+        perm: 'access user profiles'
+      cache:
+        type: none
+      query:
+        type: views_query
+      exposed_form:
+        type: basic
+      pager:
+        type: full
+      style:
+        type: default
+      row:
+        type: fields
+      fields:
+        name:
+          id: name
+          table: users
+          field: name
+          label: ''
+          alter:
+            alter_text: '0'
+            make_link: '0'
+            absolute: '0'
+            trim: '0'
+            word_boundary: '0'
+            ellipsis: '0'
+            strip_tags: '0'
+            html: '0'
+          hide_empty: '0'
+          empty_zero: '0'
+          link_to_user: '1'
+          overwrite_anonymous: '0'
+          plugin_id: 'user_name'
+        contact:
+          id: contact
+          table: users
+          field: contact
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: 'Link to contact page'
+          exclude: '0'
+          alter:
+            alter_text: '0'
+            text: ''
+            make_link: '0'
+            path: ''
+            absolute: '0'
+            external: '0'
+            replace_spaces: '0'
+            path_case: none
+            trim_whitespace: '0'
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: '0'
+            max_length: ''
+            word_boundary: '1'
+            ellipsis: '1'
+            more_link: '0'
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: '0'
+            trim: '0'
+            preserve_tags: ''
+            html: '0'
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: '1'
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: '1'
+          empty: ''
+          hide_empty: '0'
+          empty_zero: '0'
+          hide_alter_empty: '1'
+          text: ''
+          plugin_id: 'contact_link'
+      filters:
+        status:
+          value: '1'
+          table: users
+          field: status
+          id: status
+          expose:
+            operator: '0'
+          group: '1'
+          plugin_id: boolean
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: ''
+    display_options:
+      path: test-contact-link
+human_name: test_contact_link
+module: views
+langcode: en
+id: test_contact_link
+tag: ''
