diff --git a/core/modules/shortcut/src/Entity/Shortcut.php b/core/modules/shortcut/src/Entity/Shortcut.php
index 91a7f0b..a6c2ff3 100644
--- a/core/modules/shortcut/src/Entity/Shortcut.php
+++ b/core/modules/shortcut/src/Entity/Shortcut.php
@@ -228,6 +228,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setLabel(t('Path'))
       ->setDescription(t('The computed shortcut path.'))
       ->setComputed(TRUE)
+      ->addConstraint('ShortcutPath', [])
       ->setCustomStorage(TRUE);
 
     $item_definition = $fields['path']->getItemDefinition();
diff --git a/core/modules/shortcut/src/Plugin/Validation/Constraint/ShortcutPathConstraint.php b/core/modules/shortcut/src/Plugin/Validation/Constraint/ShortcutPathConstraint.php
new file mode 100644
index 0000000..7957fab
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/Validation/Constraint/ShortcutPathConstraint.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\shortcut\Plugin\Validation\Constraint\ShortcutPathConstraint.
+ */
+
+namespace Drupal\shortcut\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Validates the path of a shortcut entry
+ *
+ * @Plugin(
+ *   id = "ShortcutPath",
+ *   label = @Translation("Shortcut path", context = "Validation"),
+ *   type = { "entity" }
+ * )
+ */
+class ShortcutPathConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'The shortcut must correspond to a valid path on the site.';
+
+}
diff --git a/core/modules/shortcut/src/Plugin/Validation/Constraint/ShortcutPathConstraintValidator.php b/core/modules/shortcut/src/Plugin/Validation/Constraint/ShortcutPathConstraintValidator.php
new file mode 100644
index 0000000..5aaccca
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/Validation/Constraint/ShortcutPathConstraintValidator.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\shortcut\Plugin\Validation\Constraint\ShortcutPathConstraintValidator.
+ */
+
+namespace Drupal\shortcut\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates the shortcut path.
+ */
+class ShortcutPathConstraintValidator extends ConstraintValidator {
+
+  /**
+   * The path validator.
+   *
+   * @var \Drupal\Core\Path\PathValidatorInterface
+   */
+  protected $pathValidator;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($items, Constraint $constraint) {
+    // We cannot use $items here because this is a computed field, we need to
+    // fetch the value direct from TypedData.
+    $list = $this->context->getMetadata()->getTypedData();
+    if (empty($list)) {
+      return;
+    }
+    $value = $list->value;
+
+    if (!$this->pathValidator()->isValid($value)) {
+      $this->context->addViolation($constraint->message);
+    }
+  }
+
+  /**
+   * Gets the path validator.
+   *
+   * @return \Drupal\Core\Path\PathValidatorInterface
+   */
+  protected function pathValidator() {
+    if (!isset($this->pathValidator)) {
+      $this->pathValidator = \Drupal::pathValidator();
+    }
+    return $this->pathValidator;
+  }
+
+}
diff --git a/core/modules/shortcut/src/ShortcutForm.php b/core/modules/shortcut/src/ShortcutForm.php
index 60796f8..b6fc8cf 100644
--- a/core/modules/shortcut/src/ShortcutForm.php
+++ b/core/modules/shortcut/src/ShortcutForm.php
@@ -26,34 +26,6 @@ class ShortcutForm extends ContentEntityForm {
   protected $entity;
 
   /**
-   * The path validator.
-   *
-   * @var \Drupal\Core\Path\PathValidatorInterface
-   */
-  protected $pathValidator;
-
-  /**
-   * Constructs a new ShortcutForm instance.
-   *
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager
-   * @param \Drupal\Core\Path\PathValidatorInterface $path_validator
-   *   The path validator.
-   */
-  public function __construct(EntityManagerInterface $entity_manager, PathValidatorInterface $path_validator) {
-    parent::__construct($entity_manager);
-
-    $this->pathValidator = $path_validator;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static($container->get('entity.manager'), $container->get('path.validator'));
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function form(array $form, FormStateInterface $form_state) {
@@ -88,11 +60,14 @@ public function buildEntity(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function validate(array $form, FormStateInterface $form_state) {
-    if (!$this->pathValidator->isValid($form_state->getValue('path'))) {
-      $form_state->setErrorByName('path', $this->t('The shortcut must correspond to a valid path on the site.'));
-    }
-
     parent::validate($form, $form_state);
+
+    $this->entity->path->value = $form_state->getValue('path');
+    /** @var \Symfony\Component\Validator\ConstraintViolationListInterface $result */
+    $result = $this->entity->path->validate();
+    if ($result->count()) {
+      $form_state->setErrorByName('path', $result->offsetGet(0)->getMessage());
+    }
   }
 
   /**
diff --git a/core/modules/shortcut/src/Tests/ShortcutValidationTest.php b/core/modules/shortcut/src/Tests/ShortcutValidationTest.php
new file mode 100644
index 0000000..8f8fd5c
--- /dev/null
+++ b/core/modules/shortcut/src/Tests/ShortcutValidationTest.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\shortcut\Tests\ShortcutValidationTest.
+ */
+
+namespace Drupal\shortcut\Tests;
+
+use Drupal\shortcut\Entity\Shortcut;
+use Drupal\system\Tests\Entity\EntityUnitTestBase;
+
+/**
+ * Tests shortcut validation constraints.
+ *
+ * @group shortcut
+ */
+class ShortcutValidationTest extends EntityUnitTestBase {
+
+  /**
+   * Modules to install.
+   *
+   * @var array
+   */
+  public static $modules = array('shortcut', 'node');
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installSchema('system', ['url_alias', 'router']);
+    $this->installEntitySchema('shortcut');
+    $this->installEntitySchema('shortcut_set');
+    $this->installConfig(['shortcut']);
+  }
+
+  /**
+   * Tests the shortcut validation constraints.
+   */
+  public function testValidation() {
+    // Add shortcut.
+    $shortcut = Shortcut::create(array(
+      'shortcut_set' => 'default',
+      'title' => t('Add content'),
+      'weight' => -20,
+      'path' => '<front>',
+    ));
+
+    $violations = $shortcut->path->validate();
+    $this->assertEqual(count($violations), 0);
+
+    $shortcut->set('path', 'does/not/exist');
+    $violations = $shortcut->path->validate();
+
+    $this->assertEqual(count($violations), 1);
+    $this->assertEqual($violations[0]->getMessage(), t('The shortcut must correspond to a valid path on the site.'));
+  }
+
+}
