diff --git a/core/modules/views/lib/Drupal/views/Tests/Node/RowPluginTest.php b/core/modules/views/lib/Drupal/views/Tests/Node/RowPluginTest.php
new file mode 100644
index 0000000..ae2d014
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Node/RowPluginTest.php
@@ -0,0 +1,197 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\Tests\Node\RowPluginTest.
+ */
+
+namespace Drupal\views\Tests\Node;
+
+/**
+ * Tests the node row plugin.
+ *
+ * @see Views\node\Plugin\views\row\View
+ */
+class RowPluginTest extends NodeTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('node', 'comment');
+
+
+  /**
+   * Contains all comments keyed by node used by the test.
+   *
+   * @var array
+   */
+  protected $comments;
+
+  /**
+   * Contains all nodes used by this test.
+   *
+   * @var array
+   */
+  protected $nodes;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node: Row plugin',
+      'description' => 'Tests the node row plugin.',
+      'group' => 'Views Modules',
+    );
+  }
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->drupalCreateContentType(array('type' => 'article'));
+
+    // Create two nodes, with 5 comments on all of them.
+    for ($i = 0; $i < 2; $i++) {
+      $this->nodes[] = $this->drupalCreateNode(
+        array(
+          'type' => 'article',
+          'body' => array(
+            LANGUAGE_NOT_SPECIFIED => array(
+              array(
+                'value' => $this->randomName(42),
+                'format' => 'filtered_html',
+                'summary' => $this->randomName()
+              )
+            )
+          )
+        )
+      );
+    }
+
+    foreach ($this->nodes as $node) {
+      for ($i = 0; $i < 5; $i++) {
+        $this->comments[$node->id()][] = $this->drupalCreateComment(array('nid' => $node->id()));
+      }
+    }
+
+    // Add text formats.
+    $filtered_html_format = array(
+      'format' => 'filtered_html',
+      'name' => 'Filtered HTML',
+      'weight' => 0,
+      'filters' => array(
+        // URL filter.
+        'filter_url' => array(
+          'weight' => 0,
+          'status' => 1,
+        ),
+        // HTML filter.
+        'filter_html' => array(
+          'weight' => 1,
+          'status' => 1,
+        ),
+        // Line break filter.
+        'filter_autop' => array(
+          'weight' => 2,
+          'status' => 1,
+        ),
+        // HTML corrector filter.
+        'filter_htmlcorrector' => array(
+          'weight' => 10,
+          'status' => 1,
+        ),
+      ),
+    );
+    $filtered_html_format = (object) $filtered_html_format;
+    filter_format_save($filtered_html_format);
+  }
+
+  /**
+   * Helper function to create a random comment.
+   *
+   * @param array $settings
+   *   (optional) An associative array of settings for the comment, as used in
+   *   entity_create().
+   *
+   * @return \Drupal\comment\Plugin\Core\Entity\Comment
+   *   Returns the created and saved comment.
+   */
+  public function drupalCreateComment(array $settings = array()) {
+    $node = node_load($settings['nid']);
+    $settings += array(
+      'subject' => $this->randomName(),
+      'bundle' => "comment_node_{$node->type}",
+      'comment_body' => array(LANGUAGE_NOT_SPECIFIED => array(array('value' => $this->randomName(40))))
+    );
+
+    $comment = entity_create('comment', $settings);
+    $comment->save();
+    return $comment;
+  }
+
+  /**
+   * Tests the node row plugin.
+   */
+  public function testRowPlugin() {
+    $view = views_get_view('test_node_row_plugin');
+    $view->initDisplay();
+    $view->setDisplay('page');
+    $view->initStyle();
+    $view->style_plugin->row_plugin->options['view_mode'] = 'full';
+
+    // Test with view_mode full.
+    $output = $view->preview();
+    foreach ($this->nodes as $node) {
+      $body = $node->body;
+      $teaser = $body[LANGUAGE_NOT_SPECIFIED][0]['summary'];
+      $full = $body[LANGUAGE_NOT_SPECIFIED][0]['value'];
+      $this->assertFalse(strpos($output, $teaser) !== FALSE, 'Make sure the teaser appears in the output of the view.');
+      $this->assertTrue(strpos($output, $full) !== FALSE, 'Make sure the full text appears in the output of the view.');
+    }
+
+    // Test with teasers.
+    $view->style_plugin->row_plugin->options['view_mode'] = 'teaser';
+    $output = $view->preview();
+    foreach ($this->nodes as $node) {
+      $body = $node->body;
+      $teaser = $body[LANGUAGE_NOT_SPECIFIED][0]['summary'];
+      $full = $body[LANGUAGE_NOT_SPECIFIED][0]['value'];
+      $this->assertTrue(strpos($output, $teaser) !== FALSE, 'Make sure the teaser appears in the output of the view.');
+      $this->assertFalse(strpos($output, $full) !== FALSE, 'Make sure the full text does not appears in the output of the view if teaser is set as viewmode.');
+    }
+
+    // Test with links disabled.
+    $view->style_plugin->row_plugin->options['links'] = FALSE;
+    $output = $view->preview();
+    $this->drupalSetContent($output);
+    foreach ($this->nodes as $node) {
+      $this->assertFalse($this->xpath('//li[contains(@class, :class)]/a[contains(@href, :href)]', array(':class' => 'node-readmore', ':href' => "node/{$node->id()}")), 'Make sure no readmore link appears.');
+    }
+
+    // Test with links enabled.
+    $view->style_plugin->row_plugin->options['links'] = TRUE;
+    $output = $view->preview();
+    $this->drupalSetContent($output);
+    foreach ($this->nodes as $node) {
+      $this->assertTrue($this->xpath('//li[contains(@class, :class)]/a[contains(@href, :href)]', array(':class' => 'node-readmore', ':href' => "node/{$node->id()}")), 'Make sure no readmore link appears.');
+    }
+
+    // Tests with comments enabled.
+    $view->style_plugin->row_plugin->options['comments'] = TRUE;
+    $output = $view->preview();
+    foreach ($this->nodes as $node) {
+      foreach ($this->comments[$node->id()] as $comment) {
+        $this->assertTrue(strpos($output, $comment->comment_body[LANGUAGE_NOT_SPECIFIED][0]['value']) !== FALSE, 'Make sure the comment appears in the output.');
+      }
+    }
+
+    // Test with comments disabled.
+    $view->style_plugin->row_plugin->options['comments'] = FALSE;
+    $output = $view->preview();
+    foreach ($this->nodes as $node) {
+      foreach ($this->comments[$node->id()] as $comment) {
+        $this->assertFalse(strpos($output, $comment->comment_body[LANGUAGE_NOT_SPECIFIED][0]['value']) !== FALSE, 'Make sure the comment does not appears in the output when the comments option disabled.');
+      }
+    }
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewTestBase.php b/core/modules/views/lib/Drupal/views/Tests/ViewTestBase.php
index 751d62b..fc8e868 100644
--- a/core/modules/views/lib/Drupal/views/Tests/ViewTestBase.php
+++ b/core/modules/views/lib/Drupal/views/Tests/ViewTestBase.php
@@ -6,6 +6,7 @@
 
 namespace Drupal\views\Tests;
 
+use DOMDocument;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -154,6 +155,55 @@ protected function helperCompareFunction($a, $b) {
     return $this->sort_order * (($value1 < $value2) ? -1 : 1);
   }
 
+
+  /**
+   * Parse a content and return the html element.
+   *
+   * @param string $content
+   *   The html to parse.
+   *
+   * @return array
+   *   An array containing simplexml objects.
+   */
+  protected function parseContent($content) {
+    $htmlDom = new DOMDocument();
+    @$htmlDom->loadHTML('<?xml encoding="UTF-8">' . $content);
+    $elements = simplexml_import_dom($htmlDom);
+
+    return $elements;
+  }
+
+  /**
+   * Performs an xpath search on a certain content.
+   *
+   * The search is relative to the root element of the $content variable.
+   *
+   * @param string $content
+   *   The html to parse.
+   * @param string $xpath
+   *   The xpath string to use in the search.
+   * @param array $arguments
+   *   Some arguments for the xpath.
+   *
+   * @return array|FALSE
+   *   The return value of the xpath search. For details on the xpath string
+   *   format and return values see the SimpleXML documentation,
+   *   http://php.net/manual/function.simplexml-element-xpath.php.
+   */
+  protected function xpathContent($content, $xpath, array $arguments = array()) {
+    if ($elements = $this->parseContent($content)) {
+      $xpath = $this->buildXPathQuery($xpath, $arguments);
+      $result = $elements->xpath($xpath);
+      // Some combinations of PHP / libxml versions return an empty array
+      // instead of the documented FALSE. Forcefully convert any falsish values
+      // to an empty array to allow foreach(...) constructions.
+      return $result ? $result : array();
+    }
+    else {
+      return FALSE;
+    }
+  }
+
   /**
    * Helper function to check whether a button with a certain id exists and has a certain label.
    */
diff --git a/core/modules/views/tests/views_test_config/config/views.view.test_node_row_plugin.yml b/core/modules/views/tests/views_test_config/config/views.view.test_node_row_plugin.yml
new file mode 100644
index 0000000..d67176c
--- /dev/null
+++ b/core/modules/views/tests/views_test_config/config/views.view.test_node_row_plugin.yml
@@ -0,0 +1,56 @@
+api_version: '3.0'
+base_field: nid
+base_table: node
+core: 8.0-dev
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: perm
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      filters:
+        status:
+          expose:
+            operator: '0'
+          field: status
+          group: '1'
+          id: status
+          table: node
+          value: '1'
+      pager:
+        options:
+          items_per_page: '10'
+        type: full
+      query:
+        type: views_query
+      row:
+        options:
+          build_mode: teaser
+          comments: '0'
+          links: '1'
+        type: node
+      sorts: {  }
+      style:
+        type: default
+      title: test_node_row_plugin
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: {  }
+  page:
+    display_options:
+      path: test-node-row-plugin
+    display_plugin: page
+    display_title: Page
+    id: page
+    position: {  }
+human_name: test_node_row_plugin
+langcode: und
+module: views
+name: test_node_row_plugin
+tag: default
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 6347df6..84e1f02 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -335,6 +335,7 @@ function views_plugin_list() {
  * node portion of the theme registry.
  */
 function views_preprocess_node(&$vars) {
+  module_load_include('inc', 'node', 'node.views');
   // The 'view' attribute of the node is added in views_preprocess_node()
   if (!empty($vars['node']->view) && $vars['node']->view->storage->get('name')) {
     $vars['view'] = $vars['node']->view;
@@ -351,7 +352,7 @@ function views_preprocess_node(&$vars) {
   }
 
   // Allow to alter comments and links based on the settings in the row plugin.
-  if (!empty($vars['view']->style_plugin->row_plugin) && get_class($vars['view']->style_plugin->row_plugin) == 'views_plugin_row_node_view') {
+  if (!empty($vars['view']->style_plugin->row_plugin) && $vars['view']->style_plugin->row_plugin->getPluginId() == 'node') {
     node_row_node_view_preprocess_node($vars);
   }
 }
