diff --git a/config/schema/entity_reference_validators.schema.yml b/config/schema/entity_reference_validators.schema.yml
index 7b28556..23f9c29 100644
--- a/config/schema/entity_reference_validators.schema.yml
+++ b/config/schema/entity_reference_validators.schema.yml
@@ -5,3 +5,6 @@ field.field.*.*.*.third_party.entity_reference_validators:
     circular_reference:
       type: boolean
       label: 'Prevent entity from referencing itself'
+    duplicate_reference:
+      type: boolean
+      label: 'Prevent entity from referencing duplicates'
diff --git a/entity_reference_validators.module b/entity_reference_validators.module
index f7dc7a9..ca589b0 100644
--- a/entity_reference_validators.module
+++ b/entity_reference_validators.module
@@ -17,6 +17,9 @@ function entity_reference_validators_entity_bundle_field_info_alter(&$fields, \D
     if ($field instanceof ThirdPartySettingsInterface && $field->getThirdPartySetting('entity_reference_validators', 'circular_reference', FALSE)) {
       $field->addConstraint('CircularReference');
     }
+    if ($field instanceof ThirdPartySettingsInterface && $field->getThirdPartySetting('entity_reference_validators', 'duplicate_reference', FALSE)) {
+      $field->addConstraint('DuplicateReference');
+    }
   }
 }
 
@@ -28,8 +31,7 @@ function entity_reference_validators_form_field_config_edit_form_alter(array &$f
   $field = $form_state->getFormObject()->getEntity();
 
   if ($field->getType() === 'entity_reference' && $field instanceof ThirdPartySettingsInterface
-    // Only add circular reference when the target type is the same as the
-    // field's.
+    // Only add references when the target type is the same as the field's.
     && $field->getTargetEntityTypeId() === $field->getItemDefinition()->getSetting('target_type')
   ) {
     $form['third_party_settings']['entity_reference_validators']['container'] = [
@@ -43,5 +45,11 @@ function entity_reference_validators_form_field_config_edit_form_alter(array &$f
       '#default_value' => $field->getThirdPartySetting('entity_reference_validators', 'circular_reference', FALSE),
       '#parents' => ['third_party_settings', 'entity_reference_validators', 'circular_reference'],
     ];
+    $form['third_party_settings']['entity_reference_validators']['container']['duplicate_reference'] = [
+      '#type' => 'checkbox',
+      '#title' => t('Prevent entity from referencing duplicates'),
+      '#default_value' => $field->getThirdPartySetting('entity_reference_validators', 'duplicate_reference', FALSE),
+      '#parents' => ['third_party_settings', 'entity_reference_validators', 'duplicate_reference'],
+    ];
   }
 }
diff --git a/src/Plugin/Validation/Constraint/DuplicateReferenceConstraint.php b/src/Plugin/Validation/Constraint/DuplicateReferenceConstraint.php
new file mode 100644
index 0000000..bc61b48
--- /dev/null
+++ b/src/Plugin/Validation/Constraint/DuplicateReferenceConstraint.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Drupal\entity_reference_validators\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Entity Reference duplicate reference constraint.
+ *
+ * Verifies that referenced entities do not duplicate a previous reference.
+ *
+ * @Constraint(
+ *   id = "DuplicateReference",
+ *   label = @Translation("Entity Reference duplicate reference", context = "Validation")
+ * )
+ */
+class DuplicateReferenceConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'This entity (%type: %id) is already referenced.';
+
+}
diff --git a/src/Plugin/Validation/Constraint/DuplicateReferenceConstraintValidator.php b/src/Plugin/Validation/Constraint/DuplicateReferenceConstraintValidator.php
new file mode 100644
index 0000000..27a6a74
--- /dev/null
+++ b/src/Plugin/Validation/Constraint/DuplicateReferenceConstraintValidator.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Drupal\entity_reference_validators\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Checks if referenced entities are valid.
+ */
+class DuplicateReferenceConstraintValidator extends ConstraintValidator {
+
+  /**
+   * The selection plugin manager.
+   *
+   * @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface
+   */
+  protected $selectionManager;
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($value, Constraint $constraint) {
+    /** @var \Drupal\Core\Field\FieldItemListInterface $value */
+    /** @var DuplicateReferenceConstraint $constraint */
+    if (!isset($value)) {
+      return;
+    }
+
+    $entity = $value->getEntity();
+    if (!isset($entity) || $entity->isNew()) {
+      return;
+    }
+
+    $referenced_ids = [];
+    foreach ($value as $delta => $item) {
+      $id = $item->target_id;
+      // '0' or NULL are considered valid empty references.
+      if (empty($id)) {
+        continue;
+      }
+
+      // Collect all referenced IDs.
+      $referenced_ids[] = $item->entity->id();
+    }
+
+    // Count values to find duplicates.
+    $occurrences = array_count_values($referenced_ids);
+
+    foreach ($value as $delta => $item) {
+      $id = $item->target_id;
+      // '0' or NULL are considered valid empty references.
+      if (empty($id)) {
+        continue;
+      }
+      /* @var \Drupal\Core\Entity\FieldableEntityInterface $referenced_entity */
+      $referenced_entity = $item->entity;
+
+      if ($occurrences[$referenced_entity->id()] > 1) {
+        $this->context->buildViolation($constraint->message)
+          ->setParameter('%type', $referenced_entity->getEntityTypeId())
+          ->setParameter('%id', $referenced_entity->id())
+          ->setInvalidValue($referenced_entity)
+          ->atPath((string) $delta . '.target_id')
+          ->addViolation();
+      }
+    }
+  }
+
+}
