diff --git a/core/modules/views/config/views.view.backlinks.yml b/core/modules/search/config/views.view.backlinks.yml
similarity index 100%
rename from core/modules/views/config/views.view.backlinks.yml
rename to core/modules/search/config/views.view.backlinks.yml
diff --git a/core/modules/search/lib/Drupal/search/Tests/Views/BackLinksViewTest.php b/core/modules/search/lib/Drupal/search/Tests/Views/BackLinksViewTest.php
new file mode 100644
index 0000000..31a3252
--- /dev/null
+++ b/core/modules/search/lib/Drupal/search/Tests/Views/BackLinksViewTest.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search\Tests\Views\BackLinksViewTest.
+ */
+
+namespace Drupal\search\Tests\Views;
+
+/**
+ * Tests the backlinks view.
+ *
+ * @see views.views.backlinks.yml
+ */
+class BackLinksViewTest extends SearchTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search: backlinks view',
+      'description' => 'Tests the backlinks view.',
+      'group' => 'Views Modules',
+    );
+  }
+
+  /**
+   * Tests the backlinks view.
+   */
+  protected function testBacklinksView() {
+    $view = views_get_view('backlinks');
+    $this->executeView($view, array(1));
+
+    $this->assertEqual(count($view->result), 9, 'The expected amount of results got returned.');
+    $node_one_found = FALSE;
+    foreach ($view->result as $row) {
+      if ($row->nid == 1) {
+        break;
+        $node_one_found = TRUE;
+      }
+    }
+    $this->assertFalse($node_one_found, 'The first node does not reference itself.');
+
+  }
+
+}
diff --git a/core/modules/search/lib/Drupal/search/Tests/Views/SearchTestBase.php b/core/modules/search/lib/Drupal/search/Tests/Views/SearchTestBase.php
new file mode 100644
index 0000000..e35c77b
--- /dev/null
+++ b/core/modules/search/lib/Drupal/search/Tests/Views/SearchTestBase.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search\Tests\Views\SearchTestBase.
+ */
+
+namespace Drupal\search\Tests\Views;
+
+use Drupal\views\Tests\ViewTestBase;
+
+/**
+ * Provides a base class for testing views search integration.
+ */
+abstract class SearchTestBase extends ViewTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('node', 'search');
+
+  /**
+   * Overrides \Drupal\views\Tests\ViewTestBase::setUp().
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Setup 10 nodes with links back to the first node.
+    for ($i = 0; $i < 10; $i++) {
+      $node = $this->drupalCreateNode();
+      $node->body[LANGUAGE_NOT_SPECIFIED][0]['value'] = $i != 0 ? l('Node ' . 1, 'node/' . 1) : '';
+      $node->save();
+
+      search_index($node->nid, 'node', $node->body[LANGUAGE_NOT_SPECIFIED][0]['value'], LANGUAGE_NOT_SPECIFIED);
+    }
+  }
+
+}
diff --git a/core/modules/search/search.views.inc b/core/modules/search/search.views.inc
new file mode 100644
index 0000000..a0207a8
--- /dev/null
+++ b/core/modules/search/search.views.inc
@@ -0,0 +1,129 @@
+<?php
+
+/**
+ * @file
+ * Provide views data and handlers for search.module.
+ *
+ * @ingroup views_module_handlers
+ */
+
+/**
+ * Implements hook_views_data().
+ */
+function search_views_data() {
+
+  $data['search_index']['table']['group']  = t('Search');
+
+  $data['search_index']['table']['join'] = array(
+    'node' => array(
+      'left_field' => 'nid',
+      'field' => 'sid',
+    ),
+  );
+
+  $data['search_total']['table']['join'] = array(
+    'node' => array(
+      'left_table' => 'search_index',
+      'left_field' => 'word',
+      'field' => 'word',
+    ),
+    'users' => array(
+      'left_table' => 'search_index',
+      'left_field' => 'word',
+      'field' => 'word',
+    )
+  );
+
+  $data['search_dataset']['table']['join'] = array(
+    'node' => array(
+      'left_table' => 'search_index',
+      'left_field' => 'sid',
+      'field' => 'sid',
+      'extra' => 'search_index.type = search_dataset.type',
+      'type' => 'INNER',
+    ),
+    'users' => array(
+      'left_table' => 'search_index',
+      'left_field' => 'sid',
+      'field' => 'sid',
+      'extra' => 'search_index.type = search_dataset.type',
+      'type' => 'INNER',
+    ),
+  );
+
+  $data['search_index']['score'] = array(
+    'title' => t('Score'),
+    'help' => t('The score of the search item. This will not be used if the search filter is not also present.'),
+    'field' => array(
+      'id' => 'search_score',
+      'click sortable' => TRUE,
+      'float' => TRUE,
+      'no group by' => TRUE,
+    ),
+    'sort' => array(
+      'id' => 'search_score',
+      'no group by' => TRUE,
+    ),
+  );
+
+  $data['search_node_links_from']['table']['group'] = t('Search');
+  $data['search_node_links_from']['table']['join'] = array(
+    'node' => array(
+      'arguments' => array(
+        'table' => 'search_node_links',
+        'left_table' => 'node',
+        'field' => 'nid',
+        'left_field' => 'nid',
+        'type' => 'INNER'
+      ),
+    ),
+  );
+  $data['search_node_links_from']['sid'] = array(
+    'title' => t('Links from'),
+    'help' => t('Other nodes that are linked from the node.'),
+    'argument' => array(
+      'id' => 'node_nid',
+    ),
+    'filter' => array(
+      'id' => 'equality',
+    ),
+  );
+
+  $data['search_node_links_to']['table']['group'] = t('Search');
+  $data['search_node_links_to']['table']['join'] = array(
+    'node' => array(
+      'arguments' => array(
+        'table' => 'search_node_links',
+        'left_table' => 'node',
+        'field' => 'sid',
+        'left_field' => 'nid',
+        'type' => 'INNER'
+      ),
+    ),
+  );
+  $data['search_node_links_to']['nid'] = array(
+    'title' => t('Links to'),
+    'help' => t('Other nodes that link to the node.'),
+    'argument' => array(
+      'id' => 'node_nid',
+    ),
+    'filter' => array(
+      'id' => 'equality',
+    ),
+  );
+
+  $data['search_index']['keys'] = array(
+    'title' => t('Search Terms'),
+    'help' => t('The terms to search for.'),
+    'filter' => array(
+      'id' => 'search',
+      'no group by' => TRUE,
+    ),
+    'argument' => array(
+      'id' => 'search',
+      'no group by' => TRUE,
+    ),
+  );
+
+  return $data;
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
index 1e5b72f..f673717 100644
--- a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php
@@ -20,7 +20,7 @@ class DefaultViewsTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('views', 'node', 'search', 'comment', 'taxonomy', 'block');
+  public static $modules = array('views', 'node', 'comment', 'taxonomy', 'block');
 
   /**
    * An array of argument arrays to use for default views.
@@ -99,12 +99,9 @@ protected function setUp() {
       if ($i % 2) {
         $values['promote'] = TRUE;
       }
-      $values['body'][LANGUAGE_NOT_SPECIFIED][]['value'] = l('Node ' . 1, 'node/' . 1);
 
       $node = $this->drupalCreateNode($values);
 
-      search_index($node->nid, 'node', $node->body[LANGUAGE_NOT_SPECIFIED][0]['value'], LANGUAGE_NOT_SPECIFIED);
-
       $comment = array(
         'uid' => $user->uid,
         'nid' => $node->nid,
