diff --git a/src/DynamicEntityReferenceFieldItemList.php b/src/DynamicEntityReferenceFieldItemList.php
index af595ee..a95fb28 100644
--- a/src/DynamicEntityReferenceFieldItemList.php
+++ b/src/DynamicEntityReferenceFieldItemList.php
@@ -131,4 +131,24 @@ class DynamicEntityReferenceFieldItemList extends EntityReferenceFieldItemList {
     return $default_value;
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * When we validate the list, we make sure to give each item a chance to
+   * validate itself, as depending on the selected target type, we might need
+   * to apply bundle validation.
+   */
+  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..62ddcec 100644
--- a/src/Plugin/DataType/DynamicEntityReference.php
+++ b/src/Plugin/DataType/DynamicEntityReference.php
@@ -61,4 +61,29 @@ class DynamicEntityReference extends EntityReference {
     return $this->target;
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * The field-item list and the field-item refer validation of bundles to the
+   * entity property, as depending on the selected target-type, the bundle may
+   * need validation.
+   */
+  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->getSetting($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..2485154 100644
--- a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
+++ b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
@@ -472,4 +472,17 @@ class DynamicEntityReferenceItem extends ConfigurableEntityReferenceItem {
     return $target_types;
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * When we validate the item, we make sure to validate the entity property, as
+   * depending on the selected target type, we might need to apply bundle
+   * validation.
+   */
+  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..63a74c0 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 (%type) is not allowed for this field.';
 
 }
diff --git a/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php
index e429fe8..70e822b 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));
+      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..563dab4 100644
--- a/src/Tests/DynamicEntityReferenceFieldTest.php
+++ b/src/Tests/DynamicEntityReferenceFieldTest.php
@@ -78,13 +78,22 @@ class DynamicEntityReferenceFieldTest extends EntityUnitTestBase {
       ),
     ))->save();
 
-    FieldConfig::create(array(
+    FieldConfig::create([
       'field_name' => $this->fieldName,
       'entity_type' => $this->entityType,
       'bundle' => $this->bundle,
       'label' => 'Field test',
-      'settings' => array(),
-    ))->save();
+      'settings' => [
+        'entity_test_rev' => [
+          'handler' => 'default',
+          'handler_settings' => [
+            'target_bundles' => [
+              'entity_test',
+            ],
+          ],
+        ],
+      ],
+    ])->save();
 
   }
 
@@ -119,16 +128,21 @@ 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 (%type) 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 (%type) 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
+    // Test an invalid bundle.
+    $dud_referenced_entity = entity_create($this->referencedEntityType, array('type' => 'dud'));
+    $dud_referenced_entity->save();
+    $entity->{$this->fieldName}->entity = $dud_referenced_entity;
+    $violations = $entity->{$this->fieldName}->validate();
+    $this->assertEqual($violations->count(), 1, 'Validation throws a violation.');
+    $this->assertEqual($violations[0]->getMessage(), t('The entity must be of bundle %bundle.', array('%bundle' => 'entity_test')));
   }
 
   /**
