diff --git a/core/lib/Drupal/Core/Field/FieldItemBase.php b/core/lib/Drupal/Core/Field/FieldItemBase.php
index d489c8e..2d60a1e 100644
--- a/core/lib/Drupal/Core/Field/FieldItemBase.php
+++ b/core/lib/Drupal/Core/Field/FieldItemBase.php
@@ -134,14 +134,21 @@ protected function writePropertyValue($property_name, $value) {
    * {@inheritdoc}
    */
   public function __get($name) {
-    // There is either a property object or a plain value - possibly for a
-    // not-defined property. If we have a plain value, directly return it.
+    // If the property has been instantiated already, return its value.
     if (isset($this->properties[$name])) {
       return $this->properties[$name]->getValue();
     }
+    // If the property has not been instantiated, return its plain value if we
+    // have one.
     elseif (isset($this->values[$name])) {
       return $this->values[$name];
     }
+    // Instantiate the property if it exists, and return its value. We do this
+    // last, because property instantiation is often slower than the previous
+    // retrieval methods.
+    elseif ($this->definition->getPropertyDefinition($name)) {
+      return $this->get($name)->getValue();
+    }
   }
 
   /**
diff --git a/core/modules/taxonomy/tests/src/Kernel/Migrate/d7/MigrateTaxonomyTermTest.php b/core/modules/taxonomy/tests/src/Kernel/Migrate/d7/MigrateTaxonomyTermTest.php
index fbcc129..203bd0f 100644
--- a/core/modules/taxonomy/tests/src/Kernel/Migrate/d7/MigrateTaxonomyTermTest.php
+++ b/core/modules/taxonomy/tests/src/Kernel/Migrate/d7/MigrateTaxonomyTermTest.php
@@ -22,6 +22,7 @@ class MigrateTaxonomyTermTest extends MigrateDrupal7TestBase {
     'taxonomy',
     'telephone',
     'text',
+    'filter',
   ];
 
   /**
diff --git a/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerNodeTest.php b/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerNodeTest.php
index d72f13d..da58957 100644
--- a/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerNodeTest.php
+++ b/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerNodeTest.php
@@ -19,6 +19,7 @@ class MigrateTrackerNodeTest extends MigrateDrupal7TestBase {
     'node',
     'text',
     'tracker',
+    'filter',
   ];
 
   /**
diff --git a/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerUserTest.php b/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerUserTest.php
index e3ed88e..5545958 100644
--- a/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerUserTest.php
+++ b/core/modules/tracker/tests/src/Kernel/Migrate/d7/MigrateTrackerUserTest.php
@@ -19,6 +19,7 @@ class MigrateTrackerUserTest extends MigrateDrupal7TestBase {
     'node',
     'text',
     'tracker',
+    'filter',
   ];
 
   /**
diff --git a/core/tests/Drupal/Tests/Core/Field/FieldItemBaseTest.php b/core/tests/Drupal/Tests/Core/Field/FieldItemBaseTest.php
new file mode 100644
index 0000000..ed1e90b
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Field/FieldItemBaseTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\Tests\Core\Field;
+
+use Drupal\Core\Field\FieldItemBase;
+use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
+use Drupal\Core\TypedData\TypedDataInterface;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Field\FieldItemBase
+ * @group Field
+ */
+class FieldItemBaseTest extends UnitTestCase {
+
+  /**
+   * Tests calling __get() without values being set.
+   *
+   * @covers ::__get
+   */
+  public function testGetWithOutValues() {
+    $data_definition = $this->prophesize(ComplexDataDefinitionInterface::class);
+    $data_definition->getPropertyDefinitions()
+      ->shouldBeCalled()
+      ->willReturn([]);
+    $data_definition->getPropertyDefinition('property-name')
+      ->shouldBeCalled()
+      ->willReturn($this->prophesize(DataDefinitionInterface::class)->reveal());
+    $fieldItem = $this->getMockForAbstractClass(
+      FieldItemBase::class,
+      // Constructor array.
+      [
+        $data_definition->reveal(),
+        'field-name',
+        NULL,
+      ],
+      '',
+      TRUE,
+      TRUE,
+      TRUE,
+      ['get']
+    );
+    $typed_data = $this->prophesize(TypedDataInterface::class);
+    $typed_data->getValue()
+      ->shouldBeCalled()
+      ->willReturn('property-value');
+    $fieldItem->expects($this->once())
+      ->method('get')->with('property-name')->will($this->returnValue($typed_data->reveal()));
+    $this->assertEquals('property-value', $fieldItem->__get('property-name'));
+  }
+
+  /**
+   * Tests calling __get() with values being set.
+   *
+   * @covers ::__get
+   */
+  public function testGetWithValues() {
+    $data_definition = $this->prophesize(ComplexDataDefinitionInterface::class);
+    $data_definition->getPropertyDefinitions()
+      ->shouldBeCalled()
+      ->willReturn([]);
+    $fieldItem = $this->getMockForAbstractClass(
+      FieldItemBase::class,
+      // Constructor array.
+      [
+        $data_definition->reveal(),
+        'field-name',
+        NULL,
+      ]
+    );
+    $fieldItem->setValue(['property-name' => 'property-value']);
+    $this->assertEquals('property-value', $fieldItem->__get('property-name'));
+  }
+
+}
