diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index e0d7cd4..482bb7c 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -225,6 +225,11 @@ public function clearCachedDefinitions() {
     $this->clearCachedFieldDefinitions();
     $this->classNameEntityTypeMap = array();
     $this->handlers = array();
+    // Clear the field map here, as this is not necessary when just clearing
+    // field definitions, since we can update this on runtime for changing
+    // field definitions.
+    $this->fieldMap = array();
+    $this->fieldMapByFieldType = array();
   }
 
   /**
@@ -645,8 +650,10 @@ public function getFieldMap() {
         $this->fieldMap = $cache->data;
       }
       else {
-        // First, add all base fields, they are not explicitly tracked as they
-        // are available on all bundles.
+        // The field map is built in two steps. First, add all base fields, by
+        // looping over all fieldable entity types. They always exist for all
+        // bundles, and we do not expect to have so many different entity
+        // types for this to become a bottleneck.
         foreach ($this->getDefinitions() as $entity_type_id => $entity_type) {
           if ($entity_type->isSubclassOf('\Drupal\Core\Entity\FieldableEntityInterface')) {
             $bundles = array_keys($this->getBundleInfo($entity_type_id));
@@ -659,8 +666,13 @@ public function getFieldMap() {
           }
         }
 
-        // Add per-bundle field definitions based on the stored field bundle
-        // map.
+        // In the second step, the per-bundle fields are added, based on the
+        // persistent bundle field map stored in a key value collection. This
+        // data is managed in the EntityManager::onFieldDefinitionCreate()
+        // and EntityManager::onFieldDefinitionDelete() methods. This is done
+        // because the only alternative to get this information would be to
+        // loop over all bundles and call their field definitions, just to get
+        // the type and field names per bundle.
         $bundle_field_maps = $this->keyValueFactory->get('entity.definitions.bundle_field_map')->getAll();
         foreach ($bundle_field_maps as $entity_type_id => $bundle_field_map) {
           foreach ($bundle_field_map as $field_name => $map_entry) {
@@ -709,7 +721,9 @@ public function onFieldDefinitionCreate(FieldDefinitionInterface $field_definiti
     // Notify the storage about the new field.
     $this->getStorage($entity_type_id)->onFieldDefinitionCreate($field_definition);
 
+    // Update the bundle field map, used by EntityManager::getFieldMap().
     $bundle_field_map = $this->keyValueFactory->get('entity.definitions.bundle_field_map')->get($entity_type_id);
+
     if (!isset($bundle_field_map[$field_name])) {
       // This field did not exist yet, initialize it with the type and empty
       // bundle list.
@@ -724,7 +738,7 @@ public function onFieldDefinitionCreate(FieldDefinitionInterface $field_definiti
     $this->keyValueFactory->get('entity.definitions.bundle_field_map')->set($entity_type_id, $bundle_field_map);
     $this->cacheBackend->delete('entity_field_map');
 
-    // If the field map is initalized, update it as well, so that calls to it
+    // If the field map is initialized, update it as well, so that calls to it
     // do not have to rebuild it again.
     if ($this->fieldMap) {
       if (!isset($this->fieldMap[$entity_type_id][$field_name])) {
@@ -758,7 +772,9 @@ public function onFieldDefinitionDelete(FieldDefinitionInterface $field_definiti
     // Notify the storage about the field deletion.
     $this->getStorage($entity_type_id)->onFieldDefinitionDelete($field_definition);
 
+    // Update the bundle field map, used by EntityManager::getFieldMap().
     $bundle_field_map = $this->keyValueFactory->get('entity.definitions.bundle_field_map')->get($entity_type_id);
+
     // Unset the bundle. If there are no bundles left, remove the field from
     // the map.
     unset($bundle_field_map[$field_name]['bundles'][$bundle]);
@@ -767,7 +783,8 @@ public function onFieldDefinitionDelete(FieldDefinitionInterface $field_definiti
     }
     $this->keyValueFactory->get('entity.definitions.bundle_field_map')->set($entity_type_id, $bundle_field_map);
     $this->cacheBackend->delete('entity_field_map');
-    // If the field map is initalized, update it as well, so that calls to it
+
+    // If the field map is initialized, update it as well, so that calls to it
     // do not have to rebuild it again.
     if ($this->fieldMap) {
       unset($this->fieldMap[$entity_type_id][$field_name]['bundles'][$bundle]);
@@ -821,8 +838,6 @@ public function clearCachedFieldDefinitions() {
     $this->baseFieldDefinitions = array();
     $this->fieldDefinitions = array();
     $this->fieldStorageDefinitions = array();
-    $this->fieldMap = array();
-    $this->fieldMapByFieldType = array();
     $this->displayModeInfo = array();
     $this->extraFields = array();
     Cache::invalidateTags(array('entity_field_info'));
