diff --git a/core/lib/Drupal/Core/Entity/EntityStorageBase.php b/core/lib/Drupal/Core/Entity/EntityStorageBase.php
index f10eba9..efe9dcb 100644
--- a/core/lib/Drupal/Core/Entity/EntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/EntityStorageBase.php
@@ -408,6 +408,11 @@ public function save(EntityInterface $entity) {
 
     unset($entity->original);
 
+    if (!$is_new) {
+      // Reset the static cache when updating an entity.
+      $this->resetCache(array($id));
+    }
+
     return $return;
   }
 
diff --git a/core/lib/Drupal/Core/Session/UserSession.php b/core/lib/Drupal/Core/Session/UserSession.php
index da4f26d..79c0364 100644
--- a/core/lib/Drupal/Core/Session/UserSession.php
+++ b/core/lib/Drupal/Core/Session/UserSession.php
@@ -141,15 +141,7 @@ public function hasPermission($permission) {
       return TRUE;
     }
 
-    $roles = \Drupal::entityManager()->getStorage('user_role')->loadMultiple($this->getRoles());
-
-    foreach ($roles as $role) {
-      if ($role->hasPermission($permission)) {
-        return TRUE;
-      }
-    }
-
-    return FALSE;
+    return $this->getRoleStorage()->isPermissionInRoles($permission, $this->getRoles());
   }
 
   /**
@@ -250,4 +242,15 @@ public function getHostname() {
     return $this->hostname;
   }
 
+  /**
+   * @return \Drupal\user\RoleStorageInterface
+   *   The role storage object.
+   */
+  protected function getRoleStorage() {
+    if (!isset($this->roleStorage)) {
+      $this->roleStorage = \Drupal::entityManager()->getStorage('user_role');
+    }
+    return $this->roleStorage;
+  }
+
 }
diff --git a/core/modules/user/src/Entity/Role.php b/core/modules/user/src/Entity/Role.php
index b517ac9..acf3d39 100644
--- a/core/modules/user/src/Entity/Role.php
+++ b/core/modules/user/src/Entity/Role.php
@@ -28,6 +28,7 @@
  *   },
  *   admin_permission = "administer permissions",
  *   config_prefix = "role",
+ *   static_cache = TRUE,
  *   entity_keys = {
  *     "id" = "id",
  *     "weight" = "weight",
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index d6cfe96..7388069 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -244,15 +244,7 @@ public function hasPermission($permission) {
       return TRUE;
     }
 
-    $roles = \Drupal::entityManager()->getStorage('user_role')->loadMultiple($this->getRoles());
-
-    foreach ($roles as $role) {
-      if ($role->hasPermission($permission)) {
-        return TRUE;
-      }
-    }
-
-    return FALSE;
+    return $this->getRoleStorage()->isPermissionInRoles($permission, $this->getRoles());
   }
 
   /**
@@ -536,4 +528,14 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     return $fields;
   }
 
+  /**
+   * @return \Drupal\user\RoleStorageInterface
+   *   The role storage object.
+   */
+  protected function getRoleStorage() {
+    if (!isset($this->roleStorage)) {
+      $this->roleStorage = \Drupal::entityManager()->getStorage('user_role');
+    }
+    return $this->roleStorage;
+  }
 }
diff --git a/core/modules/user/src/RoleStorage.php b/core/modules/user/src/RoleStorage.php
index c875c93..a9a3dca 100644
--- a/core/modules/user/src/RoleStorage.php
+++ b/core/modules/user/src/RoleStorage.php
@@ -14,6 +14,18 @@
  */
 class RoleStorage extends ConfigEntityStorage implements RoleStorageInterface {
 
+  public function isPermissionInRoles($permission, $role_names) {
+    $has_permission = FALSE;
+    foreach ($this->loadMultiple($role_names) as $role) {
+      if ($role->hasPermission($permission)) {
+        $has_permission = TRUE;
+        break;
+      }
+    }
+
+    return $has_permission;
+  }
+
   /**
    * {@inheritdoc}
    */
