diff --git a/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php
index a21d496..a1483f8 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php
@@ -8,6 +8,7 @@
 namespace Drupal\simpletest;
 
 use Drupal\Core\Database\Database;
+use Symfony\Component\HttpFoundation\Request;
 
 /**
  * Base test case class for Drupal unit tests.
@@ -89,6 +90,9 @@ protected function setUp() {
     $conf['keyvalue_default'] = 'keyvalue.memory';
     $this->container
       ->register('keyvalue.memory', 'Drupal\Core\KeyValueStore\KeyValueMemoryFactory');
+    $request = Request::createFromGlobals();
+    $this->container
+      ->set('request', $request);
 
     state()->set('system.module.files', $this->moduleFiles);
     state()->set('system.theme.files', $this->themeFiles);
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldBooleanTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldBooleanTest.php
index b3d3599..6b75e28 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldBooleanTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldBooleanTest.php
@@ -7,10 +7,12 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\ViewUnitTestBase;
+
 /**
  * Tests the core Drupal\views\Plugin\views\field\Boolean handler.
  */
-class FieldBooleanTest extends HandlerTestBase {
+class FieldBooleanTest extends ViewUnitTestBase {
 
   public static function getInfo() {
     return array(
@@ -20,12 +22,6 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
   function dataSet() {
     // Use default dataset but remove the age from john and paul
     $data = parent::dataSet();
@@ -41,7 +37,8 @@ function viewsData() {
   }
 
   public function testFieldBoolean() {
-    $view = $this->getView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
 
     $view->displayHandlers['default']->overrideOption('fields', array(
       'age' => array(
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCounterTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCounterTest.php
index a39ece6..f18c49c 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCounterTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCounterTest.php
@@ -7,10 +7,12 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\ViewUnitTestBase;
+
 /**
  * Tests the Drupal\views\Plugin\views\field\Counter handler.
  */
-class FieldCounterTest extends HandlerTestBase {
+class FieldCounterTest extends ViewUnitTestBase {
 
   public static function getInfo() {
     return array(
@@ -20,14 +22,9 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
   function testSimple() {
-    $view = $this->getView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
     $view->displayHandlers['default']->overrideOption('fields', array(
       'counter' => array(
         'id' => 'counter',
@@ -44,7 +41,6 @@ function testSimple() {
     ));
     $view->preview();
 
-
     $counter = $view->style_plugin->rendered_fields[0]['counter'];
     $this->assertEqual($counter, 1, format_string('Make sure the expected number (@expected) patches with the rendered number (@counter)', array('@expected' => 1, '@counter' => $counter)));
     $counter = $view->style_plugin->rendered_fields[1]['counter'];
@@ -53,7 +49,7 @@ function testSimple() {
     $this->assertEqual($counter, 3, format_string('Make sure the expected number (@expected) patches with the rendered number (@counter)', array('@expected' => 3, '@counter' => $counter)));
     $view->destroy();
 
-    $view = $this->getView();
+    $view->setDisplay();
     $rand_start = rand(5, 10);
     $view->displayHandlers['default']->overrideOption('fields', array(
       'counter' => array(
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCustomTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCustomTest.php
index 4cc3291..1b78cf9 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCustomTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldCustomTest.php
@@ -7,10 +7,12 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\ViewUnitTestBase;
+
 /**
  * Tests the core Drupal\views\Plugin\views\field\Custom handler.
  */
-class FieldCustomTest extends HandlerTestBase {
+class FieldCustomTest extends ViewUnitTestBase {
 
   public static function getInfo() {
     return array(
@@ -20,12 +22,6 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
   function viewsData() {
     $data = parent::viewsData();
     $data['views_test_data']['name']['field']['id'] = 'custom';
@@ -33,7 +29,8 @@ function viewsData() {
   }
 
   public function testFieldCustom() {
-    $view = $this->getView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
 
     // Alter the text of the field to a random string.
     $random = $this->randomName();
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php
index 6040d40..764d573 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php
@@ -7,10 +7,12 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\ViewUnitTestBase;
+
 /**
  * Tests the core Drupal\views\Plugin\views\field\Date handler.
  */
-class FieldDateTest extends HandlerTestBase {
+class FieldDateTest extends ViewUnitTestBase {
 
   public static function getInfo() {
     return array(
@@ -20,12 +22,6 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
   function viewsData() {
     $data = parent::viewsData();
     $data['views_test_data']['created']['field']['id'] = 'date';
@@ -33,7 +29,8 @@ function viewsData() {
   }
 
   public function testFieldDate() {
-    $view = $this->getView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
 
     $view->displayHandlers['default']->overrideOption('fields', array(
       'created' => array(
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldFileSizeTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldFileSizeTest.php
index f8c0dde..9755e62 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldFileSizeTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldFileSizeTest.php
@@ -7,12 +7,14 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\ViewUnitTestBase;
+
 /**
  * Tests the core Drupal\views\Plugin\views\field\FileSize handler.
  *
  * @see CommonXssUnitTest
  */
-class FieldFileSizeTest extends HandlerTestBase {
+class FieldFileSizeTest extends ViewUnitTestBase {
 
   public static function getInfo() {
     return array(
@@ -22,12 +24,6 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
   function dataSet() {
     $data = parent::dataSet();
     $data[0]['age'] = 0;
@@ -46,7 +42,8 @@ function viewsData() {
   }
 
   public function testFieldFileSize() {
-    $view = $this->getView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
 
     $view->displayHandlers['default']->overrideOption('fields', array(
       'age' => array(
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUnitTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUnitTest.php
new file mode 100644
index 0000000..45716f5
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUnitTest.php
@@ -0,0 +1,492 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Handler\FieldUnitTest.
+ */
+
+namespace Drupal\views\Tests\Handler;
+
+use Drupal\views\Tests\ViewUnitTestBase;
+
+/**
+ * Tests the generic field handler.
+ *
+ * @see \Drupal\views\Plugin\views\field\FieldPluginBase
+ */
+class FieldUnitTest extends ViewUnitTestBase {
+
+  protected $column_map = array(
+    'views_test_data_name' => 'name',
+  );
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Field: Unit Test',
+      'description' => 'Tests the generic field handler.',
+      'group' => 'Views Handlers',
+    );
+  }
+
+  /**
+   * Overrides Drupal\views\Tests\ViewTestBase::viewsData().
+   */
+  protected function viewsData() {
+    $data = parent::viewsData();
+    $data['views_test_data']['job']['field']['id'] = 'test_field';
+    return $data;
+  }
+
+  /**
+   * Tests that the render function is called.
+   */
+  public function testRender() {
+    $view = views_get_view('test_field_tokens');
+    $this->executeView($view);
+
+    $random_text = $this->randomName();
+    $view->field['job']->setTestValue($random_text);
+    $this->assertEqual($view->field['job']->theme($view->result[0]), $random_text, 'Make sure the render method rendered the manual set value.');
+  }
+
+  /**
+   * Tests all things related to the query.
+   */
+  public function testQuery() {
+    // Tests adding additional fields to the query.
+    $view = views_get_view('test_view');
+    $view->initHandlers();
+
+    $id_field = $view->field['id'];
+    $id_field->additional_fields['job'] = 'job';
+    // Choose also a field alias key which doesn't match to the table field.
+    $id_field->additional_fields['created_test'] = array('table' => 'views_test_data', 'field' => 'created');
+    $view->build();
+
+    // Make sure the field aliases have the expected value.
+    $this->assertEqual($id_field->aliases['job'], 'views_test_data_job');
+    $this->assertEqual($id_field->aliases['created_test'], 'views_test_data_created');
+
+    $this->executeView($view);
+    // Tests the get_value method with and without a field aliases.
+    foreach ($this->dataSet() as $key => $row) {
+      $id = $key + 1;
+      $result = $view->result[$key];
+      $this->assertEqual($id_field->get_value($result), $id);
+      $this->assertEqual($id_field->get_value($result, 'job'), $row['job']);
+      $this->assertEqual($id_field->get_value($result, 'created_test'), $row['created']);
+    }
+  }
+
+  /**
+   * Assertion helper which checks whether a string is part of another string.
+   *
+   * @param string $haystack
+   *   The value to search in.
+   * @param string $needle
+   *   The value to search for.
+   * @param string $message
+   *   The message to display along with the assertion.
+   * @param string $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return bool
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertSubString($haystack, $needle, $message = '', $group = 'Other') {
+    return $this->assertTrue(strpos($haystack, $needle) !== FALSE, $message, $group);
+  }
+
+  /**
+   * Assertion helper which checks whether a string is not part of another string.
+   *
+   * @param string $haystack
+   *   The value to search in.
+   * @param string $needle
+   *   The value to search for.
+   * @param string $message
+   *   The message to display along with the assertion.
+   * @param string $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return bool
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNotSubString($haystack, $needle, $message = '', $group = 'Other') {
+    return $this->assertTrue(strpos($haystack, $needle) === FALSE, $message, $group);
+  }
+
+  /**
+   * Tests general rewriting of the output.
+   */
+  public function testRewrite() {
+    $view = views_get_view('test_view');
+    $view->initHandlers();
+    $this->executeView($view);
+    $row = $view->result[0];
+    $id_field = $view->field['id'];
+
+    // Don't check the rewrite checkbox, so the text shouldn't appear.
+    $id_field->options['alter']['text'] = $random_text = $this->randomName();
+    $output = $id_field->theme($row);
+    $this->assertNotSubString($output, $random_text);
+
+    $id_field->options['alter']['alter_text'] = TRUE;
+    $output = $id_field->theme($row);
+    $this->assertSubString($output, $random_text);
+  }
+
+  /**
+   * Tests the field tokens, row level and field level.
+   */
+  public function testFieldTokens() {
+    $view = views_get_view('test_field_tokens');
+    $this->executeView($view);
+    $name_field_0 = $view->field['name'];
+    $name_field_1 = $view->field['name_1'];
+    $name_field_2 = $view->field['name_2'];
+    $row = $view->result[0];
+
+    $name_field_0->options['alter']['alter_text'] = TRUE;
+    $name_field_0->options['alter']['text'] = '[name]';
+
+    $name_field_1->options['alter']['alter_text'] = TRUE;
+    $name_field_1->options['alter']['text'] = '[name_1] [name]';
+
+    $name_field_2->options['alter']['alter_text'] = TRUE;
+    $name_field_2->options['alter']['text'] = '[name_2] [name_1]';
+
+    foreach ($view->result as $row) {
+      $expected_output_0 = $row->views_test_data_name;
+      $expected_output_1 = "$row->views_test_data_name $row->views_test_data_name";
+      $expected_output_2 = "$row->views_test_data_name $row->views_test_data_name $row->views_test_data_name";
+
+      $output = $name_field_0->advanced_render($row);
+      $this->assertEqual($output, $expected_output_0);
+
+      $output = $name_field_1->advanced_render($row);
+      $this->assertEqual($output, $expected_output_1);
+
+      $output = $name_field_2->advanced_render($row);
+      $this->assertEqual($output, $expected_output_2);
+    }
+
+    $job_field = $view->field['job'];
+    $job_field->options['alter']['alter_text'] = TRUE;
+    $job_field->options['alter']['text'] = '[test-token]';
+
+    $random_text = $this->randomName();
+    $job_field->setTestValue($random_text);
+    $output = $job_field->advanced_render($row);
+    $this->assertSubString($output, $random_text, format_string('Make sure the self token (!value) appears in the output (!output)'. array('!value' => $random_text, '!output' => $output)));
+  }
+
+  /**
+   * Tests the exclude setting.
+   */
+  public function testExclude() {
+    $view = views_get_view('test_field_output');
+    $view->initHandlers();
+    // Hide the field and see whether it's rendered.
+    $view->field['name']->options['exclude'] = TRUE;
+
+    $output = $view->preview();
+    foreach ($this->dataSet() as $entry) {
+      $this->assertNotSubString($output, $entry['name']);
+    }
+
+    // Show and check the field.
+    $view->field['name']->options['exclude'] = FALSE;
+
+    $output = $view->preview();
+    foreach ($this->dataSet() as $entry) {
+      $this->assertSubString($output, $entry['name']);
+    }
+  }
+
+  /**
+   * Tests everything related to empty output of a field.
+   */
+  function testEmpty() {
+    $this->_testHideIfEmpty();
+    $this->_testEmptyText();
+  }
+
+  /**
+   * Tests the hide if empty functionality.
+   *
+   * This tests alters the result to get easier and less coupled results.
+   */
+  function _testHideIfEmpty() {
+    $view = views_get_view('test_view');
+    $view->initDisplay();
+    $this->executeView($view);
+
+    $column_map_reversed = array_flip($this->column_map);
+    $view->row_index = 0;
+    $random_name = $this->randomName();
+    $random_value = $this->randomName();
+
+    // Test when results are not rewritten and empty values are not hidden.
+    $view->field['name']->options['hide_alter_empty'] = FALSE;
+    $view->field['name']->options['hide_empty'] = FALSE;
+    $view->field['name']->options['empty_zero'] = FALSE;
+
+    // Test a valid string.
+    $view->result[0]->{$column_map_reversed['name']} = $random_name;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_name, 'By default, a string should not be treated as empty.');
+
+    // Test an empty string.
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'By default, "" should not be treated as empty.');
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, '0', 'By default, 0 should not be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'By default, "0" should not be treated as empty.');
+
+    // Test when results are not rewritten and non-zero empty values are hidden.
+    $view->field['name']->options['hide_alter_empty'] = TRUE;
+    $view->field['name']->options['hide_empty'] = TRUE;
+    $view->field['name']->options['empty_zero'] = FALSE;
+
+    // Test a valid string.
+    $view->result[0]->{$column_map_reversed['name']} = $random_name;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_name, 'If hide_empty is checked, a string should not be treated as empty.');
+
+    // Test an empty string.
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If hide_empty is checked, "" should be treated as empty.');
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, '0', 'If hide_empty is checked, but not empty_zero, 0 should not be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'If hide_empty is checked, but not empty_zero, "0" should not be treated as empty.');
+
+    // Test when results are not rewritten and all empty values are hidden.
+    $view->field['name']->options['hide_alter_empty'] = TRUE;
+    $view->field['name']->options['hide_empty'] = TRUE;
+    $view->field['name']->options['empty_zero'] = TRUE;
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If hide_empty and empty_zero are checked, 0 should be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If hide_empty and empty_zero are checked, "0" should be treated as empty.');
+
+    // Test when results are rewritten to a valid string and non-zero empty
+    // results are hidden.
+    $view->field['name']->options['hide_alter_empty'] = FALSE;
+    $view->field['name']->options['hide_empty'] = TRUE;
+    $view->field['name']->options['empty_zero'] = FALSE;
+    $view->field['name']->options['alter']['alter_text'] = TRUE;
+    $view->field['name']->options['alter']['text'] = $random_name;
+
+    // Test a valid string.
+    $view->result[0]->{$column_map_reversed['name']} = $random_value;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, it should not be treated as empty.');
+
+    // Test an empty string.
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, "" should not be treated as empty.');
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, 0 should not be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, "0" should not be treated as empty.');
+
+    // Test when results are rewritten to an empty string and non-zero empty results are hidden.
+    $view->field['name']->options['hide_alter_empty'] = TRUE;
+    $view->field['name']->options['hide_empty'] = TRUE;
+    $view->field['name']->options['empty_zero'] = FALSE;
+    $view->field['name']->options['alter']['alter_text'] = TRUE;
+    $view->field['name']->options['alter']['text'] = "";
+
+    // Test a valid string.
+    $view->result[0]->{$column_map_reversed['name']} = $random_name;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_name, 'If the rewritten string is empty, it should not be treated as empty.');
+
+    // Test an empty string.
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If the rewritten string is empty, "" should be treated as empty.');
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, '0', 'If the rewritten string is empty, 0 should not be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'If the rewritten string is empty, "0" should not be treated as empty.');
+
+    // Test when results are rewritten to zero as a string and non-zero empty
+    // results are hidden.
+    $view->field['name']->options['hide_alter_empty'] = FALSE;
+    $view->field['name']->options['hide_empty'] = TRUE;
+    $view->field['name']->options['empty_zero'] = FALSE;
+    $view->field['name']->options['alter']['alter_text'] = TRUE;
+    $view->field['name']->options['alter']['text'] = "0";
+
+    // Test a valid string.
+    $view->result[0]->{$column_map_reversed['name']} = $random_name;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, the string rewritten as 0 should not be treated as empty.');
+
+    // Test an empty string.
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, "" rewritten as 0 should not be treated as empty.');
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, 0 should not be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, "0" should not be treated as empty.');
+
+    // Test when results are rewritten to a valid string and non-zero empty
+    // results are hidden.
+    $view->field['name']->options['hide_alter_empty'] = TRUE;
+    $view->field['name']->options['hide_empty'] = TRUE;
+    $view->field['name']->options['empty_zero'] = FALSE;
+    $view->field['name']->options['alter']['alter_text'] = TRUE;
+    $view->field['name']->options['alter']['text'] = $random_value;
+
+    // Test a valid string.
+    $view->result[0]->{$column_map_reversed['name']} = $random_name;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, it should not be treated as empty.');
+
+    // Test an empty string.
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If either the original or rewritten string is invalid, "" should be treated as empty.');
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, 0 should not be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, "0" should not be treated as empty.');
+
+    // Test when results are rewritten to zero as a string and all empty
+    // original values and results are hidden.
+    $view->field['name']->options['hide_alter_empty'] = TRUE;
+    $view->field['name']->options['hide_empty'] = TRUE;
+    $view->field['name']->options['empty_zero'] = TRUE;
+    $view->field['name']->options['alter']['alter_text'] = TRUE;
+    $view->field['name']->options['alter']['text'] = "0";
+
+    // Test a valid string.
+    $view->result[0]->{$column_map_reversed['name']} = $random_name;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If the rewritten string is zero, it should be treated as empty.');
+
+    // Test an empty string.
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If the rewritten string is zero, "" should be treated as empty.');
+
+    // Test zero as an integer.
+    $view->result[0]->{$column_map_reversed['name']} = 0;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If the rewritten string is zero, 0 should not be treated as empty.');
+
+    // Test zero as a string.
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "", 'If the rewritten string is zero, "0" should not be treated as empty.');
+  }
+
+  /**
+   * Tests the usage of the empty text.
+   */
+  function _testEmptyText() {
+    $view = views_get_view('test_view');
+    $view->initDisplay();
+    $this->executeView($view);
+
+    $column_map_reversed = array_flip($this->column_map);
+    $view->row_index = 0;
+
+    $empty_text = $view->field['name']->options['empty'] = $this->randomName();
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $empty_text, 'If a field is empty, the empty text should be used for the output.');
+
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, "0", 'If a field is 0 and empty_zero is not checked, the empty text should not be used for the output.');
+
+    $view->result[0]->{$column_map_reversed['name']} = "0";
+    $view->field['name']->options['empty_zero'] = TRUE;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $empty_text, 'If a field is 0 and empty_zero is checked, the empty text should be used for the output.');
+
+    $view->result[0]->{$column_map_reversed['name']} = "";
+    $view->field['name']->options['alter']['alter_text'] = TRUE;
+    $alter_text = $view->field['name']->options['alter']['text'] = $this->randomName();
+    $view->field['name']->options['hide_alter_empty'] = FALSE;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $alter_text, 'If a field is empty, some rewrite text exists, but hide_alter_empty is not checked, render the rewrite text.');
+
+    $view->field['name']->options['hide_alter_empty'] = TRUE;
+    $render = $view->field['name']->advanced_render($view->result[0]);
+    $this->assertIdentical($render, $empty_text, 'If a field is empty, some rewrite text exists, and hide_alter_empty is checked, use the empty text.');
+  }
+
+  /**
+   * Tests views_handler_field::is_value_empty().
+   */
+  function testIsValueEmpty() {
+    $view = views_get_view('test_view');
+    $view->initHandlers();
+    $field = $view->field['name'];
+
+    $this->assertFalse($field->is_value_empty("not empty", TRUE), 'A normal string is not empty.');
+    $this->assertTrue($field->is_value_empty("not empty", TRUE, FALSE), 'A normal string which skips empty() can be seen as empty.');
+
+    $this->assertTrue($field->is_value_empty("", TRUE), '"" is considered as empty.');
+
+    $this->assertTrue($field->is_value_empty('0', TRUE), '"0" is considered as empty if empty_zero is TRUE.');
+    $this->assertTrue($field->is_value_empty(0, TRUE), '0 is considered as empty if empty_zero is TRUE.');
+    $this->assertFalse($field->is_value_empty('0', FALSE), '"0" is considered not as empty if empty_zero is FALSE.');
+    $this->assertFalse($field->is_value_empty(0, FALSE), '0 is considered not as empty if empty_zero is FALSE.');
+
+    $this->assertTrue($field->is_value_empty(NULL, TRUE, TRUE), 'Null should be always seen as empty, regardless of no_skip_empty.');
+    $this->assertTrue($field->is_value_empty(NULL, TRUE, FALSE), 'Null should be always seen as empty, regardless of no_skip_empty.');
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUrlTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUrlTest.php
index 0ffbed0..8239ab9 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUrlTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldUrlTest.php
@@ -7,10 +7,12 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\ViewUnitTestBase;
+
 /**
  * Tests the core Drupal\views\Plugin\views\field\Url handler.
  */
-class FieldUrlTest extends HandlerTestBase {
+class FieldUrlTest extends ViewUnitTestBase {
 
   public static function getInfo() {
     return array(
@@ -20,12 +22,6 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
   function viewsData() {
     $data = parent::viewsData();
     $data['views_test_data']['name']['field']['id'] = 'url';
@@ -33,7 +29,8 @@ function viewsData() {
   }
 
   public function testFieldUrl() {
-    $view = $this->getView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
 
     $view->displayHandlers['default']->overrideOption('fields', array(
       'name' => array(
@@ -51,7 +48,7 @@ public function testFieldUrl() {
 
     // Make the url a link.
     $view->destroy();
-    $view = $this->getView();
+    $view->setDisplay();
 
     $view->displayHandlers['default']->overrideOption('fields', array(
       'name' => array(
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldWebTest.php
similarity index 53%
rename from core/modules/views/lib/Drupal/views/Tests/Handler/FieldTest.php
rename to core/modules/views/lib/Drupal/views/Tests/Handler/FieldWebTest.php
index 967eae8..f1b919a 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldWebTest.php
@@ -2,23 +2,26 @@
 
 /**
  * @file
- * Definition of Drupal\views\Tests\Handler\FieldTest.
+ * Contains \Drupal\views\Tests\Handler\FieldWebTest.
  */
 
 namespace Drupal\views\Tests\Handler;
 
 /**
- * Tests the generic field handler.
+ * Tests fields from within a UI.
  *
- * @see Drupal\views\Plugin\views\field\FieldPluginBase
+ * @see \Drupal\views\Plugin\views\field\FieldPluginBase
  */
+class FieldWebTest extends HandlerTestBase {
 
-class FieldTest extends HandlerTestBase {
+  protected $column_map = array(
+    'views_test_data_name' => 'name',
+  );
 
   public static function getInfo() {
     return array(
-      'name' => 'Field: Base',
-      'description' => 'Tests the generic field handler.',
+      'name' => 'Field: Web Test',
+      'description' => 'Tests fields from within a UI.',
       'group' => 'Views Handlers',
     );
   }
@@ -27,64 +30,18 @@ protected function setUp() {
     parent::setUp();
 
     $this->enableViewsTestModule();
-
-    $this->column_map = array(
-      'views_test_data_name' => 'name',
-    );
   }
 
   /**
-   * Overrides Drupal\views\Tests\ViewTestBase::viewsData().
+   * Overrides \Drupal\views\Tests\ViewTestBase::viewsData().
    */
   protected function viewsData() {
     $data = parent::viewsData();
     $data['views_test_data']['job']['field']['id'] = 'test_field';
-
     return $data;
   }
 
   /**
-   * Tests that the render function is called.
-   */
-  public function testRender() {
-    $view = views_get_view('test_field_tokens');
-    $this->executeView($view);
-
-    $random_text = $this->randomName();
-    $view->field['job']->setTestValue($random_text);
-    $this->assertEqual($view->field['job']->theme($view->result[0]), $random_text, 'Make sure the render method rendered the manual set value.');
-  }
-
-  /**
-   * Tests all things related to the query.
-   */
-  public function testQuery() {
-    // Tests adding additional fields to the query.
-    $view = $this->getBasicView();
-    $view->initHandlers();
-
-    $id_field = $view->field['id'];
-    $id_field->additional_fields['job'] = 'job';
-    // Choose also a field alias key which doesn't match to the table field.
-    $id_field->additional_fields['created_test'] = array('table' => 'views_test_data', 'field' => 'created');
-    $view->build();
-
-    // Make sure the field aliases have the expected value.
-    $this->assertEqual($id_field->aliases['job'], 'views_test_data_job');
-    $this->assertEqual($id_field->aliases['created_test'], 'views_test_data_created');
-
-    $this->executeView($view);
-    // Tests the get_value method with and without a field aliases.
-    foreach ($this->dataSet() as $key => $row) {
-      $id = $key + 1;
-      $result = $view->result[$key];
-      $this->assertEqual($id_field->get_value($result), $id);
-      $this->assertEqual($id_field->get_value($result, 'job'), $row['job']);
-      $this->assertEqual($id_field->get_value($result, 'created_test'), $row['created']);
-    }
-  }
-
-  /**
    * Tests the click sorting functionality.
    */
   public function testClickSorting() {
@@ -211,7 +168,8 @@ protected function xpathContent($content, $xpath, array $arguments = array()) {
    * Tests rewriting the output to a link.
    */
   public function testAlterUrl() {
-    $view = $this->getBasicView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
     $view->initHandlers();
     $this->executeView($view);
     $row = $view->result[0];
@@ -355,26 +313,6 @@ public function testAlterUrl() {
   }
 
   /**
-   * Tests general rewriting of the output.
-   */
-  public function testRewrite() {
-    $view = $this->getBasicView();
-    $view->initHandlers();
-    $this->executeView($view);
-    $row = $view->result[0];
-    $id_field = $view->field['id'];
-
-    // Don't check the rewrite checkbox, so the text shouldn't appear.
-    $id_field->options['alter']['text'] = $random_text = $this->randomName();
-    $output = $id_field->theme($row);
-    $this->assertNotSubString($output, $random_text);
-
-    $id_field->options['alter']['alter_text'] = TRUE;
-    $output = $id_field->theme($row);
-    $this->assertSubString($output, $random_text);
-  }
-
-  /**
    * Tests the field/label/wrapper classes.
    */
   public function testFieldClasses() {
@@ -474,74 +412,6 @@ public function testFieldClasses() {
   }
 
   /**
-   * Tests the field tokens, row level and field level.
-   */
-  public function testFieldTokens() {
-    $view = views_get_view('test_field_tokens');
-    $this->executeView($view);
-    $name_field_0 = $view->field['name'];
-    $name_field_1 = $view->field['name_1'];
-    $name_field_2 = $view->field['name_2'];
-    $row = $view->result[0];
-
-    $name_field_0->options['alter']['alter_text'] = TRUE;
-    $name_field_0->options['alter']['text'] = '[name]';
-
-    $name_field_1->options['alter']['alter_text'] = TRUE;
-    $name_field_1->options['alter']['text'] = '[name_1] [name]';
-
-    $name_field_2->options['alter']['alter_text'] = TRUE;
-    $name_field_2->options['alter']['text'] = '[name_2] [name_1]';
-
-    foreach ($view->result as $row) {
-      $expected_output_0 = $row->views_test_data_name;
-      $expected_output_1 = "$row->views_test_data_name $row->views_test_data_name";
-      $expected_output_2 = "$row->views_test_data_name $row->views_test_data_name $row->views_test_data_name";
-
-      $output = $name_field_0->advanced_render($row);
-      $this->assertEqual($output, $expected_output_0);
-
-      $output = $name_field_1->advanced_render($row);
-      $this->assertEqual($output, $expected_output_1);
-
-      $output = $name_field_2->advanced_render($row);
-      $this->assertEqual($output, $expected_output_2);
-    }
-
-    $job_field = $view->field['job'];
-    $job_field->options['alter']['alter_text'] = TRUE;
-    $job_field->options['alter']['text'] = '[test-token]';
-
-    $random_text = $this->randomName();
-    $job_field->setTestValue($random_text);
-    $output = $job_field->advanced_render($row);
-    $this->assertSubString($output, $random_text, format_string('Make sure the self token (!value) appears in the output (!output)'. array('!value' => $random_text, '!output' => $output)));
-  }
-
-  /**
-   * Tests the exclude setting.
-   */
-  public function testExclude() {
-    $view = views_get_view('test_field_output');
-    $view->initHandlers();
-    // Hide the field and see whether it's rendered.
-    $view->field['name']->options['exclude'] = TRUE;
-
-    $output = $view->preview();
-    foreach ($this->dataSet() as $entry) {
-      $this->assertNotSubString($output, $entry['name']);
-    }
-
-    // Show and check the field.
-    $view->field['name']->options['exclude'] = FALSE;
-
-    $output = $view->preview();
-    foreach ($this->dataSet() as $entry) {
-      $this->assertSubString($output, $entry['name']);
-    }
-  }
-
-  /**
    * Tests trimming/read-more/ellipses.
    */
   public function testTextRendering() {
@@ -677,291 +547,4 @@ public function testTextRendering() {
     $this->assertNotSubString($output, '...', 'No ellipsis should appear if the output is not trimmed');
   }
 
-  /**
-   * Tests everything related to empty output of a field.
-   */
-  function testEmpty() {
-    $this->_testHideIfEmpty();
-    $this->_testEmptyText();
-  }
-
-  /**
-   * Tests the hide if empty functionality.
-   *
-   * This tests alters the result to get easier and less coupled results.
-   */
-  function _testHideIfEmpty() {
-    $view = $this->getView();
-    $view->initDisplay();
-    $this->executeView($view);
-
-    $column_map_reversed = array_flip($this->column_map);
-    $view->row_index = 0;
-    $random_name = $this->randomName();
-    $random_value = $this->randomName();
-
-    // Test when results are not rewritten and empty values are not hidden.
-    $view->field['name']->options['hide_alter_empty'] = FALSE;
-    $view->field['name']->options['hide_empty'] = FALSE;
-    $view->field['name']->options['empty_zero'] = FALSE;
-
-    // Test a valid string.
-    $view->result[0]->{$column_map_reversed['name']} = $random_name;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_name, 'By default, a string should not be treated as empty.');
-
-    // Test an empty string.
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'By default, "" should not be treated as empty.');
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, '0', 'By default, 0 should not be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'By default, "0" should not be treated as empty.');
-
-    // Test when results are not rewritten and non-zero empty values are hidden.
-    $view->field['name']->options['hide_alter_empty'] = TRUE;
-    $view->field['name']->options['hide_empty'] = TRUE;
-    $view->field['name']->options['empty_zero'] = FALSE;
-
-    // Test a valid string.
-    $view->result[0]->{$column_map_reversed['name']} = $random_name;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_name, 'If hide_empty is checked, a string should not be treated as empty.');
-
-    // Test an empty string.
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If hide_empty is checked, "" should be treated as empty.');
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, '0', 'If hide_empty is checked, but not empty_zero, 0 should not be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'If hide_empty is checked, but not empty_zero, "0" should not be treated as empty.');
-
-    // Test when results are not rewritten and all empty values are hidden.
-    $view->field['name']->options['hide_alter_empty'] = TRUE;
-    $view->field['name']->options['hide_empty'] = TRUE;
-    $view->field['name']->options['empty_zero'] = TRUE;
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If hide_empty and empty_zero are checked, 0 should be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If hide_empty and empty_zero are checked, "0" should be treated as empty.');
-
-    // Test when results are rewritten to a valid string and non-zero empty
-    // results are hidden.
-    $view->field['name']->options['hide_alter_empty'] = FALSE;
-    $view->field['name']->options['hide_empty'] = TRUE;
-    $view->field['name']->options['empty_zero'] = FALSE;
-    $view->field['name']->options['alter']['alter_text'] = TRUE;
-    $view->field['name']->options['alter']['text'] = $random_name;
-
-    // Test a valid string.
-    $view->result[0]->{$column_map_reversed['name']} = $random_value;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, it should not be treated as empty.');
-
-    // Test an empty string.
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, "" should not be treated as empty.');
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, 0 should not be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, "0" should not be treated as empty.');
-
-    // Test when results are rewritten to an empty string and non-zero empty results are hidden.
-    $view->field['name']->options['hide_alter_empty'] = TRUE;
-    $view->field['name']->options['hide_empty'] = TRUE;
-    $view->field['name']->options['empty_zero'] = FALSE;
-    $view->field['name']->options['alter']['alter_text'] = TRUE;
-    $view->field['name']->options['alter']['text'] = "";
-
-    // Test a valid string.
-    $view->result[0]->{$column_map_reversed['name']} = $random_name;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_name, 'If the rewritten string is empty, it should not be treated as empty.');
-
-    // Test an empty string.
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If the rewritten string is empty, "" should be treated as empty.');
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, '0', 'If the rewritten string is empty, 0 should not be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'If the rewritten string is empty, "0" should not be treated as empty.');
-
-    // Test when results are rewritten to zero as a string and non-zero empty
-    // results are hidden.
-    $view->field['name']->options['hide_alter_empty'] = FALSE;
-    $view->field['name']->options['hide_empty'] = TRUE;
-    $view->field['name']->options['empty_zero'] = FALSE;
-    $view->field['name']->options['alter']['alter_text'] = TRUE;
-    $view->field['name']->options['alter']['text'] = "0";
-
-    // Test a valid string.
-    $view->result[0]->{$column_map_reversed['name']} = $random_name;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, the string rewritten as 0 should not be treated as empty.');
-
-    // Test an empty string.
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, "" rewritten as 0 should not be treated as empty.');
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, 0 should not be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, "0" should not be treated as empty.');
-
-    // Test when results are rewritten to a valid string and non-zero empty
-    // results are hidden.
-    $view->field['name']->options['hide_alter_empty'] = TRUE;
-    $view->field['name']->options['hide_empty'] = TRUE;
-    $view->field['name']->options['empty_zero'] = FALSE;
-    $view->field['name']->options['alter']['alter_text'] = TRUE;
-    $view->field['name']->options['alter']['text'] = $random_value;
-
-    // Test a valid string.
-    $view->result[0]->{$column_map_reversed['name']} = $random_name;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, it should not be treated as empty.');
-
-    // Test an empty string.
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If either the original or rewritten string is invalid, "" should be treated as empty.');
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, 0 should not be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, "0" should not be treated as empty.');
-
-    // Test when results are rewritten to zero as a string and all empty
-    // original values and results are hidden.
-    $view->field['name']->options['hide_alter_empty'] = TRUE;
-    $view->field['name']->options['hide_empty'] = TRUE;
-    $view->field['name']->options['empty_zero'] = TRUE;
-    $view->field['name']->options['alter']['alter_text'] = TRUE;
-    $view->field['name']->options['alter']['text'] = "0";
-
-    // Test a valid string.
-    $view->result[0]->{$column_map_reversed['name']} = $random_name;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If the rewritten string is zero, it should be treated as empty.');
-
-    // Test an empty string.
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If the rewritten string is zero, "" should be treated as empty.');
-
-    // Test zero as an integer.
-    $view->result[0]->{$column_map_reversed['name']} = 0;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If the rewritten string is zero, 0 should not be treated as empty.');
-
-    // Test zero as a string.
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "", 'If the rewritten string is zero, "0" should not be treated as empty.');
-  }
-
-  /**
-   * Tests the usage of the empty text.
-   */
-  function _testEmptyText() {
-    $view = $this->getView();
-    $view->initDisplay();
-    $this->executeView($view);
-
-    $column_map_reversed = array_flip($this->column_map);
-    $view->row_index = 0;
-
-    $empty_text = $view->field['name']->options['empty'] = $this->randomName();
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $empty_text, 'If a field is empty, the empty text should be used for the output.');
-
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, "0", 'If a field is 0 and empty_zero is not checked, the empty text should not be used for the output.');
-
-    $view->result[0]->{$column_map_reversed['name']} = "0";
-    $view->field['name']->options['empty_zero'] = TRUE;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $empty_text, 'If a field is 0 and empty_zero is checked, the empty text should be used for the output.');
-
-    $view->result[0]->{$column_map_reversed['name']} = "";
-    $view->field['name']->options['alter']['alter_text'] = TRUE;
-    $alter_text = $view->field['name']->options['alter']['text'] = $this->randomName();
-    $view->field['name']->options['hide_alter_empty'] = FALSE;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $alter_text, 'If a field is empty, some rewrite text exists, but hide_alter_empty is not checked, render the rewrite text.');
-
-    $view->field['name']->options['hide_alter_empty'] = TRUE;
-    $render = $view->field['name']->advanced_render($view->result[0]);
-    $this->assertIdentical($render, $empty_text, 'If a field is empty, some rewrite text exists, and hide_alter_empty is checked, use the empty text.');
-  }
-
-  /**
-   * Tests views_handler_field::is_value_empty().
-   */
-  function testIsValueEmpty() {
-    $view = $this->getView();
-    $view->initHandlers();
-    $field = $view->field['name'];
-
-    $this->assertFalse($field->is_value_empty("not empty", TRUE), 'A normal string is not empty.');
-    $this->assertTrue($field->is_value_empty("not empty", TRUE, FALSE), 'A normal string which skips empty() can be seen as empty.');
-
-    $this->assertTrue($field->is_value_empty("", TRUE), '"" is considered as empty.');
-
-    $this->assertTrue($field->is_value_empty('0', TRUE), '"0" is considered as empty if empty_zero is TRUE.');
-    $this->assertTrue($field->is_value_empty(0, TRUE), '0 is considered as empty if empty_zero is TRUE.');
-    $this->assertFalse($field->is_value_empty('0', FALSE), '"0" is considered not as empty if empty_zero is FALSE.');
-    $this->assertFalse($field->is_value_empty(0, FALSE), '0 is considered not as empty if empty_zero is FALSE.');
-
-    $this->assertTrue($field->is_value_empty(NULL, TRUE, TRUE), 'Null should be always seen as empty, regardless of no_skip_empty.');
-    $this->assertTrue($field->is_value_empty(NULL, TRUE, FALSE), 'Null should be always seen as empty, regardless of no_skip_empty.');
-  }
-
 }
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldXssTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldXssTest.php
index 01f95cb..d018e16 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldXssTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldXssTest.php
@@ -7,12 +7,14 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\ViewUnitTestBase;
+
 /**
  * Tests the core Drupal\views\Plugin\views\field\Xss handler.
  *
  * @see CommonXssUnitTest
  */
-class FieldXssTest extends HandlerTestBase {
+class FieldXssTest extends ViewUnitTestBase {
 
   public static function getInfo() {
     return array(
@@ -22,12 +24,6 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
   function dataHelper() {
     $map = array(
       'John' => 'John',
@@ -47,7 +43,8 @@ function viewsData() {
   }
 
   public function testFieldXss() {
-    $view = $this->getView();
+    $view = views_get_view('test_view');
+    $view->setDisplay();
 
     $view->displayHandlers['default']->overrideOption('fields', array(
       'name' => array(
diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewUnitTestBase.php b/core/modules/views/lib/Drupal/views/Tests/ViewUnitTestBase.php
new file mode 100644
index 0000000..5f6e5d6
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/ViewUnitTestBase.php
@@ -0,0 +1,330 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\ViewUnitTestBase.
+ */
+
+namespace Drupal\views\Tests;
+
+use Drupal\views\ViewExecutable;
+use Drupal\simpletest\DrupalUnitTestBase;
+
+/**
+ * Abstract class for views testing.
+ */
+abstract class ViewUnitTestBase extends DrupalUnitTestBase {
+
+  /**
+   * The view to use for the test.
+   *
+   * @var \Drupal\views\ViewExecutable
+   */
+  protected $view;
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Define the schema and views data variable before enabling the test module.
+    state()->set('views_test_data_schema', $this->schemaDefinition());
+    state()->set('views_test_data_views_data', $this->viewsData());
+
+    $this->enableModules(array('views', 'views_test_config', 'views_test_data'));
+
+    foreach (ViewExecutable::getPluginTypes() as $type) {
+      if ($type == 'join') {
+        $this->container->register('plugin.manager.views.join', 'Drupal\views\Plugin\Type\JoinManager');
+      }
+      elseif ($type == 'wizard') {
+        $this->container->register('plugin.manager.views.wizard', 'Drupal\views\Plugin\Type\WizardManager');
+      }
+      else {
+        $this->container->register("plugin.manager.views.$type", 'Drupal\views\Plugin\Type\PluginManager')
+          ->addArgument($type);
+      }
+    }
+
+    // Load the test dataset.
+    $data_set = $this->dataSet();
+    $query = db_insert('views_test_data')
+      ->fields(array_keys($data_set[0]));
+    foreach ($data_set as $record) {
+      $query->values($record);
+    }
+    $query->execute();
+  }
+
+  /**
+   * Helper function: verify a result set returned by view.
+   *
+   * The comparison is done on the string representation of the columns of the
+   * column map, taking the order of the rows into account, but not the order
+   * of the columns.
+   *
+   * @param $view
+   *  An executed View.
+   * @param $expected_result
+   *  An expected result set.
+   * @param $column_map
+   *  An associative array mapping the columns of the result set from the view
+   *  (as keys) and the expected result set (as values).
+   */
+  protected function assertIdenticalResultset($view, $expected_result, $column_map = array(), $message = 'Identical result set') {
+    return $this->assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, 'assertIdentical');
+  }
+
+  /**
+   * Helper function: verify a result set returned by view..
+   *
+   * Inverse of ViewsTestCase::assertIdenticalResultset().
+   *
+   * @param $view
+   *  An executed View.
+   * @param $expected_result
+   *  An expected result set.
+   * @param $column_map
+   *  An associative array mapping the columns of the result set from the view
+   *  (as keys) and the expected result set (as values).
+   */
+  protected function assertNotIdenticalResultset($view, $expected_result, $column_map = array(), $message = 'Identical result set') {
+    return $this->assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, 'assertNotIdentical');
+  }
+
+  protected function assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, $assert_method) {
+    // Convert $view->result to an array of arrays.
+    $result = array();
+    foreach ($view->result as $key => $value) {
+      $row = array();
+      foreach ($column_map as $view_column => $expected_column) {
+        // The comparison will be done on the string representation of the value.
+        $row[$expected_column] = (string) $value->$view_column;
+      }
+      $result[$key] = $row;
+    }
+
+    // Remove the columns we don't need from the expected result.
+    foreach ($expected_result as $key => $value) {
+      $row = array();
+      foreach ($column_map as $expected_column) {
+        // The comparison will be done on the string representation of the value.
+        $row[$expected_column] = (string) (is_object($value) ? $value->$expected_column : $value[$expected_column]);
+      }
+      $expected_result[$key] = $row;
+    }
+
+    // Reset the numbering of the arrays.
+    $result = array_values($result);
+    $expected_result = array_values($expected_result);
+
+    $this->verbose('<pre>Returned data set: ' . print_r($result, TRUE) . "\n\nExpected: ". print_r($expected_result, TRUE));
+
+    // Do the actual comparison.
+    return $this->$assert_method($result, $expected_result, $message);
+  }
+
+  /**
+   * Helper function to execute a view with debugging.
+   *
+   * @param view $view
+   * @param array $args
+   */
+  protected function executeView($view, $args = array()) {
+    $view->setDisplay();
+    $view->preExecute($args);
+    $view->execute();
+    $this->verbose('<pre>Executed view: ' . ((string) $view->build_info['query']) . '</pre>');
+  }
+
+  /**
+   * The schema definition.
+   */
+  protected function schemaDefinition() {
+    $schema['views_test_data'] = array(
+      'description' => 'Basic test table for Views tests.',
+      'fields' => array(
+        'id' => array(
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'name' => array(
+          'description' => "A person's name",
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'default' => '',
+        ),
+        'age' => array(
+          'description' => "The person's age",
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0),
+        'job' => array(
+          'description' => "The person's job",
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'default' => 'Undefined',
+        ),
+        'created' => array(
+          'description' => "The creation date of this record",
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+      ),
+      'primary key' => array('id'),
+      'unique keys' => array(
+        'name' => array('name')
+      ),
+      'indexes' => array(
+        'ages' => array('age'),
+      ),
+    );
+    return $schema;
+  }
+
+  /**
+   * The views data definition.
+   */
+  protected function viewsData() {
+    // Declaration of the base table.
+    $data['views_test_data']['table'] = array(
+      'group' => t('Views test'),
+      'base' => array(
+        'field' => 'id',
+        'title' => t('Views test data'),
+        'help' => t('Users who have created accounts on your site.'),
+      ),
+    );
+
+    // Declaration of fields.
+    $data['views_test_data']['id'] = array(
+      'title' => t('ID'),
+      'help' => t('The test data ID'),
+      'field' => array(
+        'id' => 'numeric',
+        'click sortable' => TRUE,
+      ),
+      'argument' => array(
+        'id' => 'numeric',
+      ),
+      'filter' => array(
+        'id' => 'numeric',
+      ),
+      'sort' => array(
+        'id' => 'standard',
+      ),
+    );
+    $data['views_test_data']['name'] = array(
+      'title' => t('Name'),
+      'help' => t('The name of the person'),
+      'field' => array(
+        'id' => 'standard',
+        'click sortable' => TRUE,
+      ),
+      'argument' => array(
+        'id' => 'string',
+      ),
+      'filter' => array(
+        'id' => 'string',
+      ),
+      'sort' => array(
+        'id' => 'standard',
+      ),
+    );
+    $data['views_test_data']['age'] = array(
+      'title' => t('Age'),
+      'help' => t('The age of the person'),
+      'field' => array(
+        'id' => 'numeric',
+        'click sortable' => TRUE,
+      ),
+      'argument' => array(
+        'id' => 'numeric',
+      ),
+      'filter' => array(
+        'id' => 'numeric',
+      ),
+      'sort' => array(
+        'id' => 'standard',
+      ),
+    );
+    $data['views_test_data']['job'] = array(
+      'title' => t('Job'),
+      'help' => t('The job of the person'),
+      'field' => array(
+        'id' => 'standard',
+        'click sortable' => TRUE,
+      ),
+      'argument' => array(
+        'id' => 'string',
+      ),
+      'filter' => array(
+        'id' => 'string',
+      ),
+      'sort' => array(
+        'id' => 'standard',
+      ),
+    );
+    $data['views_test_data']['created'] = array(
+      'title' => t('Created'),
+      'help' => t('The creation date of this record'),
+      'field' => array(
+        'id' => 'date',
+        'click sortable' => TRUE,
+      ),
+      'argument' => array(
+        'id' => 'date',
+      ),
+      'filter' => array(
+        'id' => 'date',
+      ),
+      'sort' => array(
+        'id' => 'date',
+      ),
+    );
+    return $data;
+  }
+
+  /**
+   * A very simple test dataset.
+   */
+  protected function dataSet() {
+    return array(
+      array(
+        'name' => 'John',
+        'age' => 25,
+        'job' => 'Singer',
+        'created' => gmmktime(0, 0, 0, 1, 1, 2000),
+      ),
+      array(
+        'name' => 'George',
+        'age' => 27,
+        'job' => 'Singer',
+        'created' => gmmktime(0, 0, 0, 1, 2, 2000),
+      ),
+      array(
+        'name' => 'Ringo',
+        'age' => 28,
+        'job' => 'Drummer',
+        'created' => gmmktime(6, 30, 30, 1, 1, 2000),
+      ),
+      array(
+        'name' => 'Paul',
+        'age' => 26,
+        'job' => 'Songwriter',
+        'created' => gmmktime(6, 0, 0, 1, 1, 2000),
+      ),
+      array(
+        'name' => 'Meredith',
+        'age' => 30,
+        'job' => 'Speaker',
+        'created' => gmmktime(6, 30, 10, 1, 1, 2000),
+      ),
+    );
+  }
+
+}
