diff --git a/core/lib/Drupal/Core/Entity/ContentEntityForm.php b/core/lib/Drupal/Core/Entity/ContentEntityForm.php
index 8722a9c..89e797f 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityForm.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityForm.php
@@ -59,7 +59,9 @@ public function form(array $form, array &$form_state) {
   public function validate(array $form, array &$form_state) {
     $this->updateFormLangcode($form_state);
     $entity = $this->buildEntity($form, $form_state);
-    $this->getFormDisplay($form_state)->validateFormValues($entity, $form, $form_state);
+    $violations = $entity->validate();
+
+    $this->flagViolations($violations);
 
     // @todo Remove this.
     // Execute legacy global validation handlers.
diff --git a/core/modules/entity/src/Entity/EntityFormDisplay.php b/core/modules/entity/src/Entity/EntityFormDisplay.php
index 8365032..4145779 100644
--- a/core/modules/entity/src/Entity/EntityFormDisplay.php
+++ b/core/modules/entity/src/Entity/EntityFormDisplay.php
@@ -211,7 +211,22 @@ public function extractFormValues(ContentEntityInterface $entity, array &$form,
   /**
    * {@inheritdoc}
    */
+   public function flagViolations(ConstraintViolationListInterface $violations, array &$form, array &$form_state) {
+
+    foreach ($violations as $violation) {
+      $violation_property_path = $violation->getPropertyPath(); //returns something like body.value
+      //get the first part of the property path to map the form element and set form error on it
+    }
+
+   }
+  // @todo Remove validateFormValues and refactor to use flagViolations
+
+  /**
+   * {@inheritdoc}
+   */
   public function validateFormValues(ContentEntityInterface $entity, array &$form, array &$form_state) {
+
+
     foreach ($entity as $field_name => $items) {
       // Only validate the fields that actually appear in the form, and let the
       // widget assign the violations to the right form elements.
