diff --git a/core/lib/Drupal/Core/TypedData/Type/Email.php b/core/lib/Drupal/Core/TypedData/Type/Email.php
index e9a9c5a..d018e28 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Email.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Email.php
@@ -18,7 +18,10 @@ class Email extends String {
    * Implements \Drupal\Core\TypedData\TypedDataInterface::validate().
    */
   public function validate() {
-    // @todo Implement validate() method.
+    if (filter_var($this->value, FILTER_VALIDATE_EMAIL)) {
+      return parent::validate();
+    }
+    return FALSE;
   }
 
 }
diff --git a/core/lib/Drupal/Core/Validation/ConstraintManager.php b/core/lib/Drupal/Core/Validation/ConstraintManager.php
index dd3ece7..1458f72 100644
--- a/core/lib/Drupal/Core/Validation/ConstraintManager.php
+++ b/core/lib/Drupal/Core/Validation/ConstraintManager.php
@@ -36,6 +36,8 @@
  */
 class ConstraintManager extends PluginManagerBase {
 
+  protected $definitions = array();
+
   /**
    * Overrides \Drupal\Component\Plugin\PluginManagerBase::__construct().
    */
@@ -47,8 +49,12 @@ public function __construct() {
     $this->discovery = new AlterDecorator($this->discovery, 'validation_constraint');
     $this->discovery = new CacheDecorator($this->discovery, 'validation_constraints:' . language(LANGUAGE_TYPE_INTERFACE)->langcode);
 
-    $this->factory = new DefaultFactory($this->discovery);
+    // We overrode getDefinition() and getDefinitions() so we must pass the
+    // PluginManager and not just discovery.
+    $this->factory = new DefaultFactory($this);
+  }
 
+  protected function registerDefinitions() {
     // Add in definitions for constraints shipped with Symfony.
     $this->discovery->setDefinition('Null', array(
       'label' => t('Null'),
@@ -73,6 +79,28 @@ public function __construct() {
   }
 
   /**
+   * Implements Drupal\Component\Plugin\PluginManagerInterface::getDefinition().
+   */
+  public function getDefinition($plugin_id) {
+    if (!$this->definitions) {
+      $this->registerDefinitions();
+      $this->definitions = $this->discovery->getDefinitions();
+    }
+    return $this->definitions[$plugin_id];
+  }
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginManagerInterface::getDefinitions().
+   */
+  public function getDefinitions() {
+    if (!$this->definitions) {
+      $this->registerDefinitions();
+      $this->definitions = $this->discovery->getDefinitions();
+    }
+    return $this->definitions;
+  }
+
+  /**
    * Process definition callback for the ProcessDecorator.
    */
   public function processDefinition(&$definition, $plugin_id) {
