diff --git a/core/lib/Drupal/Component/Plugin/ContextAwarePluginBase.php b/core/lib/Drupal/Component/Plugin/ContextAwarePluginBase.php
index e24ea43..f04f07d 100644
--- a/core/lib/Drupal/Component/Plugin/ContextAwarePluginBase.php
+++ b/core/lib/Drupal/Component/Plugin/ContextAwarePluginBase.php
@@ -130,12 +130,6 @@ public function setContextValue($name, $value) {
     $context_definition = $this->getContextDefinition($name);
     $this->context[$name] = new Context($context_definition);
     $this->context[$name]->setContextValue($value);
-
-    // Verify the provided value validates.
-    $violations = $this->context[$name]->validate();
-    if (count($violations) > 0) {
-      throw new PluginException("The provided context value does not pass validation.");
-    }
     return $this;
   }
 
diff --git a/core/lib/Drupal/Core/Plugin/ContextAwarePluginBase.php b/core/lib/Drupal/Core/Plugin/ContextAwarePluginBase.php
index 19f5825..d369bcc 100644
--- a/core/lib/Drupal/Core/Plugin/ContextAwarePluginBase.php
+++ b/core/lib/Drupal/Core/Plugin/ContextAwarePluginBase.php
@@ -8,7 +8,6 @@
 namespace Drupal\Core\Plugin;
 
 use Drupal\Component\Plugin\ContextAwarePluginBase as ComponentContextAwarePluginBase;
-use Drupal\Component\Plugin\Exception\PluginException;
 use Drupal\Core\Plugin\Context\Context;
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
@@ -48,11 +47,6 @@ public function setContextValue($name, $value) {
     // Use the Drupal specific context class.
     $this->context[$name] = new Context($context_definition);
     $this->context[$name]->setContextValue($value);
-
-    // Verify the provided value validates.
-    if ($this->context[$name]->validate()->count() > 0) {
-      throw new PluginException("The provided context value does not pass validation.");
-    }
     return $this;
   }
 
diff --git a/core/modules/system/src/Tests/Plugin/ContextPluginTest.php b/core/modules/system/src/Tests/Plugin/ContextPluginTest.php
index 748487e..cd7dbfe 100644
--- a/core/modules/system/src/Tests/Plugin/ContextPluginTest.php
+++ b/core/modules/system/src/Tests/Plugin/ContextPluginTest.php
@@ -83,13 +83,9 @@ function testContext() {
     }
 
     // Try to pass the wrong class type as a context value.
-    try {
-      $plugin->setContextValue('user', $node);
-      $this->fail('The node context should fail validation for a user context.');
-    }
-    catch (PluginException $e) {
-      $this->assertEqual($e->getMessage(), 'The provided context value does not pass validation.');
-    }
+    $plugin->setContextValue('user', $node);
+    $violations = $plugin->validateContexts();
+    $this->assertTrue(!empty($violations), 'The provided context value does not pass validation.');
 
     // Set an appropriate context value appropriately and check to make sure
     // its methods work as expected.
diff --git a/core/modules/user/src/Plugin/Condition/UserRole.php b/core/modules/user/src/Plugin/Condition/UserRole.php
new file mode 100644
index 0000000..2a67813
--- /dev/null
+++ b/core/modules/user/src/Plugin/Condition/UserRole.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Plugin\Condition\UserRole.
+ */
+
+namespace Drupal\user\Plugin\Condition;
+
+use Drupal\Core\Condition\ConditionPluginBase;
+
+/**
+ * Provides a 'User Role' condition.
+ *
+ * @Condition(
+ *   id = "user_role",
+ *   label = @Translation("User Role"),
+ *   context = {
+ *     "user" = {
+ *       "type" = "entity:user"
+ *     }
+ *   }
+ * )
+ */
+class UserRole extends ConditionPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, array &$form_state) {
+    $form = parent::buildConfigurationForm($form, $form_state);
+    $form['roles'] = array(
+      '#type' => 'checkboxes',
+      '#title' => $this->t('When the user has the following roles'),
+      '#default_value' => $this->configuration['roles'],
+      '#options' => array_map('\Drupal\Component\Utility\String::checkPlain', user_role_names()),
+      '#description' => $this->t('If you select no roles, the condition will evaluate to TRUE for all users.'),
+      '#required' => TRUE,
+    );
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return array(
+      'roles' => array(),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, array &$form_state) {
+    $this->configuration['roles'] = array_filter($form_state['values']['roles']);
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function summary() {
+    if (count($this->configuration['roles']) > 1) {
+      $roles = $this->configuration['roles'];
+      $roles = implode(', ', $roles);
+    }
+    else {
+      $roles = reset($this->configuration['roles']);
+    }
+    if (!empty($this->configuration['negate'])) {
+      return $this->t('The user is not a member of @roles', array('@roles' => $roles));
+    }
+    else {
+      return $this->t('The user is a member of @roles', array('@roles' => $roles));
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function evaluate() {
+    $user = $this->getContextValue('user');
+    return (bool) array_intersect(array_filter($this->configuration['roles']), $user->getRoles());
+  }
+
+}
diff --git a/core/modules/user/src/Tests/Condition/UserRoleConditionTest.php b/core/modules/user/src/Tests/Condition/UserRoleConditionTest.php
new file mode 100644
index 0000000..1d0e24c
--- /dev/null
+++ b/core/modules/user/src/Tests/Condition/UserRoleConditionTest.php
@@ -0,0 +1,158 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Tests\Condition\UserRoleConditionTest.
+ */
+
+namespace Drupal\user\Tests\Condition;
+
+use Drupal\simpletest\KernelTestBase;
+use Drupal\user\Entity\Role;
+use Drupal\user\Entity\User;
+
+/**
+ * Tests the user role condition.
+ */
+class UserRoleConditionTest extends KernelTestBase {
+
+  /**
+   * The condition plugin manager.
+   *
+   * @var \Drupal\Core\Condition\ConditionManager
+   */
+  protected $manager;
+
+  /**
+   * An anonymous user for testing purposes.
+   *
+   * @var \Drupal\user\Entity\User
+   */
+  protected $anonymous;
+
+  /**
+   * An authenticated user for testing purposes.
+   *
+   * @var \Drupal\user\Entity\User
+   */
+  protected $authenticated;
+
+  /**
+   * A custom role for testing purposes.
+   *
+   * @var \Drupal\user\Entity\Role
+   */
+  protected $role;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('system', 'user', 'field');
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'User Role Condition Plugin',
+      'description' => 'Tests that the User Role Condition, provided by the user module, is working properly.',
+      'group' => 'Condition API',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', 'sequences');
+    $this->installEntitySchema('user');
+
+    $this->manager = $this->container->get('plugin.manager.condition');
+
+    // Create new role.
+    $rid = strtolower($this->randomName(8));
+    $label = $this->randomString(8);
+    $role = Role::create(array(
+      'id' => $rid,
+      'label' => $label,
+    ));
+    $role->save();
+    $this->role = $role;
+
+    // Setup an anonymous user for our tests.
+    $this->anonymous = User::create(array(
+      'uid' => 0,
+    ));
+    $this->anonymous->save();
+    // Loading the anonymous user adds the correct role.
+    $this->anonymous = User::load($this->anonymous->id());
+
+    // Setup an authenticated user for our tests.
+    $this->authenticated = User::create(array(
+      'name' => $this->randomName(),
+    ));
+    $this->authenticated->save();
+    // Add the custom role.
+    $this->authenticated->addRole($this->role->id());
+  }
+
+  /**
+   * Test the user_role condition.
+   */
+  public function testConditions() {
+    // Grab the user role condition and configure it to check against
+    // authenticated user roles.
+    /** @var $condition \Drupal\Core\Condition\ConditionInterface */
+    $condition = $this->manager->createInstance('user_role')
+      ->setConfig('roles', array(DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID))
+      ->setContextValue('user', $this->anonymous);
+    $this->assertFalse($condition->execute(), 'Anonymous users fail role checks for authenticated.');
+    // Check for the proper summary.
+    // Summaries require an extra space due to negate handling in summary().
+    $this->assertEqual($condition->summary(), 'The user is a member of authenticated');
+
+    // Set the user role to anonymous.
+    $condition->setConfig('roles', array(DRUPAL_ANONYMOUS_RID => DRUPAL_ANONYMOUS_RID));
+    $this->assertTrue($condition->execute(), 'Anonymous users pass role checks for anonymous.');
+    // Check for the proper summary.
+    $this->assertEqual($condition->summary(), 'The user is a member of anonymous');
+
+    // Set the user role to check anonymous or authenticated.
+    $condition->setConfig('roles', array(DRUPAL_ANONYMOUS_RID => DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID));
+    $this->assertTrue($condition->execute(), 'Anonymous users pass role checks for anonymous or authenticated.');
+    // Check for the proper summary.
+    $this->assertEqual($condition->summary(), 'The user is a member of anonymous, authenticated');
+
+    // Set the context to the authenticated user and check that they also pass
+    // against anonymous or authenticated roles.
+    $condition->setContextValue('user', $this->authenticated);
+    $this->assertTrue($condition->execute(), 'Authenticated users pass role checks for anonymous or authenticated.');
+
+    // Set the role to just authenticated and recheck.
+    $condition->setConfig('roles', array(DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID));
+    $this->assertTrue($condition->execute(), 'Authenticated users pass role checks for authenticated.');
+
+    // Test Constructor injection.
+    $condition = $this->manager->createInstance('user_role', array('roles' => array(DRUPAL_AUTHENTICATED_RID), 'context' => array('user' => $this->authenticated)));
+    $this->assertTrue($condition->execute(), 'Constructor injection of context and configuration working as anticipated.');
+
+    // Check the negated summary.
+    $condition->setConfig('negate', TRUE);
+    $this->assertEqual($condition->summary(), 'The user is not a member of authenticated');
+
+    // Check the complex negated summary.
+    $condition->setConfig('roles', array(DRUPAL_ANONYMOUS_RID => DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID));
+    $this->assertEqual($condition->summary(), 'The user is not a member of anonymous, authenticated');
+
+    // Check a custom role.
+    $condition->setConfig('roles', array($this->role->id() => $this->role->id()));
+    $condition->setConfig('negate', FALSE);
+    $this->assertTRUE($condition->execute(), 'Authenticated user is a member of the custom role.');
+    $this->assertEqual($condition->summary(), 'The user is a member of ' . $this->role->id());
+  }
+
+}
