diff --git a/src/DynamicEntityReferenceFieldItemList.php b/src/DynamicEntityReferenceFieldItemList.php
index af595ee..751bf2c 100644
--- a/src/DynamicEntityReferenceFieldItemList.php
+++ b/src/DynamicEntityReferenceFieldItemList.php
@@ -131,4 +131,20 @@ class DynamicEntityReferenceFieldItemList extends EntityReferenceFieldItemList {
     return $default_value;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function validate() {
+    $return = NULL;
+    foreach ($this->list as $item) {
+      if (!$return) {
+        $return = $item->validate();
+      }
+      else {
+        $return->addAll($item->validate());
+      }
+    }
+    return $return;
+  }
+
 }
diff --git a/src/Plugin/DataType/DynamicEntityReference.php b/src/Plugin/DataType/DynamicEntityReference.php
index b7e2a17..285aeca 100644
--- a/src/Plugin/DataType/DynamicEntityReference.php
+++ b/src/Plugin/DataType/DynamicEntityReference.php
@@ -61,4 +61,25 @@ class DynamicEntityReference extends EntityReference {
     return $this->target;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getConstraints() {
+    $field = $this->parent->parent;
+    $values = $this->parent->getValue();
+    // We cannot validate the bundle until we know the target-type of this
+    // item.
+    if (isset($values['target_type'])) {
+      $target_type = $values['target_type'];
+      // Get the handler settings for the target type of this item.
+      $target_type_settings = $field->getSettings($target_type);
+      if (isset($target_type_settings['handler_settings']['target_bundles'])) {
+        // Add the constraint to limit the bundles of this item.
+        $this->definition->addConstraint('Bundle', ['bundle' => $target_type_settings['handler_settings']['target_bundles']]);
+      }
+    }
+    $constraints = parent::getConstraints();
+    return $constraints;
+  }
+
 }
diff --git a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
index 44e5a35..55ed36a 100644
--- a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
+++ b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
@@ -472,4 +472,13 @@ class DynamicEntityReferenceItem extends ConfigurableEntityReferenceItem {
     return $target_types;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function validate() {
+    $return = parent::validate();
+    $return->addAll($this->get('entity')->validate());
+    return $return;
+  }
+
 }
diff --git a/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraint.php b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraint.php
index a35d857..d898cef 100644
--- a/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraint.php
+++ b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraint.php
@@ -26,6 +26,7 @@ class ValidDynamicReferenceConstraint extends Constraint {
    *
    * @var string
    */
-  public $message = 'The referenced entity (%type: %id) does not exist.';
+  public $wrongIDMessage = 'The referenced entity (%type: %id) does not exist.';
+  public $wrongTypeMessage = 'The referenced entity (%type: %id) is not allowed for this field.';
 
 }
diff --git a/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php
index e429fe8..baeda4f 100644
--- a/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php
+++ b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php
@@ -20,6 +20,7 @@ class ValidDynamicReferenceConstraintValidator extends ConstraintValidator {
    * {@inheritdoc}
    */
   public function validate($value, Constraint $constraint) {
+    /* @var \Drupal\dynamic_entity_reference\Plugin\Validation\Constraint\ValidDynamicReferenceConstraint $constraint */
     /* @var \Drupal\Core\Field\FieldItemInterface $value */
     if (!isset($value)) {
       return;
@@ -32,10 +33,14 @@ class ValidDynamicReferenceConstraintValidator extends ConstraintValidator {
     if (empty($id) && $valid_type) {
       return;
     }
+    if (!$valid_type) {
+      $this->context->addViolation($constraint->wrongTypeMessage, array('%type' => $type, '%id' => $id));
+      return;
+    }
     $referenced_entity = $value->get('entity')->getValue();
-    /** @var \Drupal\dynamic_entity_reference\Plugin\Validation\Constraint\ValidDynamicReferenceConstraint $constraint */
-    if (!$valid_type || !$referenced_entity) {
-      $this->context->addViolation($constraint->message, array('%type' => $type, '%id' => $id));
+    if (!$referenced_entity) {
+      $this->context->addViolation($constraint->wrongIDMessage, array('%type' => $type, '%id' => $id));
     }
   }
+
 }
diff --git a/src/Tests/DynamicEntityReferenceFieldTest.php b/src/Tests/DynamicEntityReferenceFieldTest.php
index 8d26469..001c510 100644
--- a/src/Tests/DynamicEntityReferenceFieldTest.php
+++ b/src/Tests/DynamicEntityReferenceFieldTest.php
@@ -119,13 +119,13 @@ class DynamicEntityReferenceFieldTest extends EntityUnitTestBase {
     $entity->{$this->fieldName}->target_id = $referenced_entity->id();
     $violations = $entity->{$this->fieldName}->validate();
     $this->assertEqual($violations->count(), 1, 'Validation throws a violation.');
-    $this->assertEqual($violations[0]->getMessage(), t('The referenced entity (%type: %id) does not exist.', array('%type' => $this->entityType, '%id' => $referenced_entity->id())));
+    $this->assertEqual($violations[0]->getMessage(), t('The referenced entity (%type: %id) is not allowed for this field.', array('%type' => $this->entityType, '%id' => $referenced_entity->id())));
 
     // Test an invalid entity.
     $entity->{$this->fieldName}->entity = $entity;
     $violations = $entity->{$this->fieldName}->validate();
     $this->assertEqual($violations->count(), 1, 'Validation throws a violation.');
-    $this->assertEqual($violations[0]->getMessage(), t('The referenced entity (%type: %id) does not exist.', array('%type' => $entity->getEntityTypeId(), '%id' => -1)));
+    $this->assertEqual($violations[0]->getMessage(), t('The referenced entity (%type: %id) is not allowed for this field.', array('%type' => $entity->getEntityTypeId(), '%id' => -1)));
 
     // @todo Implement a test case for invalid bundle references after
     // https://drupal.org/node/2064191 is fixed
