diff --git a/core/modules/path/lib/Drupal/path/Plugin/DataType/PathItem.php b/core/modules/path/lib/Drupal/path/Plugin/DataType/PathItem.php
index e72e3a7..18be112 100644
--- a/core/modules/path/lib/Drupal/path/Plugin/DataType/PathItem.php
+++ b/core/modules/path/lib/Drupal/path/Plugin/DataType/PathItem.php
@@ -33,7 +33,7 @@ class PathItem extends FieldItemBase {
   static $propertyDefinitions;
 
   /**
-   * Implements \Drupal\Core\TypedData\ComplexDataInterface::getPropertyDefinitions().
+   * {@inheritdoc}
    */
   public function getPropertyDefinitions() {
     if (!isset(static::$propertyDefinitions)) {
@@ -49,4 +49,57 @@ public function getPropertyDefinitions() {
     return static::$propertyDefinitions;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function preSave() {
+    $this->alias = trim($this->alias);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function insert() {
+    if ($this->alias) {
+      $entity = $this->getParent()->getParent();
+
+      // Ensure fields for programmatic executions.
+      $uri = $entity->uri();
+      $langcode = $entity->language()->id;
+
+      if ($path = \Drupal::service('path.crud')->save($uri['path'], $this->alias, $langcode)) {
+        $this->pid = $path['pid'];
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function update() {
+    // Delete old alias if user erased it.
+    if ($this->pid && !$this->alias) {
+      \Drupal::service('path.crud')->delete(array('pid' => $this->pid));
+    }
+    // Only save a non-empty alias.
+    elseif ($this->alias) {
+      $entity = $this->getParent()->getParent();
+
+      // Ensure fields for programmatic executions.
+      $uri = $entity->uri();
+      $langcode = $entity->language()->id;
+
+      \Drupal::service('path.crud')->save($uri['path'], $this->alias, $langcode, $this->pid);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function delete() {
+    // Delete all aliases associated with this entity.
+    $uri = $this->getParent()->getParent()->uri();
+    \Drupal::service('path.crud')->delete(array('source' => $uri['path']));
+  }
+
 }
diff --git a/core/modules/path/path.module b/core/modules/path/path.module
index a6d7fbd..9945981 100644
--- a/core/modules/path/path.module
+++ b/core/modules/path/path.module
@@ -225,64 +225,12 @@ function path_entity_field_info($entity_type) {
     $info['definitions']['path'] = array(
       'type' => 'path_field',
       'label' => t('The path alias'),
-      'computed' => TRUE,
-      'list' => TRUE,
     );
     return $info;
   }
 }
 
 /**
- * Implements hook_entity_insert().
- *
- * @todo: Move this to methods on the FieldItem class.
- */
-function path_entity_insert(EntityInterface $entity) {
-  if ($entity->getPropertyDefinition('path')) {
-    $entity->path->alias = trim($entity->path->alias);
-    // Only save a non-empty alias.
-    if (!empty($entity->path->alias)) {
-      // Ensure fields for programmatic executions.
-      $uri = $entity->uri();
-      $langcode = $entity->language()->id;
-      Drupal::service('path.crud')->save($uri['path'], $entity->path->alias, $langcode);
-    }
-  }
-}
-
-/**
- * Implements hook_entity_update().
- */
-function path_entity_update(EntityInterface $entity) {
-  if ($entity->getPropertyDefinition('path')) {
-    $entity->path->alias = trim($entity->path->alias);
-    // Delete old alias if user erased it.
-    if ($entity->path->pid && !$entity->path->alias) {
-      Drupal::service('path.crud')->delete(array('pid' => $entity->path->pid));
-    }
-    // Only save a non-empty alias.
-    if ($entity->path->alias) {
-      $pid = $entity->path->pid;
-      // Ensure fields for programmatic executions.
-      $uri = $entity->uri();
-      $langcode = $entity->language()->id;
-      Drupal::service('path.crud')->save($uri['path'], $entity->path->alias, $langcode, $pid);
-    }
-  }
-}
-
-/**
- * Implements hook_entity_predelete().
- */
-function path_entity_predelete(EntityInterface $entity) {
-  if ($entity->getPropertyDefinition('path')) {
-    // Delete all aliases associated with this term.
-    $uri = $entity->uri();
-    Drupal::service('path.crud')->delete(array('source' => $uri['path']));
-  }
-}
-
-/**
  * Implements hook_library_info().
  */
 function path_library_info() {
