diff --git a/core/lib/Drupal/Core/Plugin/Context/ContextHandler.php b/core/lib/Drupal/Core/Plugin/Context/ContextHandler.php
index 3638f9c..b3694f9 100644
--- a/core/lib/Drupal/Core/Plugin/Context/ContextHandler.php
+++ b/core/lib/Drupal/Core/Plugin/Context/ContextHandler.php
@@ -8,12 +8,10 @@
 namespace Drupal\Core\Plugin\Context;
 
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\Core\Plugin\Context\ContextDefinitionInterface;
 use Drupal\Component\Plugin\ContextAwarePluginInterface;
 use Drupal\Component\Plugin\Exception\ContextException;
 use Drupal\Component\Utility\String;
-use Drupal\Core\TypedData\DataDefinitionInterface;
-use Drupal\Core\TypedData\DataDefinition;
-use Drupal\Core\TypedData\TypedDataManager;
 
 /**
  * Provides methods to handle sets of contexts.
@@ -21,23 +19,6 @@
 class ContextHandler implements ContextHandlerInterface {
 
   /**
-   * The typed data manager.
-   *
-   * @var \Drupal\Core\TypedData\TypedDataManager
-   */
-  protected $typedDataManager;
-
-  /**
-   * Constructs a new ContextHandler.
-   *
-   * @param \Drupal\Core\TypedData\TypedDataManager $typed_data
-   *   The typed data manager.
-   */
-  public function __construct(TypedDataManager $typed_data) {
-    $this->typedDataManager = $typed_data;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function filterPluginDefinitionsByContexts(array $contexts, array $definitions) {
@@ -47,37 +28,8 @@ public function filterPluginDefinitionsByContexts(array $contexts, array $defini
         return TRUE;
       }
 
-      // Build an array of requirements out of the contexts specified by the
-      // plugin definition.
-      $requirements = array();
-      /** @var $plugin_context \Drupal\Core\Plugin\Context\ContextDefinitionInterface */
-      foreach ($plugin_definition['context'] as $context_id => $plugin_context) {
-        $definition = $this->typedDataManager->getDefinition($plugin_context->getDataType());
-        $definition['type'] = $plugin_context->getDataType();
-
-        // If the plugin specifies additional constraints, add them to the
-        // constraints defined by the plugin type.
-        if ($plugin_constraints = $plugin_context->getConstraints()) {
-          // Ensure the array exists before adding in constraints.
-          if (!isset($definition['constraints'])) {
-            $definition['constraints'] = array();
-          }
-
-          $definition['constraints'] += $plugin_constraints;
-        }
-
-        // Assume the requirement is required if unspecified.
-        if (!isset($definition['required'])) {
-          $definition['required'] = TRUE;
-        }
-
-        // @todo Use context definition objects after
-        //   https://drupal.org/node/2281635.
-        $requirements[$context_id] = new DataDefinition($definition);
-      }
-
       // Check the set of contexts against the requirements.
-      return $this->checkRequirements($contexts, $requirements);
+      return $this->checkRequirements($contexts, $plugin_definition['context']);
     });
   }
 
@@ -96,17 +48,16 @@ public function checkRequirements(array $contexts, array $requirements) {
   /**
    * {@inheritdoc}
    */
-  public function getMatchingContexts(array $contexts, DataDefinitionInterface $definition) {
+  public function getMatchingContexts(array $contexts, ContextDefinitionInterface $definition) {
     return array_filter($contexts, function (ContextInterface $context) use ($definition) {
-      $context_definition = $context->getContextDefinition()->getDataDefinition();
+      $context_definition = $context->getContextDefinition();
 
       // If the data types do not match, this context is invalid.
-      if ($definition->getDataType() != $context_definition->getDataType()) {
+      if ($definition->getDataType() != $context_definition->getDataType() && $definition->getDataType() != 'any') {
         return FALSE;
       }
 
       // If any constraint does not match, this context is invalid.
-      // @todo This is too restrictive, consider only relying on data types.
       foreach ($definition->getConstraints() as $constraint_name => $constraint) {
         if ($context_definition->getConstraint($constraint_name) != $constraint) {
           return FALSE;
diff --git a/core/lib/Drupal/Core/Plugin/Context/ContextHandlerInterface.php b/core/lib/Drupal/Core/Plugin/Context/ContextHandlerInterface.php
index b39df2c..c13bec1 100644
--- a/core/lib/Drupal/Core/Plugin/Context/ContextHandlerInterface.php
+++ b/core/lib/Drupal/Core/Plugin/Context/ContextHandlerInterface.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\Core\Plugin\Context;
 
+use Drupal\Core\Plugin\Context\ContextDefinitionInterface;
 use Drupal\Component\Plugin\ContextAwarePluginInterface;
-use Drupal\Core\TypedData\DataDefinitionInterface;
 
 /**
  * Provides an interface for handling sets of contexts.
@@ -53,13 +53,13 @@ public function checkRequirements(array $contexts, array $requirements);
    *
    * @param \Drupal\Component\Plugin\Context\ContextInterface[] $contexts
    *   An array of contexts.
-   * @param \Drupal\Core\TypedData\DataDefinitionInterface $definition
+   * @param \Drupal\Component\Plugin\Context\ContextDefinitionInterface $definition
    *   The definition to satisfy.
    *
    * @return \Drupal\Component\Plugin\Context\ContextInterface[]
    *   An array of matching contexts.
    */
-  public function getMatchingContexts(array $contexts, DataDefinitionInterface $definition);
+  public function getMatchingContexts(array $contexts, ContextDefinitionInterface $definition);
 
   /**
    * Prepares a plugin for evaluation.
diff --git a/core/modules/node/config/install/entity.view_mode.node.search_index.yml b/core/modules/node/config/install/entity.view_mode.node.search_index.yml
index 54385d9..c5d9706 100644
--- a/core/modules/node/config/install/entity.view_mode.node.search_index.yml
+++ b/core/modules/node/config/install/entity.view_mode.node.search_index.yml
@@ -6,3 +6,4 @@ targetEntityType: node
 dependencies:
   module:
     - node
+    - search
diff --git a/core/modules/node/config/install/entity.view_mode.node.search_result.yml b/core/modules/node/config/install/entity.view_mode.node.search_result.yml
index a680fa0..9948ae7 100644
--- a/core/modules/node/config/install/entity.view_mode.node.search_result.yml
+++ b/core/modules/node/config/install/entity.view_mode.node.search_result.yml
@@ -6,3 +6,4 @@ targetEntityType: node
 dependencies:
   module:
     - node
+    - search
diff --git a/core/modules/node/src/Tests/NodeSaveTest.php b/core/modules/node/src/Tests/NodeSaveTest.php
index 0377705..735df30 100644
--- a/core/modules/node/src/Tests/NodeSaveTest.php
+++ b/core/modules/node/src/Tests/NodeSaveTest.php
@@ -30,6 +30,10 @@ public static function getInfo() {
   function setUp() {
     parent::setUp();
 
+    debug(\Drupal::configFactory()->listAll());
+    \Drupal::moduleHandler()->install(array('views'));
+    debug(\Drupal::configFactory()->listAll());
+
     // Create a user that is allowed to post; we'll use this to test the submission.
     $web_user = $this->drupalCreateUser(array('create article content'));
     $this->drupalLogin($web_user);
diff --git a/core/tests/Drupal/Tests/Core/Plugin/ContextHandlerTest.php b/core/tests/Drupal/Tests/Core/Plugin/ContextHandlerTest.php
index 1569ef7..ed42c63 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/ContextHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/ContextHandlerTest.php
@@ -11,8 +11,6 @@
 use Drupal\Component\Plugin\ContextAwarePluginInterface;
 use Drupal\Core\Plugin\Context\ContextDefinition;
 use Drupal\Core\Plugin\Context\ContextHandler;
-use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -27,13 +25,6 @@
 class ContextHandlerTest extends UnitTestCase {
 
   /**
-   * The typed data manager.
-   *
-   * @var \Drupal\Core\TypedData\TypedDataManager|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $typedDataManager;
-
-  /**
    * The context handler.
    *
    * @var \Drupal\Core\Plugin\Context\ContextHandler
@@ -59,28 +50,7 @@ public static function getInfo() {
   protected function setUp() {
     parent::setUp();
 
-    $this->typedDataManager = $this->getMockBuilder('Drupal\Core\TypedData\TypedDataManager')
-      ->disableOriginalConstructor()
-      ->getMock();
-    $this->typedDataManager->expects($this->any())
-      ->method('getDefaultConstraints')
-      ->will($this->returnValue(array()));
-    $this->typedDataManager->expects($this->any())
-      ->method('createDataDefinition')
-      ->will($this->returnValueMap(array(
-        array('expected_data_type', new DataDefinition(array('type' => 'expected_data_type'))),
-        array('mismatched_data_type', new DataDefinition(array('type' => 'mismatched_data_type'))),
-        array('unexpected_data_type', new DataDefinition(array('type' => 'unexpected_data_type'))),
-        array('empty', new DataDefinition(array())),
-        array('foo', new DataDefinition(array('type' => 'foo'))),
-        array('fuzzy', new DataDefinition(array('type' => 'fuzzy'))),
-        array('specific', new DataDefinition(array('type' => 'foo'))),
-      )));
-    $this->contextHandler = new ContextHandler($this->typedDataManager);
-
-    $container = new ContainerBuilder();
-    $container->set('typed_data_manager', $this->typedDataManager);
-    \Drupal::setContainer($container);
+    $this->contextHandler = new ContextHandler();
   }
 
   /**
@@ -96,37 +66,19 @@ public function testCheckRequirements($contexts, $requirements, $expected) {
    * Provides data for testCheckRequirements().
    */
   public function providerTestCheckRequirements() {
-    $requirement_optional = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
-    $requirement_optional->expects($this->atLeastOnce())
-      ->method('isRequired')
-      ->will($this->returnValue(FALSE));
+    $requirement_optional = new ContextDefinition();
+    $requirement_optional->setRequired(FALSE);
 
-    $requirement_any = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
-    $requirement_any->expects($this->atLeastOnce())
-      ->method('isRequired')
-      ->will($this->returnValue(TRUE));
-    $requirement_any->expects($this->atLeastOnce())
-      ->method('getDataType')
-      ->will($this->returnValue('any'));
-    $requirement_any->expects($this->atLeastOnce())
-      ->method('getConstraints')
-      ->will($this->returnValue(array()));
+    $requirement_any = new ContextDefinition();
+    $requirement_any->setRequired(TRUE);
 
     $context_any = $this->getMock('Drupal\Core\Plugin\Context\ContextInterface');
     $context_any->expects($this->atLeastOnce())
       ->method('getContextDefinition')
       ->will($this->returnValue(new ContextDefinition('empty')));
 
-    $requirement_specific = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
-    $requirement_specific->expects($this->atLeastOnce())
-      ->method('isRequired')
-      ->will($this->returnValue(TRUE));
-    $requirement_specific->expects($this->atLeastOnce())
-      ->method('getDataType')
-      ->will($this->returnValue('foo'));
-    $requirement_specific->expects($this->atLeastOnce())
-      ->method('getConstraints')
-      ->will($this->returnValue(array('bar' => 'baz')));
+    $requirement_specific = new ContextDefinition('specific');
+    $requirement_specific->setConstraints(array('bar' => 'baz'));
 
     $context_constraint_mismatch = $this->getMock('Drupal\Core\Plugin\Context\ContextInterface');
     $context_constraint_mismatch->expects($this->atLeastOnce())
@@ -173,26 +125,10 @@ public function testGetMatchingContexts($contexts, $requirement, $expected = NUL
    * Provides data for testGetMatchingContexts().
    */
   public function providerTestGetMatchingContexts() {
-    $requirement_any = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
-    $requirement_any->expects($this->atLeastOnce())
-      ->method('isRequired')
-      ->will($this->returnValue(TRUE));
-    $requirement_any->expects($this->atLeastOnce())
-      ->method('getDataType')
-      ->will($this->returnValue('any'));
-    $requirement_any->expects($this->atLeastOnce())
-      ->method('getConstraints')
-      ->will($this->returnValue(array()));
-    $requirement_specific = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
-    $requirement_specific->expects($this->atLeastOnce())
-      ->method('isRequired')
-      ->will($this->returnValue(TRUE));
-    $requirement_specific->expects($this->atLeastOnce())
-      ->method('getDataType')
-      ->will($this->returnValue('foo'));
-    $requirement_specific->expects($this->atLeastOnce())
-      ->method('getConstraints')
-      ->will($this->returnValue(array('bar' => 'baz')));
+    $requirement_any = new ContextDefinition();
+
+    $requirement_specific = new ContextDefinition('specific');
+    $requirement_specific->setConstraints(array('bar' => 'baz'));
 
     $context_any = $this->getMock('Drupal\Core\Plugin\Context\ContextInterface');
     $context_any->expects($this->atLeastOnce())
@@ -234,7 +170,7 @@ public function providerTestGetMatchingContexts() {
    *
    * @dataProvider providerTestFilterPluginDefinitionsByContexts
    */
-  public function testFilterPluginDefinitionsByContexts($has_context, $definitions, $expected, $typed_data_definition = NULL) {
+  public function testFilterPluginDefinitionsByContexts($has_context, $definitions, $expected) {
     if ($has_context) {
       $context = $this->getMock('Drupal\Core\Plugin\Context\ContextInterface');
       $expected_context_definition = (new ContextDefinition('expected_data_type'))->setConstraints(array('expected_constraint_name' => 'expected_constraint_value'));
@@ -247,12 +183,6 @@ public function testFilterPluginDefinitionsByContexts($has_context, $definitions
       $contexts = array();
     }
 
-    if ($typed_data_definition) {
-      $this->typedDataManager->expects($this->atLeastOnce())
-        ->method('getDefinition')
-        ->will($this->returnValueMap($typed_data_definition));
-    }
-
     $this->assertSame($expected, $this->contextHandler->filterPluginDefinitionsByContexts($contexts, $definitions));
   }
 
@@ -276,7 +206,7 @@ public function providerTestFilterPluginDefinitionsByContexts() {
 
     $plugins = array('expected_plugin' => array('context' => array('context1' => new ContextDefinition('expected_data_type'))));
     // Missing context, no plugins available.
-    $data[] = array(array(), $plugins, array());
+    $data[] = array(FALSE, $plugins, array());
     // Satisfied context, all plugins available.
     $data[] = array(TRUE, $plugins, $plugins);
 
@@ -285,42 +215,30 @@ public function providerTestFilterPluginDefinitionsByContexts() {
     // Mismatched constraints, no plugins available.
     $data[] = array(TRUE, $plugins, array());
 
+    $optional_mismatched_context_definition = clone $mismatched_context_definition;
+    $optional_mismatched_context_definition->setRequired(FALSE);
+    $plugins = array('expected_plugin' => array('context' => array('context1' => $optional_mismatched_context_definition)));
+    // Optional mismatched constraint, all plugins available.
+    $data[] = array(FALSE, $plugins, $plugins);
+
     $expected_context_definition = (new ContextDefinition('expected_data_type'))->setConstraints(array('expected_constraint_name' => 'expected_constraint_value'));
     $plugins = array('expected_plugin' => array('context' => array('context1' => $expected_context_definition)));
     // Satisfied context with constraint, all plugins available.
     $data[] = array(TRUE, $plugins, $plugins);
 
-    $typed_data = array(array('expected_data_type', TRUE, array('required' => FALSE)));
-    // Optional unsatisfied context from TypedData, all plugins available.
-    $data[] = array(FALSE, $plugins, $plugins, $typed_data);
-
-    $typed_data = array(array('expected_data_type', TRUE, array('required' => TRUE)));
-    // Required unsatisfied context from TypedData, no plugins available.
-    $data[] = array(FALSE, $plugins, array(), $typed_data);
-
-    $typed_data = array(array('expected_data_type', TRUE, array('constraints' => array('mismatched_constraint_name' => 'mismatched_constraint_value'), 'required' => FALSE)));
-    // Optional mismatched constraint from TypedData, all plugins available.
-    $data[] = array(FALSE, $plugins, $plugins, $typed_data);
-
-    $typed_data = array(array('expected_data_type', TRUE, array('constraints' => array('mismatched_constraint_name' => 'mismatched_constraint_value'), 'required' => TRUE)));
-    // Required mismatched constraint from TypedData, no plugins available.
-    $data[] = array(FALSE, $plugins, array(), $typed_data);
-
-    $typed_data = array(array('expected_data_type', TRUE, array('constraints' => array('expected_constraint_name' => 'expected_constraint_value'))));
-    // Satisfied constraint from TypedData, all plugins available.
-    $data[] = array(TRUE, $plugins, $plugins, $typed_data);
+    $optional_expected_context_definition = clone $expected_context_definition;
+    $optional_expected_context_definition->setRequired(FALSE);
+    $plugins = array('expected_plugin' => array('context' => array('context1' => $optional_expected_context_definition)));
+    // Optional unsatisfied context, all plugins available.
+    $data[] = array(FALSE, $plugins, $plugins);
 
     $unexpected_context_definition = (new ContextDefinition('unexpected_data_type'))->setConstraints(array('mismatched_constraint_name' => 'mismatched_constraint_value'));
     $plugins = array(
       'unexpected_plugin' => array('context' => array('context1' => $unexpected_context_definition)),
       'expected_plugin' => array('context' => array('context2' => new ContextDefinition('expected_data_type'))),
     );
-    $typed_data = array(
-      array('unexpected_data_type', TRUE, array()),
-      array('expected_data_type', TRUE, array('constraints' => array('expected_constraint_name' => 'expected_constraint_value'))),
-    );
     // Context only satisfies one plugin.
-    $data[] = array(TRUE, $plugins, array('expected_plugin' => $plugins['expected_plugin']), $typed_data);
+    $data[] = array(TRUE, $plugins, array('expected_plugin' => $plugins['expected_plugin']));
 
     return $data;
   }
