diff --git a/src/Tests/DynamicEntityReferenceTest.php b/tests/src/Functional/DynamicEntityReferenceTest.php
similarity index 74%
rename from src/Tests/DynamicEntityReferenceTest.php
rename to tests/src/Functional/DynamicEntityReferenceTest.php
index 1bd8605..ca43558 100644
--- a/src/Tests/DynamicEntityReferenceTest.php
+++ b/tests/src/Functional/DynamicEntityReferenceTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\dynamic_entity_reference\Tests\DynamicEntityReferenceTest.
+ * Contains \Drupal\Tests\dynamic_entity_reference\Functional\DynamicEntityReferenceTest.
  */
 
-namespace Drupal\dynamic_entity_reference\Tests;
+namespace Drupal\Tests\dynamic_entity_reference\Functional;
 
 use Drupal\Component\Utility\Crypt;
 use Drupal\Component\Utility\Unicode;
@@ -16,17 +16,19 @@ use Drupal\Core\Url;
 use Drupal\entity_test\Entity\EntityTest;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
-use Drupal\simpletest\WebTestBase;
+use Drupal\simpletest\BrowserTestBase;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\Entity\Vocabulary;
-use Symfony\Component\CssSelector\CssSelector;
 
 /**
  * Ensures that Dynamic Entity References field works correctly.
  *
  * @group dynamic_entity_reference
+ *
+ * @runTestsInSeparateProcesses
+ * @preserveGlobalState disabled
  */
-class DynamicEntityReferenceTest extends WebTestBase {
+class DynamicEntityReferenceTest extends BrowserTestBase {
 
   /**
    * Admin user
@@ -79,14 +81,14 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'field_name' => 'foobar',
       'new_storage_type' => 'dynamic_entity_reference',
     );
-    $this->drupalPostForm(NULL, $edit, t('Save and continue'));
-    $this->drupalPostForm(NULL, array(
+    $this->submitForm($edit, t('Save and continue'));
+    $this->submitForm(array(
       'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
       'settings[entity_type_ids][]' => 'user',
     ), t('Save field settings'));
-    $this->assertFieldByName('default_value_input[field_foobar][0][target_type]');
-    $this->assertFieldByXPath(CssSelector::toXPath('select[name="default_value_input[field_foobar][0][target_type]"] > option[value=entity_test]'), 'entity_test');
-    $this->assertNoFieldByXPath(CssSelector::toXPath('select[name="default_value_input[field_foobar][0][target_type]"] > option[value=user]'), 'user');
+    $this->assertSession()->fieldExists('default_value_input[field_foobar][0][target_type]');
+    $this->assertSession()->elementTextContains('css', 'select[name="default_value_input[field_foobar][0][target_type]"] > option[value=entity_test]', 'Test entity');
+    $this->assertSession()->elementNotExists('css', 'select[name="default_value_input[field_foobar][0][target_type]"] > option[value=user]');
     $edit = array(
       'settings[entity_test_label][handler_settings][target_bundles][entity_test_label]' => TRUE,
       'settings[entity_test_no_id][handler_settings][target_bundles][entity_test_no_id]' => TRUE,
@@ -112,38 +114,38 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'settings[entity_test_string_id][handler_settings][target_bundles][entity_test_string_id]' => TRUE,
       'settings[entity_test_view_builder][handler_settings][target_bundles][entity_test_view_builder]' => TRUE,
     );
-    $this->drupalPostForm(NULL, $edit, t('Save settings'));
-    $this->assertRaw(t('Saved %name configuration', array('%name' => 'Foobar')));
+    $this->submitForm($edit, t('Save settings'));
+    $this->getSession()->getPage()->hasContent(t('Saved %name configuration', array('%name' => 'Foobar')));
     $excluded_entity_type_ids = FieldStorageConfig::loadByName('entity_test', 'field_foobar')
       ->getSetting('entity_type_ids');
     $this->assertNotNull($excluded_entity_type_ids);
-    $this->assertIdentical(array_keys($excluded_entity_type_ids), array('user'));
+    $this->assertEquals(array_keys($excluded_entity_type_ids), array('user'));
     // Check the include entity settings.
     $this->drupalGet('entity_test/structure/entity_test/fields/entity_test.entity_test.field_foobar/storage');
-    $this->drupalPostForm(NULL, array(
+    $this->submitForm(array(
       'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
       'settings[exclude_entity_types]' => FALSE,
       'settings[entity_type_ids][]' => 'user',
     ), t('Save field settings'));
     $this->drupalGet('entity_test/structure/entity_test/fields/entity_test.entity_test.field_foobar');
-    $this->assertFieldByName('default_value_input[field_foobar][0][target_type]');
-    $this->assertFieldByXPath(CssSelector::toXPath('select[name="default_value_input[field_foobar][0][target_type]"] > option[value=user]'), 'user');
-    $this->assertNoFieldByXPath(CssSelector::toXPath('select[name="default_value_input[field_foobar][0][target_type]"] > option[value=entity_test]'), 'entity_test');
-    $this->drupalPostForm(NULL, array(), t('Save settings'));
-    $this->assertRaw(t('Saved %name configuration', array('%name' => 'Foobar')));
+    $this->assertSession()->fieldExists('default_value_input[field_foobar][0][target_type]');
+    $this->assertSession()->elementTextContains('css', 'select[name="default_value_input[field_foobar][0][target_type]"] > option[value=user]', 'User');
+    $this->assertSession()->elementNotExists('css', 'select[name="default_value_input[field_foobar][0][target_type]"] > option[value=entity_test]');
+    $this->submitForm(array(), t('Save settings'));
+    $this->getSession()->getPage()->hasContent(t('Saved %name configuration', array('%name' => 'Foobar')));
     $excluded_entity_type_ids = FieldStorageConfig::loadByName('entity_test', 'field_foobar')
       ->getSetting('entity_type_ids');
     $this->assertNotNull($excluded_entity_type_ids);
-    $this->assertIdentical(array_keys($excluded_entity_type_ids), array('user'));
+    $this->assertEquals(array_keys($excluded_entity_type_ids), array('user'));
     // Check the default settings.
     $this->drupalGet('entity_test/structure/entity_test/fields/entity_test.entity_test.field_foobar');
-    $this->drupalPostForm(NULL, array(
+    $this->submitForm(array(
       'default_value_input[field_foobar][0][target_type]' => 'user',
       'default_value_input[field_foobar][0][target_id]' => $this->adminUser->label() . ' (' . $this->adminUser->id() . ')',
     ), t('Save settings'));
 
     $field_config = FieldConfig::loadByName('entity_test', 'entity_test', 'field_foobar')->toArray();
-    $this->assertEqual($field_config['default_value']['0'], array('target_type' => 'user', 'target_uuid' => $this->adminUser->uuid()));
+    $this->assertSame($field_config['default_value']['0'], array('target_type' => 'user', 'target_uuid' => $this->adminUser->uuid()));
 
   }
 
@@ -159,8 +161,8 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'field_name' => 'foobar',
       'new_storage_type' => 'dynamic_entity_reference',
     );
-    $this->drupalPostForm(NULL, $edit, t('Save and continue'));
-    $this->drupalPostForm(NULL, array(
+    $this->submitForm($edit, t('Save and continue'));
+    $this->submitForm(array(
       'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
     ), t('Save field settings'));
 
@@ -190,8 +192,8 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'settings[entity_test_view_builder][handler_settings][target_bundles][entity_test_view_builder]' => TRUE,
 
     );
-    $this->drupalPostForm(NULL, $edit, t('Save settings'));
-    $this->assertRaw(t('Saved %name configuration', array('%name' => 'Foobar')));
+    $this->submitForm($edit, t('Save settings'));
+    $this->getSession()->getPage()->hasContent(t('Saved %name configuration', array('%name' => 'Foobar')));
 
     // Create some items to reference.
     $item1 = EntityTest::create([
@@ -205,11 +207,12 @@ class DynamicEntityReferenceTest extends WebTestBase {
 
     // Test the new entity commenting inherits default.
     $this->drupalGet('entity_test/add');
-    $this->assertField('field_foobar[0][target_id]', 'Found foobar field target id');
-    $this->assertField('field_foobar[0][target_type]', 'Found foobar field target type');
+    $this->assertSession()->fieldExists('field_foobar[0][target_id]');
+    $this->assertSession()->fieldExists('field_foobar[0][target_type]');
 
     // Ensure that the autocomplete path is correct.
-    $input = $this->xpath('//input[@name=:name]', array(':name' => 'field_foobar[0][target_id]'))[0];
+    $input = $this->getSession()->getPage()->findField('field_foobar[0][target_id]');
+
     $settings = FieldConfig::loadByName('entity_test', 'entity_test', 'field_foobar')->getSettings();
     $selection_settings = $settings['entity_test_label']['handler_settings'] ?: [];
     $data = serialize($selection_settings) . 'entity_test_label' . $settings['entity_test_label']['handler'];
@@ -219,12 +222,11 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'selection_handler' => $settings['entity_test_label']['handler'],
       'selection_settings_key' => $selection_settings_key,
     ))->toString();
-    $this->assertTrue(strpos((string) $input['data-autocomplete-path'], $expected_autocomplete_path) !== FALSE);
+    $this->assertTrue(strpos($input->getAttribute('data-autocomplete-path'), $expected_autocomplete_path) !== FALSE);
 
     // Add some extra dynamic entity reference fields.
-    $this->drupalPostAjaxForm(NULL, array(), array('field_foobar_add_more' => t('Add another item')), NULL, array(), array(), 'entity-test-entity-test-form');
-    $this->drupalPostAjaxForm(NULL, array(), array('field_foobar_add_more' => t('Add another item')), NULL, array(), array(), 'entity-test-entity-test-form');
-
+    $this->getSession()->getPage()->findButton('field_foobar_add_more')->click();
+    $this->getSession()->getPage()->findButton('field_foobar_add_more')->click();
     $edit = array(
       'field_foobar[0][target_id]' => $this->adminUser->label() . ' (' . $this->adminUser->id() . ')',
       'field_foobar[0][target_type]' => 'user',
@@ -237,24 +239,24 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'user_id[0][target_id]' => $this->adminUser->label() . ' (' . $this->adminUser->id() . ')',
     );
 
-    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->submitForm($edit, t('Save'));
     $entities = \Drupal::entityManager()
       ->getStorage('entity_test')
       ->loadByProperties(array(
       'name' => 'Barfoo',
     ));
-    $this->assertEqual(1, count($entities), 'Entity was saved');
+    $this->assertSame(1, count($entities), 'Entity was saved');
     $entity = reset($entities);
     $this->drupalGet('entity_test/' . $entity->id());
-    $this->assertText('Barfoo');
-    $this->assertText($this->adminUser->label());
-    $this->assertText('item1');
-    $this->assertText('item2');
+    $this->assertSession()->pageTextContains('Barfoo');
+    $this->assertSession()->pageTextContains($this->adminUser->label());
+    $this->assertSession()->pageTextContains('item1');
+    $this->assertSession()->pageTextContains('item2');
 
-    $this->assertEqual(count($entity->field_foobar), 3, 'Three items in field');
-    $this->assertEqual($entity->field_foobar[0]->entity->label(), $this->adminUser->label());
-    $this->assertEqual($entity->field_foobar[1]->entity->label(), 'item1');
-    $this->assertEqual($entity->field_foobar[2]->entity->label(), 'item2');
+    $this->assertSame(count($entity->field_foobar), 3, 'Three items in field');
+    $this->assertSame($entity->field_foobar[0]->entity->label(), $this->adminUser->label());
+    $this->assertSame($entity->field_foobar[1]->entity->label(), 'item1');
+    $this->assertSame($entity->field_foobar[2]->entity->label(), 'item2');
 
     $this->drupalGet('entity_test/manage/' . $entity->id());
 
@@ -263,13 +265,13 @@ class DynamicEntityReferenceTest extends WebTestBase {
       $selection_settings = $settings[$expected_entity_type]['handler_settings'] ?: [];
       $data = serialize($selection_settings) . $expected_entity_type . $settings[$expected_entity_type]['handler'];
       $selection_settings_key = Crypt::hmacBase64($data, Settings::getHashSalt());
-      $input = $this->xpath('//input[@name=:name]', array(':name' => 'field_foobar[' . $index . '][target_id]'))[0];
+      $input = $this->getSession()->getPage()->findField('field_foobar[' . $index . '][target_id]');
       $expected_autocomplete_path = Url::fromRoute('system.entity_autocomplete', array(
         'target_type' => $expected_entity_type,
         'selection_handler' => $settings[$expected_entity_type]['handler'],
         'selection_settings_key' => $selection_settings_key,
       ))->toString();
-      $this->assertTrue(strpos((string) $input['data-autocomplete-path'], $expected_autocomplete_path) !== FALSE);
+      $this->assertTrue(strpos($input->getAttribute('data-autocomplete-path'), $expected_autocomplete_path) !== FALSE);
     }
 
     $edit = array(
@@ -277,13 +279,13 @@ class DynamicEntityReferenceTest extends WebTestBase {
       // Remove one child.
       'field_foobar[2][target_id]' => '',
     );
-    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->submitForm($edit, t('Save'));
     $this->drupalGet('entity_test/' . $entity->id());
-    $this->assertText('Bazbar');
+    $this->assertSession()->pageTextContains('Bazbar');
     // Reload entity.
     \Drupal::entityManager()->getStorage('entity_test')->resetCache(array($entity->id()));
-    $entity = entity_load('entity_test', $entity->id());
-    $this->assertEqual(count($entity->field_foobar), 2, 'Two values in field');
+    $entity = EntityTest::load($entity->id());
+    $this->assertSame(count($entity->field_foobar), 2, 'Two values in field');
 
     // Create two entities with the same label.
     $labels = array();
@@ -301,14 +303,14 @@ class DynamicEntityReferenceTest extends WebTestBase {
     $edit = array(
       'field_foobar[1][target_id]' => 'duplicate label',
     );
-    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->submitForm($edit, t('Save'));
 
     // We don't know the order in which the entities will be listed, so just
     // assert parts and make sure both are shown.
     $error_message = t('Multiple entities match this reference;');
-    $this->assertRaw($error_message);
-    $this->assertRaw($labels[0]);
-    $this->assertRaw($labels[1]);
+    $this->assertSession()->pageTextContains($error_message);
+    $this->assertSession()->pageTextContains($labels[0]);
+    $this->assertSession()->pageTextContains($labels[1]);
 
     // Create a few more to trigger the case where there are more than 5
     // matching results.
@@ -321,7 +323,7 @@ class DynamicEntityReferenceTest extends WebTestBase {
     }
 
     // Submit again with the same values.
-    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->submitForm($edit, t('Save'));
 
     $params = array(
       '%value' => 'duplicate label',
@@ -329,7 +331,7 @@ class DynamicEntityReferenceTest extends WebTestBase {
     // We don't know which id it will display, so just assert a part of the
     // error.
     $error_message = t('Many entities are called %value. Specify the one you want by appending the id in parentheses', $params);
-    $this->assertRaw($error_message);
+    $this->getSession()->getPage()->hasContent($error_message);
 
     // Submit with a label that does not match anything.
     // Now try to submit and just specify the label.
@@ -337,8 +339,8 @@ class DynamicEntityReferenceTest extends WebTestBase {
     $edit = array(
       'field_foobar[1][target_id]' => 'does not exist',
     );
-    $this->drupalPostForm(NULL, $edit, t('Save'));
-    $this->assertRaw(t('There are no entities matching "%value".', array('%value' => 'does not exist')));
+    $this->submitForm($edit, t('Save'));
+    $this->getSession()->getPage()->hasContent(t('There are no entities matching "%value".', array('%value' => 'does not exist')));
 
     $this->drupalGet('entity_test/manage/' . $entity->id());
     $edit = array(
@@ -346,13 +348,13 @@ class DynamicEntityReferenceTest extends WebTestBase {
       // Reference itself.
       'field_foobar[1][target_id]' => 'Bazbar (' . $entity->id() . ')',
     );
-    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->submitForm($edit, t('Save'));
     $this->drupalGet('entity_test/' . $entity->id());
-    $this->assertText('Bazbar');
+    $this->assertSession()->pageTextContains('Bazbar');
     // Reload entity.
     \Drupal::entityManager()->getStorage('entity_test')->resetCache(array($entity->id()));
     $entity = EntityTest::load($entity->id());
-    $this->assertEqual($entity->field_foobar[1]->entity->label(), 'Bazbar');
+    $this->assertSame($entity->field_foobar[1]->entity->label(), 'Bazbar');
   }
 
   /**
@@ -382,8 +384,8 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'field_name' => 'foobar',
       'new_storage_type' => 'dynamic_entity_reference',
     );
-    $this->drupalPostForm(NULL, $edit, t('Save and continue'));
-    $this->drupalPostForm(NULL, array(
+    $this->submitForm($edit, t('Save and continue'));
+    $this->submitForm(array(
       'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
       'settings[exclude_entity_types]' => FALSE,
       'settings[entity_type_ids][]' => array('taxonomy_term', 'user'),
@@ -392,12 +394,12 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'settings[taxonomy_term][handler_settings][target_bundles]['. $vocabulary->id() .']' => $vocabulary->id(),
       'settings[taxonomy_term][handler_settings][auto_create]' => TRUE,
     );
-    $this->drupalPostForm(NULL, $edit, t('Save settings'));
+    $this->submitForm($edit, t('Save settings'));
     $this->drupalGet('entity_test/add');
 
     // Add some extra dynamic entity reference fields.
-    $this->drupalPostAjaxForm(NULL, array(), array('field_foobar_add_more' => t('Add another item')), NULL, array(), array(), 'entity-test-entity-test-form');
-    $this->drupalPostAjaxForm(NULL, array(), array('field_foobar_add_more' => t('Add another item')), NULL, array(), array(), 'entity-test-entity-test-form');
+    $this->getSession()->getPage()->findButton('field_foobar_add_more')->click();
+    $this->getSession()->getPage()->findButton('field_foobar_add_more')->click();
     $edit = array(
       'field_foobar[0][target_id]' => $this->adminUser->label() . ' (' . $this->adminUser->id() . ')',
       'field_foobar[0][target_type]' => 'user',
@@ -410,25 +412,26 @@ class DynamicEntityReferenceTest extends WebTestBase {
       'user_id[0][target_id]' => $this->adminUser->label() . ' (' . $this->adminUser->id() . ')',
     );
 
-    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->submitForm($edit, t('Save'));
     $entities = \Drupal::entityManager()
       ->getStorage('entity_test')
       ->loadByProperties(array(
       'name' => 'Barfoo',
     ));
-    $this->assertEqual(1, count($entities), 'Entity was saved');
+    $this->assertSame(1, count($entities), 'Entity was saved');
     $entity = reset($entities);
+    $this->getSession()->getPage()->hasContent(t('%entity_type @id has been created.', array('@id' => $entity->id(), '%entity_type' => $entity->getEntityTypeId())));
 
-    $this->assertEqual(count($entity->field_foobar), 3, 'Three items in field');
-    $this->assertEqual($entity->field_foobar[0]->entity->label(), $this->adminUser->label());
-    $this->assertEqual($entity->field_foobar[1]->entity->label(), 'tag');
-    $this->assertEqual($entity->field_foobar[2]->entity->label(), $term->label());
+    $this->assertSame(count($entity->field_foobar), 3, 'Three items in field');
+    $this->assertSame($entity->field_foobar[0]->entity->label(), $this->adminUser->label());
+    $this->assertSame($entity->field_foobar[1]->entity->label(), 'tag');
+    $this->assertSame($entity->field_foobar[2]->entity->label(), $term->label());
 
     $this->drupalGet('entity_test/' . $entity->id());
-    $this->assertText('Barfoo');
-    $this->assertText($this->adminUser->label());
-    $this->assertText('tag');
-    $this->assertText($term->label());
+    $this->assertSession()->pageTextContains('Barfoo');
+    $this->assertSession()->pageTextContains($this->adminUser->label());
+    $this->assertSession()->pageTextContains('tag');
+    $this->assertSession()->pageTextContains($term->label());
 
   }
 
