diff --git a/src/Plugin/DataType/DynamicEntityReference.php b/src/Plugin/DataType/DynamicEntityReference.php
index b7e2a17..637df5d 100644
--- a/src/Plugin/DataType/DynamicEntityReference.php
+++ b/src/Plugin/DataType/DynamicEntityReference.php
@@ -61,4 +61,30 @@ 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() {
+    /* @var \Drupal\dynamic_entity_reference\Plugin\Field\FieldType\DynamicEntityReferenceFieldItemList $field */
+    $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/Validation/Constraint/ValidDynamicReferenceConstraint.php b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraint.php
index d262495..0a62850 100644
--- a/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraint.php
+++ b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraint.php
@@ -26,7 +26,9 @@ 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.';
+  public $wrongBundleMessage = 'The entity bundle must be one of %bundles, the selected entity is of bundle %bundle.';
 
   /**
    * Validation message when the target_id or target_type is empty.
diff --git a/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php b/src/Plugin/Validation/Constraint/ValidDynamicReferenceConstraintValidator.php
index e0ac3eb..2734763 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;
@@ -46,10 +47,54 @@ 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));
+      return;
+    }
+    // Get the handler settings for the target type of this item.
+    $target_type_settings = $value->getParent()->getSetting($type);
+    // No bundles selected = all bundles are valid.
+    if (!empty($target_type_settings['handler_settings']['target_bundles'])) {
+      if (!in_array($referenced_entity->bundle(), $target_type_settings['handler_settings']['target_bundles'], TRUE)) {
+        $this->context->addViolation($constraint->wrongBundleMessage, array(
+          '%bundles' => implode(', ', $target_type_settings['handler_settings']['target_bundles']),
+          '%bundle' => $referenced_entity->bundle(),
+        ));
+        return;
+      }
+    }
+
+  }
+  /**
+   * {@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() {
+    /* @var \Drupal\dynamic_entity_reference\Plugin\Field\FieldType\DynamicEntityReferenceFieldItemList $field */
+    $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/Tests/DynamicEntityReferenceFieldTest.php b/src/Tests/DynamicEntityReferenceFieldTest.php
index 72be5f7..67dbdc7 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();
 
   }
 
@@ -107,7 +116,9 @@ class DynamicEntityReferenceFieldTest extends EntityUnitTestBase {
     $violations = $entity->{$this->fieldName}->validate();
     $this->assertEqual($violations->count(), 0, 'Validation passes.');
 
-    $entity = entity_create($this->entityType, array('type' => $this->bundle));
+    $entity = $entity_manager
+      ->getStorage($this->entityType)
+      ->create(['type' => $this->bundle]);
     $entity->{$this->fieldName}->entity = $referenced_entity;
     $violations = $entity->{$this->fieldName}->validate();
     $this->assertEqual($violations->count(), 0, 'Validation passes.');
@@ -124,16 +135,26 @@ 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' => NULL)));
+    $this->assertEqual($violations[0]->getMessage(), t('The referenced entity type (%type) is not allowed for this field.', array('%type' => $entity->getEntityTypeId())));
 
-    // @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_manager
+      ->getStorage($this->referencedEntityType)
+      ->create(['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 bundle must be one of %bundles, the selected entity is of bundle %bundle.', array(
+      '%bundle' => 'dud',
+      '%bundles' => $this->bundle,
+    )));
   }
 
   /**
