diff --git a/core/modules/block_content/src/BlockContentForm.php b/core/modules/block_content/src/BlockContentForm.php
index ec267cc..088c4d7 100644
--- a/core/modules/block_content/src/BlockContentForm.php
+++ b/core/modules/block_content/src/BlockContentForm.php
@@ -220,20 +220,4 @@ public function save(array $form, FormStateInterface $form_state) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function validateForm(array &$form, FormStateInterface $form_state) {
-    $entity = parent::validateForm($form, $form_state);
-    if ($entity->isNew()) {
-      $exists = $this->blockContentStorage->loadByProperties(array('info' => $form_state->getValue(['info', 0, 'value'])));
-      if (!empty($exists)) {
-        $form_state->setErrorByName('info', $this->t('A block with description %name already exists.', array(
-          '%name' => $form_state->getValue(array('info', 0, 'value')),
-        )));
-      }
-    }
-    return $entity;
-  }
-
 }
diff --git a/core/modules/block_content/src/Entity/BlockContent.php b/core/modules/block_content/src/Entity/BlockContent.php
index 4e186b9..e05923d 100644
--- a/core/modules/block_content/src/Entity/BlockContent.php
+++ b/core/modules/block_content/src/Entity/BlockContent.php
@@ -189,7 +189,9 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'type' => 'string_textfield',
         'weight' => -5,
       ))
-      ->setDisplayConfigurable('form', TRUE);
+      ->setDisplayConfigurable('form', TRUE)
+      ->addConstraint('BlockContentInfo', []);
+
 
     $fields['type'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Block type'))
diff --git a/core/modules/block_content/src/Plugin/Validation/Constraint/BlockContentInfoConstraint.php b/core/modules/block_content/src/Plugin/Validation/Constraint/BlockContentInfoConstraint.php
new file mode 100644
index 0000000..def6d8d
--- /dev/null
+++ b/core/modules/block_content/src/Plugin/Validation/Constraint/BlockContentInfoConstraint.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\block_content\Plugin\Validation\Constraint\BlockContentInfoConstraint.
+ */
+
+namespace Drupal\block_content\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Supports validating custom block names.
+ *
+ * @Constraint(
+ *   id = "BlockContentInfo",
+ *   label = @Translation("Custom block name", context = "Validation")
+ * )
+ */
+class BlockContentInfoConstraint extends Constraint {
+
+  public $message = 'A block with description %value already exists.';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validatedBy() {
+    return '\Drupal\Core\Validation\Plugin\Validation\Constraint\UniqueFieldValueValidator';
+  }
+
+}
diff --git a/core/modules/block_content/src/Tests/BlockContentValidationTest.php b/core/modules/block_content/src/Tests/BlockContentValidationTest.php
new file mode 100644
index 0000000..85bf6e9
--- /dev/null
+++ b/core/modules/block_content/src/Tests/BlockContentValidationTest.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\block_content\Tests\BlockContentValidationTest.
+ */
+
+namespace Drupal\block_content\Tests;
+
+/**
+ * Tests block content validation constraints.
+ *
+ * @group block_content
+ */
+class BlockContentValidationTest extends BlockContentTestBase {
+
+  /**
+   * Tests the block content validation constraints.
+   */
+  public function testValidation() {
+    // Add a block.
+    $description = $this->randomMachineName();
+    $block = $this->createBlockContent($description, 'basic', FALSE);
+    // Validate the block.
+    $violations = $block->validate();
+    // Make sure we have no violations.
+    $this->assertEqual(count($violations), 0);
+    // Save the block.
+    $block->save();
+
+    // Add another block with the same description.
+    $block = $this->createBlockContent($description, 'basic', FALSE);
+    // Validate this block.
+    $violations = $block->validate();
+    // Make sure we have 1 violation.
+    $this->assertEqual(count($violations), 1);
+    // Make sure the violation is on the info property
+    $this->assertEqual($violations[0]->getPropertyPath(), 'info');
+    // Make sure the message is correct.
+    $this->assertEqual($violations[0]->getMessage(), format_string('A block with description %value already exists.', [
+      '%value' => $block->label(),
+    ]));
+  }
+
+}
