diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php
index 0064c4c..7457533 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php
@@ -106,6 +106,10 @@ public function testFilledStandardUpgrade() {
       $this->assertTrue(isset($entity_view_modes['full']));
     }
 
+    // Ensure that taxonomy terms have a 'changed' timestamp.
+    $term = entity_load('taxonomy_term', 1);
+    $this->assertNotEqual($term->getChangedTime(), 0);
+
     // Check that user data has been migrated correctly.
     $query = db_query('SELECT * FROM {users_data}');
 
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php
index daeb3ac..da83581 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php
@@ -176,6 +176,14 @@ public static function postDelete(EntityStorageControllerInterface $storage_cont
   /**
    * {@inheritdoc}
    */
+  public function preSave(EntityStorageControllerInterface $storage_controller) {
+    // Before saving the term, set changed time.
+    $this->changed->value = REQUEST_TIME;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function postSave(EntityStorageControllerInterface $storage_controller, $update = TRUE) {
     // Only change the parents if a value is set, keep the existing values if
     // not.
@@ -241,7 +249,19 @@ public static function baseFieldDefinitions($entity_type) {
       'settings' => array('default_value' => 0),
       'computed' => TRUE,
     );
+    $properties['changed'] = array(
+      'label' => t('Changed'),
+      'description' => t('The time that the term was last edited.'),
+      'type' => 'integer_field',
+    );
     return $properties;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getChangedTime() {
+    return $this->changed->value;
+  }
+
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermInterface.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermInterface.php
index f9bb432..fa4b4ca 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermInterface.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermInterface.php
@@ -14,4 +14,12 @@
  */
 interface TermInterface extends ContentEntityInterface {
 
+  /**
+   * Returns the term modification timestamp.
+   *
+   * @return int
+   *   Term modification timestamp.
+   */
+  public function getChangedTime();
+
 }
diff --git a/core/modules/taxonomy/taxonomy.install b/core/modules/taxonomy/taxonomy.install
index 4d4c952..749e690 100644
--- a/core/modules/taxonomy/taxonomy.install
+++ b/core/modules/taxonomy/taxonomy.install
@@ -78,6 +78,12 @@ function taxonomy_schema() {
         'default' => 0,
         'description' => 'The weight of this term in relation to other terms.',
       ),
+      'changed' => array(
+        'description' => 'The Unix timestamp when the term was most recently saved.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
     ),
     'primary key' => array('tid'),
     'unique keys' => array(
@@ -386,3 +392,17 @@ function taxonomy_update_8007() {
     }
   }
 }
+
+/**
+ * Add a changed column for taxonomy terms.
+ */
+function taxonomy_update_8008() {
+  $spec = array(
+    'description' => 'The Unix timestamp when the term was most recently saved.',
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'initial' => REQUEST_TIME,
+  );
+  db_add_field('taxonomy_term_data', 'changed', $spec);
+}
diff --git a/core/modules/taxonomy/taxonomy.views.inc b/core/modules/taxonomy/taxonomy.views.inc
index 5646268..8064d25 100644
--- a/core/modules/taxonomy/taxonomy.views.inc
+++ b/core/modules/taxonomy/taxonomy.views.inc
@@ -176,6 +176,74 @@ function taxonomy_views_data() {
     ),
   );
 
+  $data['taxonomy_term_data']['changed'] = array(
+    'title' => t('Updated date'),
+    'help' => t('The date the term was last updated.'),
+    'field' => array(
+      'id' => 'date',
+    ),
+    'sort' => array(
+      'id' => 'date'
+    ),
+    'filter' => array(
+      'id' => 'date',
+    ),
+  );
+
+  $data['taxonomy_term_data']['changed_fulldate'] = array(
+    'title' => t('Updated date'),
+    'help' => t('Date in the form of CCYYMMDD.'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_fulldate',
+    ),
+  );
+
+  $data['taxonomy_term_data']['changed_year_month'] = array(
+    'title' => t('Updated year + month'),
+    'help' => t('Date in the form of YYYYMM.'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_year_month',
+    ),
+  );
+
+  $data['taxonomy_term_data']['changed_year'] = array(
+    'title' => t('Updated year'),
+    'help' => t('Date in the form of YYYY.'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_year',
+    ),
+  );
+
+  $data['taxonomy_term_data']['changed_month'] = array(
+    'title' => t('Updated month'),
+    'help' => t('Date in the form of MM (01 - 12).'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_month',
+    ),
+  );
+
+  $data['taxonomy_term_data']['changed_day'] = array(
+    'title' => t('Updated day'),
+    'help' => t('Date in the form of DD (01 - 31).'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_day',
+    ),
+  );
+
+  $data['taxonomy_term_data']['changed_week'] = array(
+    'title' => t('Updated week'),
+    'help' => t('Date in the form of WW (01 - 53).'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_week',
+    ),
+  );
+
   // Content translation field.
   if (Drupal::moduleHandler()->moduleExists('content_translation')) {
     $data['taxonomy_term_data']['translation_link'] = array(
